Partager via


Utiliser des requêtes dans l’analyse de trafic

Cet article fournit des exemples de requêtes Kusto Query Language (KQL) pour vous aider à analyser efficacement les données d’analyse du trafic. Traffic Analytics traite les journaux de flux de réseau virtuel et les journaux de flux de groupe de sécurité réseau (NSG) pour fournir des insights détaillés sur les modèles de trafic réseau, les événements de sécurité et les métriques de performances.

Utilisez ces requêtes pour :

  • Identifier les modèles de trafic réseau et les principaux points de terminaison de communication
  • Surveiller les événements de sécurité et analyser les menaces potentielles
  • Résoudre les problèmes de connectivité réseau
  • Optimiser les performances réseau et l’utilisation des ressources

Prerequisites

Requêtes NTANetAnalytics

Cette section fournit des exemples de requêtes pour la table NTANetAnalytics que vous pouvez utiliser pour analyser vos données d’analyse du trafic de réseau virtuel. La table NTANetAnalytics contient des données de journal de flux agrégées avec des informations d’analyse réseau améliorées. Pour plus d’informations sur le schéma de table et les champs disponibles, consultez NTANetAnalytics.

Répertorier les sous-réseaux qui interagissent avec les adresses IP publiques

Utilisez la requête suivante pour répertorier tous les sous-réseaux qui interagissent avec des adresses IP publiques non-Azure au cours des 30 derniers jours.

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

Répertorier les sous-réseaux qui interagissent les uns avec les autres

Utilisez la requête suivante pour répertorier tous les sous-réseaux qui ont échangé du trafic entre eux au cours des 30 derniers jours et le total des octets échangés.

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

Afficher le trafic interrégional

Utilisez la requête suivante pour afficher le trafic intrarégional et interrégional au cours des 30 derniers jours.

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

Afficher le trafic en fonction de l’abonnement

Utilisez la requête suivante pour afficher le trafic Azure regroupé par abonnements au cours des 30 derniers jours.

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

Répertorier les machines virtuelles recevant la plupart du trafic local

Utilisez la requête suivante pour vérifier quelles machines virtuelles reçoivent la plupart du trafic 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

Répertorier les adresses IP recevant la plupart du trafic local

Utilisez la requête suivante pour vérifier quelles adresses IP reçoivent la plupart du trafic 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

Répertorier les adresses IP qui envoient ou reçoivent du trafic vers ou depuis une machine virtuelle

Utilisez la requête suivante pour répertorier toutes les adresses IP qui ont échangé des données avec une machine virtuelle à l’aide de son adresse IP au cours des 30 derniers jours.

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

Afficher le trafic ExpressRoute

Utilisez la requête suivante pour afficher le trafic sur les connexions ExpressRoute au cours des 30 derniers jours.

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

Afficher la distribution du trafic de l’équilibreur de charge

Utilisez la requête suivante pour afficher la distribution du trafic de votre application qui a un équilibreur de charge devant lui.

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

Vérifier l’écart type dans le trafic reçu par les machines virtuelles

Utilisez la requête suivante pour vérifier l’écart type dans le trafic reçu par les machines virtuelles à partir d’ordinateurs locaux.

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

Vérifier l’écart type dans le trafic reçu par les adresses IP

Utilisez la requête suivante pour vérifier l’écart type dans le trafic reçu par les adresses IP des ordinateurs locaux.

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

Requêtes NTAIpDetails

Cette section fournit des exemples de requêtes pour la table NTAIpDetails que vous pouvez utiliser pour analyser des informations spécifiques à l’adresse IP dans vos données d’analyse du trafic. Pour plus d’informations, consultez NTAIpDetails.

Afficher les types de flux et les emplacements d’adresses IP publiques

Utilisez la requête suivante pour en savoir plus sur les types de flux et l’emplacement des adresses IP publiques dans vos données d’analyse du trafic.

NTAIpDetails
| distinct FlowType, PublicIpDetails, Location

Afficher les types de flux malveillants

Utilisez la requête suivante pour afficher les types de threads dans des flux malveillants.

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

Requêtes AzureNetworkAnalytics_CL

Cette section fournit des exemples de requêtes pour la table de requêtes AzureNetworkAnalytics_CL que vous pouvez utiliser pour analyser vos données de flux de groupe de sécurité réseau d’analyse du trafic.

Répertorier tous les sous-réseaux qui interagissent avec des adresses IP publiques

Utilisez la requête suivante pour répertorier tous les sous-réseaux qui interagissent avec des adresses IP publiques non-Azure au cours des 30 derniers jours.

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

Afficher le chemin de blob pour les flux qui interagissent avec les adresses IP publiques

Utilisez la requête suivante pour voir le chemin de blob pour les flux dans la requête précédente.

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 requête précédente construit une URL permettant d’accéder directement à l’objet blob, comme suit :

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

Répertorier les machines virtuelles recevant la plupart du trafic local

Utilisez la requête suivante pour vérifier quelles machines virtuelles reçoivent la plupart du trafic 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

Répertorier les adresses IP recevant la plupart du trafic local

Utilisez la requête suivante pour vérifier quelles adresses IP reçoivent la plupart du trafic 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

Vérifier l’écart type dans le trafic reçu par les machines virtuelles

Utilisez la requête suivante pour vérifier l’écart type dans le trafic reçu par les machines virtuelles à partir d’ordinateurs locaux.

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

Vérifier l’écart type dans le trafic reçu par les adresses IP

Utilisez la requête suivante pour vérifier l’écart type dans le trafic reçu par les adresses IP des ordinateurs locaux.

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

Vérifier quels ports sont accessibles ou bloqués entre les paires d’adresses IP avec les règles du groupe de sécurité réseau

Utilisez la requête suivante pour vérifier quels ports sont accessibles (ou bloqués) entre les paires IP avec des règles de groupe de sécurité réseau.

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

Empêcher les enregistrements en double

Si la journalisation des flux est activée des deux côtés d’une connexion, un flux peut être capturé sur plusieurs appareils. Par conséquent, les données en double peuvent apparaître si tous les journaux de flux sont agrégés dans le même espace de travail Log Analytics. Il est nécessaire d’inclure FlowDirection ou MACAddress d’empêcher la duplication et de faire la distinction entre les enregistrements.

Dans un flux/une connexion :

  • MacAddress indique le MAC de l’appareil sur lequel le flux est capturé.
  • SrcIp indique l’adresse IP de l’appareil à partir duquel la connexion a été lancée.
  • DestIp indique l’adresse IP de l’appareil auquel la connexion a été établie.
  • FlowDirection indique la direction de la connexion par rapport à l’appareil. Par exemple, lorsqu’une connexion est établie à partir de VM1 (IP : 10.0.0.4 et MAC : A1:B1:C1:D1:E1:F1) à VM2 (IP : 10.0.0.5 et MAC : A2:B2:C2:D2:E2:F2), si le flux est capturé sur VM1, alors FlowDirection pour ce flux serait Outbound, et si le flux est capturé sur VM2, alors FlowDirection pour ce flux serait Inbound.
  • BytesSrcToDest / PacketsSrcToDest indique les octets ou les paquets envoyés de la source à la destination, quel que soit l’emplacement où ils ont été capturés.
  • BytesDestToSrc / PacketsDestToSrc indique les octets ou les paquets envoyés de la destination à la source, quel que soit l’emplacement où ils ont été capturés.

Par exemple, si une connexion est établie de VM1 à VM2 avec les champs suivants.

VM SrcIp DestIp MAC BytesSrcToDest BytesDestToSrc FlowDirection
MV1 10.0.0.4 10.0.0.5 A1-B1-C1-D1-E1-F1 100 200 Règle de trafic sortant
MV2 10.0.0.4 10.0.0.5 A2-B2-C2-D2-E2-F2 100 200 Trafic entrant

Vous pouvez utiliser l’une des requêtes suivantes pour calculer le nombre total d’octets sortants pour un appareil avec l’adresse IP 10.0.0.4 et l’adresse MAC A1:B1:C1:D1:E1:F1, pour les connexions initiées par cet appareil.

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

De même, vous pouvez utiliser l’une des requêtes suivantes pour calculer le nombre total d’octets sortants pour un appareil avec l’adresse IP 10.0.0.4 et l’adresse MAC A1:B1:C1:D1:E1:F1, pour les connexions initiées par un autre appareil à cet appareil.

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)

Vous pouvez calculer le nombre total d’octets sortants pour un appareil à l’aide de la requête suivante :

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;