Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł zawiera przykładowe zapytania języka Kusto Query Language (KQL), które ułatwiają efektywne analizowanie danych analizy ruchu. Analiza ruchu przetwarza dzienniki przepływu sieci wirtualnej i dzienniki przepływów sieciowej grupy zabezpieczeń (NSG), aby zapewnić szczegółowy wgląd w wzorce ruchu sieciowego, zdarzenia zabezpieczeń i metryki wydajności.
Użyj następujących zapytań, aby:
- Identyfikowanie wzorców ruchu sieciowego i najważniejszych punktów końcowych komunikacji
- Monitorowanie zdarzeń zabezpieczeń i analizowanie potencjalnych zagrożeń
- Rozwiązywanie problemów z łącznością sieciową
- Optymalizowanie wydajności sieci i wykorzystania zasobów
Wymagania wstępne
- Analiza ruchu skonfigurowana dla dzienników przepływu. Aby uzyskać więcej informacji, zobacz Włączanie lub wyłączanie analizy ruchu.
- Dostęp do obszaru roboczego usługi Log Analytics, w którym są przechowywane dane dziennika przepływu. Aby uzyskać więcej informacji, zobacz Omówienie obszaru roboczego usługi Log Analytics.
Zapytania NTANetAnalytics
Ta sekcja zawiera przykładowe zapytania dotyczące tabeli NTANetAnalytics , których można użyć do analizowania danych analizy ruchu w sieci wirtualnej. Tabela NTANetAnalytics zawiera zagregowane dane dziennika przepływu z rozszerzonymi informacjami analizy sieci. Aby uzyskać więcej informacji na temat schematu tabeli i dostępnych pól, zobacz NTANetAnalytics.
Wyświetlanie listy podsieci współdziałających z publicznymi adresami IP
Użyj następującego zapytania, aby wyświetlić listę wszystkich podsieci korzystających z publicznych adresów IP spoza platformy Azure w ciągu ostatnich 30 dni.
NTANetAnalytics
| where SubType == "FlowLog" and FlowStartTime > ago(30d) and FlowType == "ExternalPublic"
| project SrcSubnet, DestSubnet
Wyświetlanie listy podsieci współdziałających ze sobą
Użyj następującego zapytania, aby wyświetlić listę wszystkich podsieci, które wymieniały ruch ze sobą w ciągu ostatnich 30 dni, a łączna liczba wymienianych bajtów.
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
Wyświetlanie ruchu między regionami
Użyj następującego zapytania, aby wyświetlić ruch wewnątrz regionalny i międzyregionalny w ciągu ostatnich 30 dni.
NTANetAnalytics
| where TimeGenerated > ago(30d)
| project SrcRegion, DestRegion, BytesDestToSrc, BytesSrcToDest
| where isnotempty(SrcRegion) and isnotempty(DestRegion)
| summarize TransferredBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcRegion, DestRegion
Wyświetlanie ruchu na podstawie subskrypcji
Użyj następującego zapytania, aby wyświetlić ruch platformy Azure pogrupowany według subskrypcji w ciągu ostatnich 30 dni.
NTANetAnalytics
| where TimeGenerated > ago(30d)
| project SrcSubscription, DestSubscription, BytesDestToSrc, BytesSrcToDest
| where isnotempty(SrcSubscription) and isnotempty(DestSubscription)
| summarize TransferredBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcSubscription, DestSubscription
Wyświetlanie listy maszyn wirtualnych odbierających większość ruchu lokalnego
Użyj następującego zapytania, aby sprawdzić, które maszyny wirtualne odbierają większość ruchu lokalnego.
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
Wyświetlanie listy adresów IP odbierających większość ruchu lokalnego
Użyj następującego zapytania, aby sprawdzić, które adresy IP odbierają większość ruchu lokalnego.
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
Wyświetlanie listy adresów IP wysyłających lub odbierających ruch do lub z maszyny wirtualnej
Użyj następującego zapytania, aby wyświetlić listę wszystkich adresów IP, które wymieniały dane z maszyną wirtualną przy użyciu adresu IP w ciągu ostatnich 30 dni.
NTANetAnalytics
| where TimeGenerated > ago(30d)
| where SrcIp == "10.1.1.8" and strlen(DestIp)>0
| summarize TotalBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcIp, DestIp
Wyświetlanie ruchu usługi ExpressRoute
Użyj następującego zapytania, aby wyświetlić ruch przez połączenia usługi ExpressRoute w ciągu ostatnich 30 dni.
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
Wyświetlanie dystrybucji ruchu modułu równoważenia obciążenia
Użyj następującego zapytania, aby wyświetlić dystrybucję ruchu aplikacji, która ma przed nim moduł równoważenia obciążenia.
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
Sprawdzanie odchylenia standardowego w ruchu odbieranych przez maszyny wirtualne
Użyj następującego zapytania, aby sprawdzić odchylenie standardowe w ruchu odbieranym przez maszyny wirtualne z maszyn lokalnych.
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
Sprawdzanie odchylenia standardowego w ruchu odbieranych przez adresy IP
Użyj następującego zapytania, aby sprawdzić odchylenie standardowe w ruchu odbieranym przez adresy IP z maszyn lokalnych.
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
Zapytania NTAIpDetails
Ta sekcja zawiera przykładowe zapytania dotyczące tabeli NTAIpDetails , których można użyć do analizowania informacji specyficznych dla adresu IP w danych analizy ruchu. Aby uzyskać więcej informacji, zobacz NTAIpDetails.
Wyświetlanie typów przepływów i publicznych lokalizacji adresów IP
Użyj następującego zapytania, aby dowiedzieć się więcej o typach przepływów i lokalizacji publicznych adresów IP w danych analizy ruchu.
NTAIpDetails
| distinct FlowType, PublicIpDetails, Location
Wyświetlanie złośliwych typów przepływów
Użyj następującego zapytania, aby wyświetlić typy wątków w złośliwych przepływach.
NTAIpDetails
| where TimeGenerated > ago(30d)
| where FlowType == "MaliciousFlow"
| summarize count() by ThreatType
| render piechart
zapytania AzureNetworkAnalytics_CL
Ta sekcja zawiera przykładowe zapytania dotyczące tabeli zapytań AzureNetworkAnalytics_CL , których można użyć do analizowania danych dzienników przepływu sieciowej grupy zabezpieczeń analizy ruchu.
Wyświetlanie listy wszystkich podsieci współdziałających z publicznymi adresami IP
Użyj następującego zapytania, aby wyświetlić listę wszystkich podsieci korzystających z publicznych adresów IP spoza platformy Azure w ciągu ostatnich 30 dni.
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowStartTime_t >= ago(30d) and FlowType_s == "ExternalPublic"
| project Subnet1_s, Subnet2_s
Wyświetlanie ścieżki obiektu blob dla przepływów współdziałających z publicznymi adresami IP
Użyj następującego zapytania, aby wyświetlić ścieżkę obiektu blob dla przepływów w poprzednim zapytaniu.
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
Poprzednie zapytanie tworzy adres URL umożliwiający bezpośredni dostęp do obiektu blob w następujący sposób:
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
Wyświetlanie listy maszyn wirtualnych odbierających większość ruchu lokalnego
Użyj następującego zapytania, aby sprawdzić, które maszyny wirtualne odbierają większość ruchu lokalnego.
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
Wyświetlanie listy adresów IP odbierających większość ruchu lokalnego
Użyj następującego zapytania, aby sprawdzić, które adresy IP odbierają większość ruchu lokalnego.
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
Sprawdzanie odchylenia standardowego w ruchu odbieranych przez maszyny wirtualne
Użyj następującego zapytania, aby sprawdzić odchylenie standardowe w ruchu odbieranym przez maszyny wirtualne z maszyn lokalnych.
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
Sprawdzanie odchylenia standardowego w ruchu odbieranych przez adresy IP
Użyj następującego zapytania, aby sprawdzić odchylenie standardowe w ruchu odbieranym przez adresy IP z maszyn lokalnych.
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
Sprawdzanie, które porty są osiągalne lub blokowane między parami adresów IP przy użyciu reguł sieciowej grupy zabezpieczeń
Użyj następującego zapytania, aby sprawdzić, które porty są osiągalne (lub zablokowane) między parami adresów IP z regułami sieciowej grupy zabezpieczeń.
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
Zapobieganie duplikowaniu rekordów
Jeśli rejestrowanie przepływu jest włączone po obu stronach połączenia, przepływ można przechwycić na wielu urządzeniach. W związku z tym zduplikowane dane mogą pojawić się, jeśli wszystkie dzienniki przepływu są agregowane w tym samym obszarze roboczym usługi Log Analytics. Należy uwzględnić FlowDirection lub MACAddress zapobiec duplikowaniu i odróżnieniu rekordów.
W przepływie/połączeniu:
-
MacAddressokreśla komputer MAC urządzenia, na którym jest przechwytywany przepływ. -
SrcIpokreśla adres IP urządzenia, z którego zainicjowano połączenie. -
DestIpokreśla adres IP urządzenia, do którego nawiązano połączenie. -
FlowDirectionokreśla kierunek połączenia w odniesieniu do urządzenia. Na przykład po nawiązaniu połączenia z maszyny VM1 (IP:10.0.0.4i MAC:A1:B1:C1:D1:E1:F1) do maszyny VM2 (IP:10.0.0.5i MAC:A2:B2:C2:D2:E2:F2), jeśli przepływ zostanie przechwycony w maszynie WIRTUALNEJ VM1FlowDirection, dla tego przepływu będzieOutbound, a jeśli przepływ zostanie przechwycony w maszynie wirtualnej VM2,FlowDirectionto dla tego przepływu będzie .Inbound -
BytesSrcToDest/PacketsSrcToDestokreśla bajty lub pakiety wysyłane ze źródła do miejsca docelowego niezależnie od tego, gdzie zostały przechwycone. -
BytesDestToSrc/PacketsDestToSrcokreśla bajty lub pakiety wysyłane z miejsca docelowego do źródła niezależnie od tego, gdzie zostały przechwycone.
Jeśli na przykład połączenie jest wykonywane z maszyny wirtualnej VM1 do VM2 z następującymi polami.
| maszyna wirtualna | SrcIp | DestIp | MAC | BytesSrcToDest | BytesDestToSrc | FlowDirection |
|---|---|---|---|---|---|---|
| Maszyna wirtualna VM1 | 10.0.0.4 | 10.0.0.5 | A1-B1-C1-D1-E1-F1 | 100 | 200 | Outbound |
| Maszyna wirtualna VM2 | 10.0.0.4 | 10.0.0.5 | A2-B2-C2-D2-E2-F2 | 100 | 200 | Inbound |
Możesz użyć dowolnego z poniższych zapytań, aby obliczyć łączną liczbę bajtów wychodzących dla urządzenia z adresem IP i adresem 10.0.0.4A1:B1:C1:D1:E1:F1MAC dla połączeń inicjowanych przez to urządzenie.
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);
Podobnie można użyć dowolnego z następujących zapytań, aby obliczyć łączną liczbę bajtów wychodzących dla urządzenia z adresem IP i adresem 10.0.0.4A1:B1:C1:D1:E1:F1MAC dla połączeń inicjowanych przez inne urządzenia z tym urządzeniem.
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)
Łączną liczbę bajtów wychodzących dla urządzenia można obliczyć przy użyciu następującego zapytania:
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;