Freigeben über


Verwenden von Abfragen in Der Datenverkehrsanalyse

Dieser Artikel enthält Beispielabfragen der Kusto Query Language (KQL), die Ihnen helfen, Datenverkehrsanalysen effektiv zu analysieren. Datenverkehrsanalyse verarbeitet VNet-Flussprotokolle (Virtual Network) und NSG-Ablaufprotokolle (Network Security Group), um detaillierte Einblicke in Netzwerkdatenverkehrsmuster, Sicherheitsereignisse und Leistungsmetriken zu bieten.

Verwenden Sie diese Abfragen, um:

  • Identifizieren von Netzwerkdatenverkehrsmustern und endpunkten der wichtigsten Kommunikation
  • Überwachen von Sicherheitsereignissen und Analysieren potenzieller Bedrohungen
  • Behandeln von Problemen mit der Netzwerkkonnektivität
  • Optimieren der Netzwerkleistung und Ressourcenauslastung

Voraussetzungen

NTANetAnalytics-Abfragen

Dieser Abschnitt enthält Beispielabfragen für die NTANetAnalytics-Tabelle , die Sie zum Analysieren Ihrer Datenverkehrsanalysedaten im virtuellen Netzwerk verwenden können. Die Tabelle "NTANetAnalytics" enthält aggregierte Flussprotokolldaten mit erweiterten Netzwerkanalyseinformationen. Weitere Informationen zum Tabellenschema und den verfügbaren Feldern finden Sie unter NTANetAnalytics.

Auflisten von Subnetzen, die mit öffentlichen IPs interagieren

Verwenden Sie die folgende Abfrage, um alle Subnetze auflisten, die in den letzten 30 Tagen mit nicht azure öffentlichen IPs interagieren.

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

Auflisten von Subnetzen, die miteinander interagieren

Verwenden Sie die folgende Abfrage, um alle Subnetze auflisten, die datenverkehrsübergreifend in den letzten 30 Tagen ausgetauscht wurden, und die Gesamtzahl der ausgetauschten Bytes.

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

Anzeigen des regionalübergreifenden Verkehrs

Verwenden Sie die folgende Abfrage, um den intraregionalen und interregionalen Datenverkehr in den letzten 30 Tagen anzuzeigen.

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

Anzeigen des Datenverkehrs basierend auf abonnementbasiertem Abonnement

Verwenden Sie die folgende Abfrage, um azure-Datenverkehr nach Abonnements in den letzten 30 Tagen gruppiert anzuzeigen.

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

Auflisten virtueller Computer, die den meisten lokalen Datenverkehr erhalten

Verwenden Sie die folgende Abfrage, um zu überprüfen, welche virtuellen Computer den meisten lokalen Datenverkehr erhalten.

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

Auflisten von IPs, die den meisten lokalen Datenverkehr empfangen

Verwenden Sie die folgende Abfrage, um zu überprüfen, welche IPs den meisten lokalen Datenverkehr erhalten.

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

Auflisten von IPs, die Datenverkehr an oder von einem virtuellen Computer empfangen

Verwenden Sie die folgende Abfrage, um alle IPs auflisten, die Daten mit einem virtuellen Computer ausgetauscht haben, indem Sie ihre IP-Adresse in den letzten 30 Tagen verwenden.

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

ExpressRoute-Datenverkehr anzeigen

Verwenden Sie die folgende Abfrage, um Datenverkehr über ExpressRoute-Verbindungen in den letzten 30 Tagen anzuzeigen.

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

Anzeigen der Datenverkehrsverteilung des Lastenausgleichs

Verwenden Sie die folgende Abfrage, um die Datenverkehrsverteilung Ihrer Anwendung mit einem Lastenausgleich vor der Anwendung anzuzeigen.

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

Überprüfen der Standardabweichung des Datenverkehrs, der von virtuellen Computern empfangen wird

Verwenden Sie die folgende Abfrage, um die Standardabweichung des Datenverkehrs zu überprüfen, der von virtuellen Computern von lokalen Computern empfangen wird.

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

Überprüfen der Standardabweichung des Datenverkehrs, der von IPs empfangen wird

Verwenden Sie die folgende Abfrage, um die Standardabweichung des Datenverkehrs zu überprüfen, der von IPs von lokalen Computern empfangen wird.

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-Abfragen

Dieser Abschnitt enthält Beispielabfragen für die Tabelle "NTAIpDetails ", mit der Sie IP-spezifische Informationen in Ihren Datenverkehrsanalysedaten analysieren können. Weitere Informationen finden Sie unter NTAIpDetails.

Anzeigen von Flusstypen und öffentlichen IP-Speicherorten

Verwenden Sie die folgende Abfrage, um mehr über die Flusstypen und den Speicherort öffentlicher IPs in Ihren Datenverkehrsanalysedaten zu erfahren.

NTAIpDetails
| distinct FlowType, PublicIpDetails, Location

Anzeigen bösartiger Flusstypen

Verwenden Sie die folgende Abfrage, um die Threadtypen in bösartigen Flüssen anzuzeigen.

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

AzureNetworkAnalytics_CL Abfragen

Dieser Abschnitt enthält Beispielabfragen für die AzureNetworkAnalytics_CL Abfragetabelle , die Sie verwenden können, um Ihre NSG-Flussprotokolldaten zu analysieren.

Auflisten aller Subnetze, die mit öffentlichen IPs interagieren

Verwenden Sie die folgende Abfrage, um alle Subnetze auflisten, die in den letzten 30 Tagen mit nicht azure öffentlichen IPs interagieren.

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

Anzeigen des BLOB-Pfads für Flüsse, die mit öffentlichen IPs interagieren

Verwenden Sie die folgende Abfrage, um den BLOB-Pfad für die Flüsse in der vorherigen Abfrage anzuzeigen.

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

Die vorherige Abfrage erstellt eine URL für den direkten Zugriff auf das Blob wie folgt:

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

Auflisten virtueller Computer, die den meisten lokalen Datenverkehr erhalten

Verwenden Sie die folgende Abfrage, um zu überprüfen, welche virtuellen Computer den meisten lokalen Datenverkehr erhalten.

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

Auflisten von IPs, die den meisten lokalen Datenverkehr empfangen

Verwenden Sie die folgende Abfrage, um zu überprüfen, welche IPs den meisten lokalen Datenverkehr erhalten.

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

Überprüfen der Standardabweichung des Datenverkehrs, der von virtuellen Computern empfangen wird

Verwenden Sie die folgende Abfrage, um die Standardabweichung des Datenverkehrs zu überprüfen, der von virtuellen Computern von lokalen Computern empfangen wird.

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

Überprüfen der Standardabweichung des Datenverkehrs, der von IPs empfangen wird

Verwenden Sie die folgende Abfrage, um die Standardabweichung des Datenverkehrs zu überprüfen, der von IPs von lokalen Computern empfangen wird.

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

Überprüfen, welche Ports zwischen IP-Paaren mit NSG-Regeln erreichbar oder blockiert sind

Verwenden Sie die folgende Abfrage, um zu überprüfen, welche Ports zwischen IP-Paaren mit NSG-Regeln erreichbar (oder blockiert sind).

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

Verhindern doppelter Datensätze

Wenn die Ablaufprotokollierung auf beiden Seiten einer Verbindung aktiviert ist, kann ein Fluss auf mehreren Geräten erfasst werden. Daher können doppelte Daten angezeigt werden, wenn alle Ablaufprotokolle im selben Log Analytics-Arbeitsbereich aggregiert werden. Es ist erforderlich, Duplizierungen einzuschließen FlowDirection oder MACAddress zu verhindern und zwischen Datensätzen zu unterscheiden.

In einem Fluss/einer Verbindung:

  • MacAddress gibt den MAC des Geräts an, auf dem der Fluss erfasst wird.
  • SrcIp gibt die IP-Adresse des Geräts an, von dem die Verbindung initiiert wurde.
  • DestIp gibt die IP-Adresse des Geräts an, mit dem die Verbindung hergestellt wurde.
  • FlowDirection gibt die Richtung der Verbindung im Hinblick auf das Gerät an. Wenn z. B. eine Verbindung von VM1 (IP: 10.0.0.4 und MAC: A1:B1:C1:D1:E1:F1) zu VM2 (IP: 10.0.0.5 und MAC: A2:B2:C2:D2:E2:F2) hergestellt wird, wenn der Fluss bei VM1FlowDirection erfasst wird, dann lautet Outboundder Ablauf für diesen Fluss , und wenn der Fluss bei VM2 erfasst wird, FlowDirection dann lautet Inbounddieser Ablauf .
  • BytesSrcToDest / PacketsSrcToDest Geben Sie Bytes oder Pakete an, die von der Quelle an das Ziel gesendet wurden, unabhängig davon, wo sie erfasst wurden.
  • BytesDestToSrc / PacketsDestToSrc Geben Sie Bytes oder Pakete an, die vom Ziel an die Quelle gesendet wurden, unabhängig davon, wo sie erfasst wurden.

Beispiel: Wenn eine Verbindung von VM1 zu VM2 mit den folgenden Feldern hergestellt wird.

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

Sie können eine der folgenden Abfragen verwenden, um die Gesamtanzahl ausgehender Bytes für ein Gerät mit IP-Adresse 10.0.0.4 und MAC-Adresse A1:B1:C1:D1:E1:F1für Verbindungen zu berechnen, die von diesem Gerät initiiert werden.

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

Ebenso können Sie eine der folgenden Abfragen verwenden, um die Gesamtanzahl ausgehender Bytes für ein Gerät mit IP-Adresse 10.0.0.4 und MAC-Adresse A1:B1:C1:D1:E1:F1für Verbindungen zu diesem Gerät zu berechnen.

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)

Sie können die Gesamtanzahl ausgehender Bytes für ein Gerät mithilfe der folgenden Abfrage berechnen:

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;