Compartir a través de


Uso de consultas en análisis de tráfico

En este artículo se proporcionan consultas de ejemplo del lenguaje de consulta kusto (KQL) para ayudarle a analizar los datos de análisis de tráfico de forma eficaz. Análisis de tráfico procesa registros de flujo de red virtual (VNet) y registros de flujo del grupo de seguridad de red (NSG) para proporcionar información detallada sobre los patrones de tráfico de red, los eventos de seguridad y las métricas de rendimiento.

Use estas consultas para:

  • Identificación de patrones de tráfico de red y puntos de conexión comunicados principales
  • Supervisión de eventos de seguridad y análisis de posibles amenazas
  • Solución de problemas de conectividad de red
  • Optimización del rendimiento de red y el uso de recursos

Prerrequisitos

Consultas de NTANetAnalytics

En esta sección se proporcionan consultas de ejemplo para la tabla NTANetAnalytics que puede usar para analizar los datos de análisis de tráfico de Virtual Network. La tabla NTANetAnalytics contiene datos de registro de flujo agregados con información mejorada de análisis de red. Para obtener más información sobre el esquema de tabla y los campos disponibles, consulte NTANetAnalytics.

Enumerar subredes que interactúan con direcciones IP públicas

Utilice la siguiente consulta para enumerar todas las subredes que interactúan con IP públicas que no son de Azure en los últimos 30 días.

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

Enumerar subredes que interactúan entre sí

Use la siguiente consulta para enumerar todas las subredes que intercambiaron tráfico entre sí en los últimos 30 días y el total de bytes intercambiados.

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

Visualización del tráfico entre regiones

Use la siguiente consulta para ver el tráfico intraregional e interregional en los últimos 30 días.

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

Visualización del tráfico basado en la suscripción

Use la siguiente consulta para ver el tráfico de Azure agrupado por suscripciones en los últimos 30 días.

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

Enumeración de máquinas virtuales que reciben la mayoría del tráfico local

Use la siguiente consulta para comprobar qué máquinas virtuales reciben más tráfico 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

Enumerar direcciones IP que reciben la mayoría del tráfico local

Use la siguiente consulta para comprobar qué direcciones IP reciben la mayoría del tráfico 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

Enumerar direcciones IP que envían o reciben tráfico hacia o desde una máquina virtual

Use la consulta siguiente para enumerar todas las IP que intercambiaron datos con una máquina virtual mediante su dirección IP en los últimos 30 días.

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

Visualización del tráfico de ExpressRoute

Use la consulta siguiente para ver el tráfico a través de conexiones de ExpressRoute en los últimos 30 días.

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

Visualización de la distribución del tráfico del equilibrador de carga

Use la siguiente consulta para ver la distribución del tráfico de la aplicación que tiene un equilibrador de carga delante de ella.

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

Comprobación de la desviación estándar en el tráfico recibido por las máquinas virtuales

Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las máquinas virtuales de las máquinas locales.

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

Comprobación de la desviación estándar en el tráfico recibido por las IP

Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las direcciones IP de las máquinas locales.

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 de NTAIpDetails

En esta sección se proporcionan consultas de ejemplo para la tabla NTAIpDetails que puede usar para analizar información específica de IP en los datos de análisis de tráfico. Para obtener más información, consulte NTAIpDetails.

Visualización de tipos de flujo y ubicaciones de IP públicas

Use la consulta siguiente para obtener información sobre los tipos de flujo y la ubicación de las IP públicas en los datos de análisis de tráfico.

NTAIpDetails
| distinct FlowType, PublicIpDetails, Location

Visualización de tipos de flujo malintencionados

Use la consulta siguiente para ver los tipos de subprocesos en flujos malintencionados.

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

Consultas de AzureNetworkAnalytics_CL

En esta sección se proporcionan consultas de ejemplo para la tabla de consultas de AzureNetworkAnalytics_CL que puede usar para analizar los datos de los registros de flujo de NSG de análisis de tráfico.

Enumerar todas las subredes que interactúan con IP públicas

Utilice la siguiente consulta para enumerar todas las subredes que interactúan con IP públicas que no son de Azure en los últimos 30 días.

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

Visualización de la ruta de acceso del blob para flujos que interactúan con direcciones IP públicas

Para ver la ruta del blob de los flujos de la consulta anterior, utilice la siguiente consulta.

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

La consulta anterior construye una URL para acceder directamente al blob como sigue:

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

Enumeración de máquinas virtuales que reciben la mayoría del tráfico local

Use la siguiente consulta para comprobar qué máquinas virtuales reciben más tráfico 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

Enumerar direcciones IP que reciben la mayoría del tráfico local

Use la siguiente consulta para comprobar qué direcciones IP reciben la mayoría del tráfico 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

Comprobación de la desviación estándar en el tráfico recibido por las máquinas virtuales

Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las máquinas virtuales de las máquinas locales.

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

Comprobación de la desviación estándar en el tráfico recibido por las IP

Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las direcciones IP de las máquinas locales.

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

Comprobación sobre qué puertos son accesibles o están bloqueados entre pares de IP con reglas de NSG

Use la consulta siguiente para comprobar qué puertos son accesibles (o están bloqueados) entre pares IP con reglas de 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

Si el registro de flujo está habilitado en ambos lados de una conexión, se puede capturar un flujo en varios dispositivos. Como resultado, los datos duplicados pueden aparecer si todos los registros de flujo se agregan en la misma área de trabajo de Log Analytics. Es necesario incluir FlowDirection o MACAddress para evitar la duplicación y distinguir entre registros.

En un flujo o conexión:

  • MacAddress denota el MAC del dispositivo en el que se captura el flujo.
  • SrcIp denota la dirección IP del dispositivo desde el que se inició la conexión.
  • DestIp denota la dirección IP del dispositivo al que se realizó la conexión.
  • FlowDirection denota la dirección de la conexión con respecto al dispositivo. Por ejemplo, cuando se realiza una conexión desde VM1 (IP: 10.0.0.4 y MAC: A1:B1:C1:D1:E1:F1) a VM2 (IP: 10.0.0.5 y MAC: A2:B2:C2:D2:E2:F2), si el flujo se captura en VM1, entonces FlowDirection para este flujo sería Outbound y si el flujo se captura en VM2,FlowDirection para este flujo sería Inbound.
  • BytesSrcToDest / PacketsSrcToDest denota bytes o paquetes enviados desde el origen al destino, independientemente de dónde se capturaron.
  • BytesDestToSrc / PacketsDestToSrc denota bytes o paquetes enviados desde el destino al origen, independientemente de dónde se capturaron.

Por ejemplo, si se realiza una conexión de VM1 a VM2 con los campos siguientes.

VM SrcIp DestIp MAC 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 Entrante

Puede usar cualquiera de las siguientes consultas para calcular el total de bytes salientes de un dispositivo con dirección IP 10.0.0.4 y dirección MAC A1:B1:C1:D1:E1:F1 para las conexiones 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);

Del mismo modo, puede usar cualquiera de las siguientes consultas para calcular el total de bytes salientes de un dispositivo con dirección IP 10.0.0.4 y dirección MAC A1:B1:C1:D1:E1:F1, para las conexiones iniciadas por otros dispositivos a 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)

Puede calcular el total de bytes salientes de un dispositivo mediante la consulta siguiente:

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;