Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtig
Die Ablaufprotokolle der Netzwerksicherheitsgruppe (Network Security Group, NSG) werden am 30. September 2027 eingestellt. Nach dem 30. Juni 2025 können Sie keine neuen NSG-Flussprotokolle mehr erstellen. Es wird empfohlen, zu virtuellen Netzwerkflussprotokollen zu migrieren, die die Einschränkungen von NSG-Flussprotokollen beheben. Nach dem Ausmusterungsdatum werden die für NSG-Flussprotokolle aktivierten Verkehrsanalysefunktionen nicht mehr unterstützt, und vorhandene NSG-Flussprotokollressourcen in Ihren Abonnements werden gelöscht. Vorhandene NSG-Ablaufprotokolldatensätze werden jedoch nicht aus Azure Storage gelöscht und folgen weiterhin ihren konfigurierten Aufbewahrungsrichtlinien. Weitere Informationen finden Sie in der offiziellen Ankündigung.
In diesem Artikel erfahren Sie, wie Sie Teile von Azure Network Watcher-Datenflussprotokollen selektiv mithilfe von PowerShell lesen, ohne das gesamte Protokoll parsen zu müssen. Datenflussprotokolle werden in einem Speicherkonto in Blockblobs gespeichert. Jedes Protokoll ist ein separates Blockblob, das jede Stunde generiert und alle paar Minuten mit den neuesten Daten aktualisiert wird. Mithilfe des in diesem Artikel bereitgestellten Skripts können Sie die neuesten Daten aus den Datenflussprotokollen lesen, ohne das gesamte Protokoll herunterladen zu müssen.
Die in diesem Artikel besprochenen Konzepte sind jedoch nicht auf PowerShell beschränkt und lassen sich auf alle Programmiersprachen anwenden, die von den Azure Storage APIs unterstützt werden.
Voraussetzungen
Ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.
PowerShell muss auf Ihrem Computer installiert sein. Weitere Informationen finden Sie unter Installieren von PowerShell unter Windows, Linux und macOS. Für diesen Artikel ist das Az PowerShell-Modul erforderlich. Weitere Informationen finden Sie unter Installieren von Azure PowerShell. Führen Sie
Get-Module -ListAvailable Azaus, um die installierte Version zu ermitteln.Datenflussprotokolle in mindestens einer Region. Weitere Informationen finden Sie unter Erstellen von Datenflussprotokollen für Netzwerksicherheitsgruppen oder Erstellen von Datenflussprotokollen für virtuelle Netzwerke.
Erforderliche Berechtigungen der rollenbasierten Zugriffssteuerung von Azure (Azure RBAC) für die Abonnements der Flussprotokolle und des Speicherkontos. Weitere Informationen finden Sie unter RBAC-Berechtigungen für Network Watcher.
Abrufen der Sperrliste
In diesem Abschnitt richten Sie die Variablen ein, die zum Abfragen des Flussprotokoll-Blobs erforderlich sind, und listen die Blöcke im CloudBlockBlob-Blockblob auf.
Aktualisieren Sie das PowerShell-Skript mit gültigen Werten für Ihre Umgebung.
function Get-VNetFlowLogCloudBlockBlob {
[CmdletBinding()]
param (
[string] [Parameter(Mandatory=$true)] $subscriptionId,
[string] [Parameter(Mandatory=$true)] $region,
[string] [Parameter(Mandatory=$true)] $VNetFlowLogName,
[string] [Parameter(Mandatory=$true)] $storageAccountName,
[string] [Parameter(Mandatory=$true)] $storageAccountResourceGroup,
[string] [Parameter(Mandatory=$true)] $macAddress,
[datetime] [Parameter(Mandatory=$true)] $logTime
)
process {
# Retrieve the primary storage account key to access the virtual network flow logs
$StorageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $storageAccountResourceGroup -Name $storageAccountName).Value[0]
# Setup a new storage context to be used to query the logs
$ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $StorageAccountKey
# Container name used by virtual network flow logs
$ContainerName = "insights-logs-flowlogflowevent"
# Name of the blob that contains the virtual network flow log
$BlobName = "flowLogResourceID=/$($subscriptionId.ToUpper())_NETWORKWATCHERRG/NETWORKWATCHER_$($region.ToUpper())_$($VNetFlowLogName.ToUpper())/y=$($logTime.Year)/m=$(($logTime).ToString("MM"))/d=$(($logTime).ToString("dd"))/h=$(($logTime).ToString("HH"))/m=00/macAddress=$($macAddress)/PT1H.json"
# Gets the storage blog
$Blob = Get-AzStorageBlob -Context $ctx -Container $ContainerName -Blob $BlobName
# Gets the block blog of type 'Microsoft.Azure.Storage.Blob.CloudBlob' from the storage blob
$CloudBlockBlob = [Microsoft.Azure.Storage.Blob.CloudBlockBlob] $Blob.ICloudBlob
#Return the Cloud Block Blob
$CloudBlockBlob
}
}
function Get-VNetFlowLogBlockList {
[CmdletBinding()]
param (
[Microsoft.Azure.Storage.Blob.CloudBlockBlob] [Parameter(Mandatory=$true)] $CloudBlockBlob
)
process {
# Stores the block list in a variable from the block blob.
$blockList = $CloudBlockBlob.DownloadBlockListAsync()
# Return the Block List
$blockList
}
}
$CloudBlockBlob = Get-VNetFlowLogCloudBlockBlob -subscriptionId "yourSubscriptionId" -region "yourVNetFlowLogRegion" -VNetFlowLogName "yourVNetFlowLogName" -storageAccountName "yourStorageAccountName" -storageAccountResourceGroup "yourStorageAccountRG" -macAddress "0022485D8CF8" -logTime "07/09/2023 03:00"
$blockList = Get-VNetFlowLogBlockList -CloudBlockBlob $CloudBlockBlob
Die $blockList-Variable gibt eine Liste der Blöcke im Blob zurück. Jeder Blockblob enthält mindestens zwei Blöcke. Der erste Block weist eine Länge von 12 Byte auf und enthält die öffnenden Klammern des JSON-Protokolls. Der andere Block enthält die schließenden Klammern und hat eine Länge von 2 Byte. Das folgende Beispielprotokoll enthält sieben einzelne Einträge. Alle neuen Einträge im Protokoll werden am Ende unmittelbar vor dem letzten Block hinzugefügt.
Name Length Committed
---- ------ ---------
ZDk5MTk5N2FkNGE0MmY5MTk5ZWViYjA0YmZhODRhYzY= 12 True
NzQxNDA5MTRhNDUzMGI2M2Y1MDMyOWZlN2QwNDZiYzQ= 2685 True
ODdjM2UyMWY3NzFhZTU3MmVlMmU5MDNlOWEwNWE3YWY= 2586 True
ZDU2MjA3OGQ2ZDU3MjczMWQ4MTRmYWNhYjAzOGJkMTg= 2688 True
ZmM3ZWJjMGQ0ZDA1ODJlOWMyODhlOWE3MDI1MGJhMTc= 2775 True
ZGVkYTc4MzQzNjEyMzlmZWE5MmRiNjc1OWE5OTc0OTQ= 2676 True
ZmY2MjUzYTIwYWIyOGU1OTA2ZDY1OWYzNmY2NmU4ZTY= 2777 True
Mzk1YzQwM2U0ZWY1ZDRhOWFlMTNhYjQ3OGVhYmUzNjk= 2675 True
ZjAyZTliYWE3OTI1YWZmYjFmMWI0MjJhNzMxZTI4MDM= 2 True
Lesen des Blockblobs
In diesem Abschnitt lesen Sie die $blocklist-Variable, um die Daten abzurufen. Im nachfolgenden Beispiel wird die Liste der Blöcke durchlaufen, um die Bytes aus den einzelnen Blöcken zu lesen und in einem Array zu speichern. Rufen Sie die Daten mit der DownloadRangeToByteArray-Methode ab.
function Get-VNetFlowLogReadBlock {
[CmdletBinding()]
param (
[System.Array] [Parameter(Mandatory=$true)] $blockList,
[Microsoft.Azure.Storage.Blob.CloudBlockBlob] [Parameter(Mandatory=$true)] $CloudBlockBlob
)
$blocklistResult = $blockList.Result
# Set the size of the byte array to the largest block
$maxvalue = ($blocklistResult | Measure-Object Length -Maximum).Maximum
Write-Host "Max value is ${maxvalue}"
# Create an array to store values in
$valuearray = @()
# Define the starting index to track the current block being read
$index = 0
# Loop through each block in the block list
for($i=0; $i -lt $blocklistResult.count; $i++)
{
# Create a byte array object to story the bytes from the block
$downloadArray = New-Object -TypeName byte[] -ArgumentList $maxvalue
# Download the data into the ByteArray, starting with the current index, for the number of bytes in the current block. Index is increased by 3 when reading to remove preceding comma.
$CloudBlockBlob.DownloadRangeToByteArray($downloadArray,0,$index, $($blockListResult[$i].Length)) | Out-Null
# Increment the index by adding the current block length to the previous index
$index = $index + $blockListResult[$i].Length
# Retrieve the string from the byte array
$value = [System.Text.Encoding]::ASCII.GetString($downloadArray)
# Add the log entry to the value array
$valuearray += $value
}
#Return the Array
$valuearray
}
$valuearray = Get-VNetFlowLogReadBlock -blockList $blockList -CloudBlockBlob $CloudBlockBlob
Das $valuearray-Array enthält nun den Zeichenfolgenwert jedes Blocks. Um den Eintrag zu überprüfen, rufen Sie den zweitletzten Wert aus dem Array ab. Führen Sie dazu $valuearray[$valuearray.Length-2] aus. Der letzte Wert ist die schließende Klammer und wird daher von Ihnen nicht gebraucht.
Die Ergebnisse dieses Werts werden im folgenden Beispiel gezeigt:
{
"time": "2023-07-09T03:59:30.2837112Z",
"flowLogVersion": 4,
"flowLogGUID": "abcdef01-2345-6789-0abc-def012345678",
"macAddress": "0022485D8CF8",
"category": "FlowLogFlowEvent",
"flowLogResourceID": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/NETWORKWATCHERRG/PROVIDERS/MICROSOFT.NETWORK/NETWORKWATCHERS/NETWORKWATCHER_EASTUS/FLOWLOGS/MYVNET-MYRESOURCEGROUP-FLOWLOG",
"targetResourceID": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNet",
"operationName": "FlowLogFlowEvent",
"flowRecords": {
"flows": [
{
"aclID": "00000000-1234-abcd-ef00-c1c2c3c4c5c6",
"flowGroups": [
{
"rule": "BlockHighRiskTCPPortsFromInternet",
"flowTuples": [
"1688875131557,45.119.212.87,192.168.0.4,53018,3389,6,I,D,NX,0,0,0,0"
]
},
{
"rule": "Internet",
"flowTuples": [
"1688875103311,35.203.210.145,192.168.0.4,56688,52113,6,I,D,NX,0,0,0,0",
"1688875119073,162.216.150.87,192.168.0.4,50111,9920,6,I,D,NX,0,0,0,0",
"1688875119910,205.210.31.253,192.168.0.4,54699,1801,6,I,D,NX,0,0,0,0",
"1688875121510,35.203.210.49,192.168.0.4,49250,33013,6,I,D,NX,0,0,0,0",
"1688875121684,162.216.149.206,192.168.0.4,49776,1290,6,I,D,NX,0,0,0,0",
"1688875124012,91.148.190.134,192.168.0.4,57963,40544,6,I,D,NX,0,0,0,0",
"1688875138568,35.203.211.204,192.168.0.4,51309,46956,6,I,D,NX,0,0,0,0",
"1688875142490,205.210.31.18,192.168.0.4,54140,30303,6,I,D,NX,0,0,0,0",
"1688875147864,194.26.135.247,192.168.0.4,53583,20232,6,I,D,NX,0,0,0,0"
]
}
]
}
]
}
}