Использование запросов в аналитике трафика

В этой статье приведены примеры запросов Kusto Query Language (KQL), которые помогут эффективно анализировать данные аналитики трафика. Аналитика трафика обрабатывает журналы потоков виртуальной сети и журналы потоков группы безопасности сети (NSG), чтобы получить подробные сведения о шаблонах сетевого трафика, событиях безопасности и метрик производительности.

Используйте следующие запросы:

  • Определение шаблонов сетевого трафика и основных конечных точек обмена данными
  • Мониторинг событий безопасности и анализ потенциальных угроз
  • Устранение неполадок с сетевым подключением
  • Оптимизация производительности сети и использования ресурсов

Предпосылки

Запросы NTANetAnalytics

В этом разделе приведены примеры запросов для таблицы NTANetAnalytics , которую можно использовать для анализа данных аналитики трафика виртуальной сети. Таблица NTANetAnalytics содержит агрегированные данные журнала потоков с расширенными сведениями о сетевой аналитике. Дополнительные сведения о схеме таблицы и доступных полях см. в разделе NTANetAnalytics.

Вывод списка подсетей, взаимодействующих с общедоступными IP-адресами

Используйте следующий запрос для перечисления всех подсетей, взаимодействующих с общедоступными IP-адресами Azure за последние 30 дней.

NTANetAnalytics
| where SubType == "FlowLog" and FlowStartTime > ago(30d) and FlowType == "ExternalPublic"
| project SrcSubnet, DestSubnet

Вывод списка подсетей, взаимодействующих друг с другом

Используйте следующий запрос, чтобы перечислить все подсети, обменившие трафик друг с другом за последние 30 дней, и общий обмен байтами.

NTANetAnalytics
| where SubType == 'FlowLog' and FaSchemaVersion == '3' and TimeGenerated > ago(30d)
| where isnotempty(SrcSubnet) and isnotempty(DestSubnet)
| summarize TotalBytes=sum(BytesSrcToDest + BytesDestToSrc) by SrcSubnet, DestSubnet,L4Protocol,DestPort

Просмотр межрегионного трафика

Используйте следующий запрос, чтобы просмотреть внутрирегиональная и межрегиональная трафик за последние 30 дней.

NTANetAnalytics
| where TimeGenerated > ago(30d)
| project SrcRegion, DestRegion, BytesDestToSrc, BytesSrcToDest
| where isnotempty(SrcRegion) and isnotempty(DestRegion)
| summarize TransferredBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcRegion, DestRegion

Просмотр трафика на основе подписки

Используйте следующий запрос для просмотра трафика Azure, сгруппированного по подпискам за последние 30 дней.

NTANetAnalytics
| where TimeGenerated > ago(30d)
| project SrcSubscription, DestSubscription, BytesDestToSrc, BytesSrcToDest
| where isnotempty(SrcSubscription) and isnotempty(DestSubscription)
| summarize TransferredBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcSubscription, DestSubscription

Вывод списка виртуальных машин, получающих большую часть локального трафика

Используйте следующий запрос, чтобы проверить, какие виртуальные машины получают большую часть локального трафика.

NTANetAnalytics 
| where SubType == "FlowLog" and FlowType == "S2S"  
| where <Scoping condition> 
| mvexpand vm = pack_array(SrcVm, DestVm) to typeof(string) 
| where isnotempty(vm)  
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime from datetime(<time>) to datetime(<time>) step 1m by vm 
| render timechart

Вывод списка IP-адресов, получающих большую часть локального трафика

Используйте следующий запрос, чтобы проверить, какие IP-адреса получают большинство локальных трафика.

NTANetAnalytics 
| where SubType == "FlowLog" and FlowType == "S2S"  
| where <Scoping condition> 
| mvexpand vm = pack_array(SrcIp, DestIp) to typeof(string) 
| where isnotempty(vm)  
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime from datetime(<time>) to datetime(<time>) step 1m by vm 
| render timechart

Вывод списка IP-адресов, отправляющих или получающих трафик на виртуальную машину или из нее

Используйте следующий запрос, чтобы перечислить все IP-адреса, которые обменялись данными с виртуальной машиной с помощью IP-адреса за последние 30 дней.

NTANetAnalytics
| where TimeGenerated > ago(30d)
| where SrcIp == "10.1.1.8" and strlen(DestIp)>0
| summarize TotalBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcIp, DestIp

Просмотр трафика ExpressRoute

Используйте следующий запрос для просмотра трафика через подключения ExpressRoute за последние 30 дней.

NTANetAnalytics
| where SubType == 'FlowLog' and TimeGenerated > ago(30d)
| where isnotnull(SrcExpressRouteCircuit) or isnotnull(DestExpressRouteCircuit)
| extend TargetResourceName = tostring(split(TargetResourceId, "/")[2])
| summarize TotalBytes=sum(BytesSrcToDest + BytesDestToSrc) by TargetResourceName, bin(TimeGenerated, 1d)
| render columnchart

Просмотр распределения трафика подсистемы балансировки нагрузки

Используйте следующий запрос, чтобы просмотреть распределение трафика приложения с подсистемой балансировки нагрузки перед ним.

NTANetAnalytics
| where SubType == 'FlowLog' and TimeGenerated > ago(30d)
| where SrcLoadBalancer contains 'web' or DestLoadBalancer contains 'web'
| summarize TotalBytes = sum(BytesSrcToDest + BytesDestToSrc) by tostring(SrcIp)
| render piechart

Проверка стандартного отклонения трафика, полученного виртуальными машинами

Используйте следующий запрос, чтобы проверить стандартное отклонение трафика, полученного виртуальными машинами из локальных компьютеров.

NTANetAnalytics 
| where SubType == "FlowLog" and FlowType == "S2S"  
| where <Scoping condition> 
| mvexpand vm = pack_array(SrcVm, DestVm) to typeof(string) 
| where isnotempty(vm)  
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
summarize deviation = stdev(traffic) by vm

Проверка стандартного отклонения в трафике, полученного IP-адресами

Используйте следующий запрос, чтобы проверить стандартное отклонение трафика, полученного IP-адресами локальных компьютеров.

NTANetAnalytics 
| where SubType == "FlowLog" and FlowType == "S2S"  
| where <Scoping condition> 
| mvexpand vm = pack_array(SrcIp, DestIp) to typeof(string) 
| where isnotempty(vm)  
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
| summarize deviation = stdev(traffic) by IP

Запросы NTAIpDetails

В этом разделе приведены примеры запросов для таблицы NTAIpDetails , которую можно использовать для анализа сведений о IP-адресах в данных аналитики трафика. Дополнительные сведения см. в разделе NTAIpDetails.

Просмотр типов потоков и общедоступных IP-адресов

Используйте следующий запрос, чтобы узнать о типах потоков и расположении общедоступных IP-адресов в данных аналитики трафика.

NTAIpDetails
| distinct FlowType, PublicIpDetails, Location

Просмотр типов вредоносных потоков

Используйте следующий запрос, чтобы просмотреть типы потоков в вредоносных потоках.

NTAIpDetails
| where TimeGenerated > ago(30d)
| where FlowType == "MaliciousFlow"
| summarize count() by ThreatType
| render piechart

запросы AzureNetworkAnalytics_CL

В этом разделе приведены примеры запросов для таблицы запросов AzureNetworkAnalytics_CL, которую можно использовать для анализа данных журналов потоков NSG аналитики трафика.

Вывод списка всех подсетей, взаимодействующих с общедоступными IP-адресами

Используйте следующий запрос для перечисления всех подсетей, взаимодействующих с общедоступными IP-адресами Azure за последние 30 дней.

AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowStartTime_t >= ago(30d) and FlowType_s == "ExternalPublic"
| project Subnet1_s, Subnet2_s  

Просмотр пути больших двоичных объектов для потоков, взаимодействующих с общедоступными IP-адресами

Используйте следующий запрос, чтобы просмотреть путь большого двоичного объекта для потоков в предыдущем запросе.

let TableWithBlobId =
(AzureNetworkAnalytics_CL
   | where SubType_s == "Topology" and ResourceType == "NetworkSecurityGroup" and DiscoveryRegion_s == Region_s and IsFlowEnabled_b
   | extend binTime = bin(TimeProcessed_t, 6h),
            nsgId = strcat(Subscription_g, "/", Name_s),
            saNameSplit = split(FlowLogStorageAccount_s, "/")
   | extend saName = iif(arraylength(saNameSplit) == 3, saNameSplit[2], '')
   | distinct nsgId, saName, binTime)
| join kind = rightouter (
   AzureNetworkAnalytics_CL
   | where SubType_s == "FlowLog"  
   | extend binTime = bin(FlowEndTime_t, 6h)
) on binTime, $left.nsgId == $right.NSGList_s  
| extend blobTime = format_datetime(todatetime(FlowIntervalStartTime_t), "yyyy MM dd hh")
| extend nsgComponents = split(toupper(NSGList_s), "/"), dateTimeComponents = split(blobTime, " ")
| extend BlobPath = strcat("https://", saName,
                        "@insights-logs-networksecuritygroupflowevent/resoureId=/SUBSCRIPTIONS/", nsgComponents[0],
                        "/RESOURCEGROUPS/", nsgComponents[1],
                        "/PROVIDERS/MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/", nsgComponents[2],
                        "/y=", dateTimeComponents[0], "/m=", dateTimeComponents[1], "/d=", dateTimeComponents[2], "/h=", dateTimeComponents[3],
                        "/m=00/macAddress=", replace(@"-", "", MACAddress_s),
                        "/PT1H.json")
| project-away nsgId, saName, binTime, blobTime, nsgComponents, dateTimeComponents;

TableWithBlobId
| where SubType_s == "FlowLog" and FlowStartTime_t >= ago(30d) and FlowType_s == "ExternalPublic"
| project Subnet_s , BlobPath

Предыдущий запрос создает URL-адрес для доступа к большому двоичному объекту напрямую следующим образом:

https://{storageAccountName}@insights-logs-networksecuritygroupflowevent/resoureId=/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroup}/PROVIDERS/MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/{networkSecurityGroupName}/y={year}/m={month}/d={day}/h={hour}/m=00/macAddress={macAddress}/PT1H.json

Вывод списка виртуальных машин, получающих большую часть локального трафика

Используйте следующий запрос, чтобы проверить, какие виртуальные машины получают большую часть локального трафика.

AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S" 
| where <Scoping condition>
| mvexpand vm = pack_array(VM1_s, VM2_s) to typeof(string)
| where isnotempty(vm) 
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + OutboundBytes_d 
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime_t from datetime(<time>) to datetime(<time>) step 1 m by vm
| render timechart

Вывод списка IP-адресов, получающих большую часть локального трафика

Используйте следующий запрос, чтобы проверить, какие IP-адреса получают большинство локальных трафика.

AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S" 
//| where <Scoping condition>
| mvexpand IP = pack_array(SrcIP_s, DestIP_s) to typeof(string)
| where isnotempty(IP) 
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + OutboundBytes_d 
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime_t from datetime(<time>) to datetime(<time>) step 1 m by IP
| render timechart

Проверка стандартного отклонения трафика, полученного виртуальными машинами

Используйте следующий запрос, чтобы проверить стандартное отклонение трафика, полученного виртуальными машинами из локальных компьютеров.

AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S" 
//| where <Scoping condition>
| mvexpand vm = pack_array(VM1_s, VM2_s) to typeof(string)
| where isnotempty(vm) 
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + utboundBytes_d
| summarize deviation = stdev(traffic) by vm

Проверка стандартного отклонения в трафике, полученного IP-адресами

Используйте следующий запрос, чтобы проверить стандартное отклонение трафика, полученного IP-адресами локальных компьютеров.

AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S" 
//| where <Scoping condition>
| mvexpand IP = pack_array(SrcIP_s, DestIP_s) to typeof(string)
| where isnotempty(IP) 
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + OutboundBytes_d
| summarize deviation = stdev(traffic) by IP

Проверьте, какие порты доступны или заблокированы между парами IP-адресов с помощью правил NSG

Используйте следующий запрос, чтобы проверить, какие порты доступны (или заблокированы) между парами IP-адресов с правилами NSG.

AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and TimeGenerated between (startTime .. endTime)
| extend sourceIPs = iif(isempty(SrcIP_s), split(SrcPublicIPs_s," "), pack_array(SrcIP_s)),
destIPs = iif(isempty(DestIP_s), split(DestPublicIPs_s," "), pack_array(DestIP_s))
| mvexpand SourceIp = sourceIPs to typeof(string)
| mvexpand DestIp = destIPs to typeof(string)
| project SourceIp = tostring(split(SourceIp, "|")[0]), DestIp = tostring(split(DestIp, "|")[0]), NSGList_s, NSGRule_s, DestPort_d, L4Protocol_s, FlowStatus_s 
| summarize DestPorts= makeset(DestPort_d) by SourceIp, DestIp, NSGList_s, NSGRule_s, L4Protocol_s, FlowStatus_s

Запрет повторяющихся записей

Если ведение журнала потоков включено на обеих сторонах подключения, поток можно записать на нескольких устройствах. В результате повторяющиеся данные могут отображаться, если все журналы потоков агрегируются в одной рабочей области Log Analytics. Необходимо включить FlowDirection или MACAddress предотвратить дублирование и различать записи.

В потоке или подключении:

  • MacAddress обозначает MAC устройства, на котором фиксируется поток.
  • SrcIp обозначает IP-адрес устройства, с которого было инициировано подключение.
  • DestIp обозначает IP-адрес устройства, к которому было выполнено подключение.
  • FlowDirection обозначает направление подключения относительно устройства. Например, если подключение выполняется из VM1 (IP: и MAC: 10.0.0.4) к A1:B1:C1:D1:E1:F1 (IP: 10.0.0.5 и MAC: A2:B2:C2:D2:E2:F2), если поток фиксируется на vm1, то FlowDirection для этого потока будет Outboundзаписан, и если поток фиксируется на vm2, то FlowDirection для этого потока будет.Inbound
  • BytesSrcToDest / PacketsSrcToDest обозначает байты или пакеты, отправляемые из источника в место назначения независимо от того, где они были записаны.
  • BytesDestToSrc / PacketsDestToSrc обозначает байты или пакеты, отправляемые из назначения в источник, независимо от того, где они были записаны.

Например, если подключение выполняется из VM1 к VM2 со следующими полями.

VM SrcIp DestIp МАКИНТОШ BytesSrcToDest BytesDestToSrc FlowDirection
VM1 10.0.0.4 10.0.0.5 A1-B1-C1-D1-E1-F1 100 200 Outbound
VM2 10.0.0.4 10.0.0.5 A2-B2-C2-D2-E2-F2 100 200 Входящий трафик

Вы можете использовать любой из следующих запросов для вычисления общего исходящего трафика для устройства с IP-адресом 10.0.0.4 и MAC-адресом A1:B1:C1:D1:E1:F1для подключений, инициированных этим устройством.

NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Outbound"
| summarize totalIniBytes = sum(BytesSrcToDest);
NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and FlowDirection == "Outbound"
| summarize totalIniBytes = sum(BytesSrcToDest);
NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1"
| summarize totalIniBytes = sum(BytesSrcToDest);

Аналогичным образом можно использовать любой из следующих запросов для вычисления общего исходящего байта для устройства с IP-адресом 10.0.0.4 и MAC-адресом A1:B1:C1:D1:E1:F1для подключений, инициированных другими устройствами с этим устройством.

NTANetAnalytics
| where DestIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Inbound"
| summarize totalNoniniBytes = sum(BytesDestToSrc)
NTANetAnalytics
| where DestIp == "10.0.0.4" and FlowDirection == "Inbound"
| summarize totalNoniniBytes = sum(BytesDestToSrc)
NTANetAnalytics
| where DestIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1"
| summarize totalNoniniBytes = sum(BytesDestToSrc)

Вы можете вычислить общий исходящий байт для устройства с помощью следующего запроса:

let InitiatedByVM = NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Outbound"
| summarize totalIniBytes = sum(BytesSrcToDest);
let NotInitiatedByVM = NTANetAnalytics
| where DestIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Inbound"
| summarize totalNoniniBytes = sum(BytesDestToSrc);
InitiatedByVM
| join kind=fullouter NotInitiatedByVM on FlowEndTime
| extend Time = iff(isnotnull(FlowEndTime), FlowEndTime, FlowEndTime1)
| summarize totalMB = (sum(totalIniBytes) + sum(totalNoniniBytes)) / 1024.0 /1024.0;