Compartilhar via


Usar consultas na análise de tráfego

Este artigo fornece consultas KQL (Linguagem de Consulta Kusto) de exemplo para ajudá-lo a analisar dados de análise de tráfego com eficiência. A análise de tráfego processa logs de fluxo de rede virtual (VNet) e logs de fluxo do NSG (grupo de segurança de rede) para fornecer informações detalhadas sobre padrões de tráfego de rede, eventos de segurança e métricas de desempenho.

Use estas consultas para:

  • Identificar padrões de tráfego de rede e os principais pontos de extremidade de comunicação
  • Monitorar eventos de segurança e analisar possíveis ameaças
  • Solucionar problemas de conectividade de rede
  • Otimizar o desempenho da rede e a utilização de recursos

Pré-requisitos

Consultas NTANetAnalytics

Esta seção fornece consultas de exemplo para a tabela NTANetAnalytics que você pode usar para analisar os dados de análise de tráfego da Rede Virtual. A tabela NTANetAnalytics contém dados de log de fluxo agregados com informações avançadas de análise de rede. Para obter mais informações sobre o esquema de tabela e os campos disponíveis, consulte NTANetAnalytics.

Listar sub-redes interagindo com IPs públicos

Use a consulta a seguir para listar todas as sub-redes que interagem com IPs públicos não Azure nos últimos 30 dias.

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

Listar sub-redes interagindo entre si

Use a consulta a seguir para listar todas as sub-redes que trocaram tráfego entre si nos últimos 30 dias e o total de bytes trocados.

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

Exibir tráfego entre regiões

Use a consulta a seguir para exibir o tráfego intra-regional e inter-regional nos últimos 30 dias.

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

Exibir o tráfego com base na assinatura

Use a consulta a seguir para exibir o tráfego do Azure agrupado por assinaturas nos últimos 30 dias.

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

Listar máquinas virtuais que recebem a maioria do tráfego local

Use a consulta a seguir para verificar quais máquinas virtuais estão recebendo a maioria do tráfego local.

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

Listar IPs que recebem a maioria do tráfego local

Use a consulta a seguir para verificar quais IPs estão recebendo a maioria do tráfego local.

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

Listar IPs enviando ou recebendo tráfego de ou para uma máquina virtual

Use a consulta a seguir para listar todos os IPs que trocaram dados com uma máquina virtual usando seu endereço IP nos últimos 30 dias.

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

Exibir o tráfego do ExpressRoute

Use a consulta a seguir para exibir o tráfego em conexões do ExpressRoute nos últimos 30 dias.

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

Exibir a distribuição de tráfego do balanceador de carga

Use a consulta a seguir para exibir a distribuição de tráfego do aplicativo que tem um balanceador de carga na frente dele.

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

Verificar o desvio padrão no tráfego recebido por máquinas virtuais

Use a consulta a seguir para verificar o desvio padrão no tráfego recebido por máquinas virtuais de máquinas locais.

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

Verificar o desvio padrão no tráfego recebido pelos IPs

Use a consulta a seguir para verificar o desvio padrão no tráfego recebido por IPs de computadores locais.

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

Consultas NTAIpDetails

Esta seção fornece consultas de exemplo para a tabela NTAIpDetails que você pode usar para analisar informações específicas de IP em seus dados de análise de tráfego. Para obter mais informações, consulte NTAIpDetails.

Exibir tipos de fluxo e locais de IP públicos

Use a consulta a seguir para saber mais sobre os tipos de fluxo e a localização de IPs públicos em seus dados de análise de tráfego.

NTAIpDetails
| distinct FlowType, PublicIpDetails, Location

Exibir tipos de fluxo mal-intencionados

Use a consulta a seguir para exibir os tipos de thread em fluxos mal-intencionados.

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

Consultas AzureNetworkAnalytics_CL

Esta seção fornece consultas de exemplo para a tabela de consultas AzureNetworkAnalytics_CL que você pode usar para analisar os dados de logs de fluxo do NSG da análise de tráfego.

Listar todas as sub-redes interagindo com IPs públicos

Use a consulta a seguir para listar todas as sub-redes que interagem com IPs públicos não Azure nos últimos 30 dias.

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

Exibir caminho de blob para fluxos interagindo com IPs públicos

Use a consulta a seguir para exibir o caminho do blob para os fluxos na consulta anterior.

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

A consulta anterior constrói uma URL para acessar o blob diretamente da seguinte maneira:

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

Listar máquinas virtuais que recebem a maioria do tráfego local

Use a consulta a seguir para verificar quais máquinas virtuais estão recebendo a maioria do tráfego local.

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

Listar IPs que recebem a maioria do tráfego local

Use a consulta a seguir para verificar quais IPs estão recebendo a maioria do tráfego local.

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

Verificar o desvio padrão no tráfego recebido por máquinas virtuais

Use a consulta a seguir para verificar o desvio padrão no tráfego recebido por máquinas virtuais de máquinas locais.

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

Verificar o desvio padrão no tráfego recebido pelos IPs

Use a consulta a seguir para verificar o desvio padrão no tráfego recebido por IPs de computadores locais.

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

Verificar quais portas podem ser acessadas ou bloqueadas entre pares IP com regras NSG

Use a consulta a seguir para verificar quais portas podem ser acessadas (ou bloqueadas) entre pares IP com regras 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

Impedir registros duplicados

Se o log de fluxo estiver habilitado em ambos os lados de uma conexão, um fluxo poderá ser capturado em vários dispositivos. Como resultado, os dados duplicados poderão aparecer se todos os logs de fluxo forem agregados no mesmo workspace do Log Analytics. É necessário incluir FlowDirection ou MACAddress para impedir a duplicação e distinguir entre registros.

Em um fluxo/conexão:

  • MacAddress indica o MAC do dispositivo no qual o fluxo está sendo capturado.
  • SrcIp indica o endereço IP do dispositivo do qual a conexão foi iniciada.
  • DestIp indica o endereço IP do dispositivo ao qual a conexão foi feita.
  • FlowDirection indica a direção da conexão em relação ao dispositivo. Por exemplo, quando uma conexão é feita de VM1 (IP: 10.0.0.4 e MAC: A1:B1:C1:D1:E1:F1) para VM2 (IP: 10.0.0.5 e MAC: A2:B2:C2:D2:E2:F2), se o fluxo for capturado na VM1, o FlowDirection para esse fluxo será Outbound e se o fluxo for capturado na VM2, o FlowDirection para esse fluxo será Inbound.
  • BytesSrcToDest / PacketsSrcToDest indica bytes ou pacotes enviados da origem para o destino, independentemente de onde foram capturados.
  • BytesDestToSrc / PacketsDestToSrc indica bytes ou pacotes enviados do destino para a origem, independentemente de onde foram capturados.

Por exemplo, se uma conexão for feita de VM1 para VM2 com os campos a seguir.

VM SrcIp DestIp MAC BytesSrcToDest BytesDestToSrc FlowDirection
VM1 10.0.0.4 10.0.0.5 A1-B1-C1-D1-E1-F1 100 200 Saída
VM2 10.0.0.4 10.0.0.5 A2-B2-C2-D2-E2-F2 100 200 Entrada

Você pode usar qualquer uma das consultas a seguir para calcular o total de bytes de saída para um dispositivo com endereço IP 10.0.0.4 e endereço MAC A1:B1:C1:D1:E1:F1 para conexões iniciadas por este dispositivo.

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);

Da mesma forma, você pode usar qualquer uma das consultas a seguir para calcular o total de bytes de saída para um dispositivo com endereço IP 10.0.0.4 e endereço MAC A1:B1:C1:D1:E1:F1, para conexões iniciadas por outros dispositivos para este dispositivo.

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)

Você pode calcular o total de bytes de saída para um dispositivo usando a seguinte consulta:

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;