Lesen von Datenflussprotokollen
Wichtig
Am 30. September 2027 werden NSG-Datenflussprotokolle (Netzwerksicherheitsgruppe) eingestellt. Aufgrund dieser Einstellung können Sie ab dem 30. Juni 2025 keine neuen NSG-Datenflussprotokolle mehr erstellen. Es wird empfohlen, zu Datenflussprotokollen für virtuelle Netzwerke zu migrieren, bei denen die Einschränkungen von NSG-Datenflussprotokollen nicht gelten. Nach dem Einstellungsdatum wird die Aktivierung der Datenverkehrsanalyse mit NSG-Datenflussprotokollen nicht mehr unterstützt, und vorhandene Ressourcen für NSG-Datenflussprotokolle in Ihren Abonnements werden gelöscht. NSG-Datenflussprotokolle werden jedoch nicht gelöscht, und es gelten weiterhin die jeweiligen 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 analysieren 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 Az
aus, 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 RBAC-Berechtigungen für die Abonnements von Datenflussprotokollen und Speicherkonten. Weitere Informationen finden Sie unter Erforderliche Berechtigungen der rollenbasierten Zugriffssteuerung von Azure zum Verwenden von Network Watcher-Funktionen.
Abrufen der Sperrliste
Mit dem folgenden PowerShell-Skript werden die erforderlichen Variablen zum Abfragen des Blobs mit dem Datenflussprotokoll der Netzwerksicherheitsgruppe eingerichtet und die Blöcke im Blockblob CloudBlockBlob aufgelistet. Aktualisieren Sie das Skript so, dass es gültige Werte für Ihre Umgebung enthält, insbesondere „yourSubscriptionId“, „FLOWLOGSVALIDATIONWESTCENTRALUS“, „V2VALIDATIONVM-NSG“, „yourStorageAccountName“, „ml-rg“, „000D3AF87856“, „11/11/2018 03:00“. Ihre SubscriptionId sollte beispielsweise durch Ihre Abonnement-ID ersetzt werden.
function Get-NSGFlowLogCloudBlockBlob {
[CmdletBinding()]
param (
[string] [Parameter(Mandatory=$true)] $subscriptionId,
[string] [Parameter(Mandatory=$true)] $NSGResourceGroupName,
[string] [Parameter(Mandatory=$true)] $NSGName,
[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 network security group 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 network security group flow logs
$ContainerName = "insights-logs-networksecuritygroupflowevent"
# Name of the blob that contains the network security group flow log
$BlobName = "resourceId=/SUBSCRIPTIONS/${subscriptionId}/RESOURCEGROUPS/${NSGResourceGroupName}/PROVIDERS/MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/${NSGName}/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-NSGFlowLogBlockList {
[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-NSGFlowLogCloudBlockBlob -subscriptionId "yourSubscriptionId" -NSGResourceGroupName "FLOWLOGSVALIDATIONWESTCENTRALUS" -NSGName "V2VALIDATIONVM-NSG" -storageAccountName "yourStorageAccountName" -storageAccountResourceGroup "ml-rg" -macAddress "000D3AF87856" -logTime "11/11/2018 03:00"
$blockList = Get-NSGFlowLogBlockList -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-NSGFlowLogReadBlock {
[CmdletBinding()]
param (
[System.Array] [Parameter(Mandatory=$true)] $blockList,
[Microsoft.Azure.Storage.Blob.CloudBlockBlob] [Parameter(Mandatory=$true)] $CloudBlockBlob
)
# Set the size of the byte array to the largest block
$maxvalue = ($blocklist | measure Length -Maximum).Maximum
# 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 $blocklist.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, $($blockList[$i].Length)) | Out-Null
# Increment the index by adding the current block length to the previous index
$index = $index + $blockList[$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-NSGFlowLogReadBlock -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:
{
"records": [
{
"time": "2017-06-16T20:59:43.7340000Z",
"systemId": "abcdef01-2345-6789-0abc-def012345678",
"category": "NetworkSecurityGroupFlowEvent",
"resourceId": "/SUBSCRIPTIONS/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/RESOURCEGROUPS/MYRESOURCEGROUP/PROVIDERS/MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/MYNSG",
"operationName": "NetworkSecurityGroupFlowEvents",
"properties": {
"Version": 1,
"flows": [
{
"rule": "DefaultRule_AllowInternetOutBound",
"flows": [
{
"mac": "000D3A18077E",
"flowTuples": [
"1497646722,10.0.0.4,168.62.32.14,44904,443,T,O,A",
"1497646722,10.0.0.4,52.240.48.24,45218,443,T,O,A",
"1497646725,10.0.0.4,168.62.32.14,44910,443,T,O,A",
"1497646725,10.0.0.4,52.240.48.24,45224,443,T,O,A",
"1497646728,10.0.0.4,168.62.32.14,44916,443,T,O,A",
"1497646728,10.0.0.4,52.240.48.24,45230,443,T,O,A",
"1497646732,10.0.0.4,168.62.32.14,44922,443,T,O,A",
"1497646732,10.0.0.4,52.240.48.24,45236,443,T,O,A"
]
}
]
},
{
"rule": "DefaultRule_DenyAllInBound",
"flows": []
},
{
"rule": "UserRule_ssh-rule",
"flows": []
},
{
"rule": "UserRule_web-rule",
"flows": [
{
"mac": "000D3A18077E",
"flowTuples": [
"1497646738,13.82.225.93,10.0.0.4,1180,80,T,I,A",
"1497646750,13.82.225.93,10.0.0.4,1184,80,T,I,A",
"1497646768,13.82.225.93,10.0.0.4,1181,80,T,I,A",
"1497646780,13.82.225.93,10.0.0.4,1336,80,T,I,A"
]
}
]
}
]
}
}
]
}