Lesen von NSG-DatenflussprotokollenRead NSG flow logs

Hier erfahren Sie, wie NSG-Datenflussprotokolle mit PowerShell gelesen werden.Learn how to read NSG flow logs entries with PowerShell.

NSG-Datenflussprotokolle werden in einem Speicherkonto in Blockblobs gespeichert.NSG flow logs are stored in a storage account in block blobs. Blockblobs setzen sich aus kleineren Blöcken zusammen.Block blobs are made up of smaller blocks. Jedes Protokoll stellt einen separaten Blockblob dar, der einmal pro Stunde generiert wird.Each log is a separate block blob that is generated every hour. Neue Protokolle werden stündlich generiert. Die Protokolle werden anhand der neuesten Daten alle paar Minuten mit neuen Einträgen aktualisiert.New logs are generated every hour, the logs are updated with new entries every few minutes with the latest data. In diesem Artikel erfahren Sie, wie Sie Teile der Datenflussprotokolle lesen können.In this article you learn how to read portions of the flow logs.

Hinweis

Dieser Artikel wurde aktualisiert und beinhaltet jetzt das neue Az-Modul von Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Weitere Informationen zum neuen Az-Modul und zur Kompatibilität mit AzureRM finden Sie unter Introducing the new Azure PowerShell Az module (Einführung in das neue Az-Modul von Azure PowerShell).To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Anweisungen zur Installation finden Sie unter Install Azure PowerShell (Installieren von Azure PowerShell).For installation instructions, see Install Azure PowerShell.

SzenarioScenario

Im folgenden Beispiel liegt ein Beispiel-Datenflussprotokoll vor, das in einem Speicherkonto gespeichert ist.In the following scenario, you have an example flow log that is stored in a storage account. Sie erfahren, wie Sie selektiv die aktuellen Ereignisse in NSG-Datenflussprotokollen lesen.You learn how to selectively read the latest events in NSG flow logs. In diesem Artikel verwenden Sie PowerShell. Die erörterten Konzepte sind jedoch nicht auf diese Programmiersprache beschränkt und gelten für alle Sprachen, die von den Azure Storage-APIs unterstützt werden.In this article you use PowerShell, however, the concepts discussed in the article are not limited to the programming language, and are applicable to all languages supported by the Azure Storage APIs.

EinrichtungSetup

Bevor Sie beginnen, müssen Sie die NSG-Datenflussprotokollierung für mindestens eine Netzwerksicherheitsgruppe Ihres Kontos aktiviert haben.Before you begin, you must have Network Security Group Flow Logging enabled on one or many Network Security Groups in your account. Eine Anleitung zum Aktivieren von Netzwerksicherheits-Flowprotokollen finden Sie in folgendem Artikel: Einführung in die Datenflussprotokollierung für Netzwerksicherheitsgruppen.For instructions on enabling Network Security flow logs, refer to the following article: Introduction to flow logging for Network Security Groups.

Abrufen der Liste der BlöckeRetrieve the block list

Mit dem folgenden PowerShell-Skript werden die erforderlichen Variablen zum Abfragen des Blobs mit dem NSG-Datenflussprotokoll eingerichtet, und die Blöcke im Blockblob CloudBlockBlob werden aufgelistet.The following PowerShell sets up the variables needed to query the NSG flow log blob and list the blocks within the CloudBlockBlob block blob. Aktualisieren Sie das Skript so, dass es gültige Werte für Ihre Umgebung enthält.Update the script to contain valid values for your environment.

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 NSG 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 NSG flow logs
        $ContainerName = "insights-logs-networksecuritygroupflowevent"

        # Name of the blob that contains the NSG 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.WindowsAzure.Storage.Blob.CloudBlob' from the storage blob
        $CloudBlockBlob = [Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob] $Blob.ICloudBlob

        #Return the Cloud Block Blob
        $CloudBlockBlob
    }
}

function Get-NSGFlowLogBlockList  {
    [CmdletBinding()]
    param (
        [Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob] [Parameter(Mandatory=$true)] $CloudBlockBlob
    )
    process {
        # Stores the block list in a variable from the block blob.
        $blockList = $CloudBlockBlob.DownloadBlockList()

        # 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.The $blockList variable returns a list of the blocks in the blob. Jeder Blockblob enthält mindestens zwei Blöcke.Each block blob contains at least two blocks. Der erste Block weist eine Länge von 12 Byte auf; dieser Block enthält die öffnenden Klammern des json-Protokolls.The first block has a length of 12 bytes, this block contains the opening brackets of the json log. Der andere Block enthält die schließenden Klammern und hat eine Länge von 2 Byte.The other block is the closing brackets and has a length of 2 bytes. Wie Sie sehen, enthält das folgende Beispielprotokoll sieben Einträge, von denen jeder einen Einzeleintrag darstellt.As you can see the following example log has seven entries in it, each being an individual entry. Alle neuen Einträge im Protokoll werden am Ende unmittelbar vor dem letzten Block hinzugefügt.All new entries in the log are added to the end right before the final block.

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 BlockblobsRead the block blob

Nun müssen Sie die $blocklist-Variable lesen, um die Daten abzurufen.Next you need to read the $blocklist variable to retrieve the data. In diesem Beispiel wird die Liste der Blöcke durchlaufen, die Bytes werden aus den einzelnen Blöcken gelesen und in einem Array gespeichert.In this example we iterate through the blocklist, read the bytes from each block and story them in an array. Rufen Sie die Daten mit der DownloadRangeToByteArray-Methode ab.Use the DownloadRangeToByteArray method to retrieve the data.

function Get-NSGFlowLogReadBlock  {
    [CmdletBinding()]
    param (
        [System.Array] [Parameter(Mandatory=$true)] $blockList,
        [Microsoft.WindowsAzure.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-1)) | 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

Nun enthält das $valuearray-Array den Zeichenfolgenwert jedes Blocks.Now the $valuearray array contains the string value of each block. Um den Eintrag zu überprüfen, rufen Sie den zweitletzten Wert aus dem Array ab. Führen Sie dazu $valuearray[$valuearray.Length-2] aus.To verify the entry, get the second to the last value from the array by running $valuearray[$valuearray.Length-2]. Der letzte Wert ist die schließende Klammer und daher von Ihnen nicht gewünscht.You do not want the last value, because it is the closing bracket.

Die Ergebnisse dieses Werts werden im folgenden Beispiel gezeigt:The results of this value are shown in the following example:

        {
             "time": "2017-06-16T20:59:43.7340000Z",
             "systemId": "5f4d02d3-a7d0-4ed4-9ce8-c0ae9377951c",
             "category": "NetworkSecurityGroupFlowEvent",
             "resourceId": "/SUBSCRIPTIONS/00000000-0000-0000-0000-000000000000/RESOURCEGROUPS/CONTOSORG/PROVIDERS/MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/CONTOSONSG",
             "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","14976
46732,10.0.0.4,52.240.48.24,45236,443,T,O,A","1497646735,10.0.0.4,168.62.32.14,44928,443,T,O,A","1497646735,10.0.0.4,52.240.48.24,45242,443,T,O,A","1497646738,10.0.0.4,168.62.32.14,44934,443,T,O,A","1497646738,10.0.0.4,52.240.48.24,45248,443,T,O,
A","1497646742,10.0.0.4,168.62.32.14,44942,443,T,O,A","1497646742,10.0.0.4,52.240.48.24,45256,443,T,O,A","1497646745,10.0.0.4,168.62.32.14,44948,443,T,O,A","1497646745,10.0.0.4,52.240.48.24,45262,443,T,O,A","1497646749,10.0.0.4,168.62.32.14,44954
,443,T,O,A","1497646749,10.0.0.4,52.240.48.24,45268,443,T,O,A","1497646753,10.0.0.4,168.62.32.14,44960,443,T,O,A","1497646753,10.0.0.4,52.240.48.24,45274,443,T,O,A","1497646756,10.0.0.4,168.62.32.14,44966,443,T,O,A","1497646756,10.0.0.4,52.240.48
.24,45280,443,T,O,A","1497646759,10.0.0.4,168.62.32.14,44972,443,T,O,A","1497646759,10.0.0.4,52.240.48.24,45286,443,T,O,A","1497646763,10.0.0.4,168.62.32.14,44978,443,T,O,A","1497646763,10.0.0.4,52.240.48.24,45292,443,T,O,A","1497646766,10.0.0.4,
168.62.32.14,44984,443,T,O,A","1497646766,10.0.0.4,52.240.48.24,45298,443,T,O,A","1497646769,10.0.0.4,168.62.32.14,44990,443,T,O,A","1497646769,10.0.0.4,52.240.48.24,45304,443,T,O,A","1497646773,10.0.0.4,168.62.32.14,44996,443,T,O,A","1497646773,
10.0.0.4,52.240.48.24,45310,443,T,O,A","1497646776,10.0.0.4,168.62.32.14,45002,443,T,O,A","1497646776,10.0.0.4,52.240.48.24,45316,443,T,O,A","1497646779,10.0.0.4,168.62.32.14,45008,443,T,O,A","1497646779,10.0.0.4,52.240.48.24,45322,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"]}]}]}
        }

Anhand dieses Szenarios wird beispielhaft veranschaulicht, wie Einträge in NSG-Datenflussprotokollen gelesen werden, ohne dass das gesamte Protokoll analysiert werden muss.This scenario is an example of how to read entries in NSG flow logs without having to parse the entire log. Sie können neue Einträge im Protokoll lesen, da diese unter Verwendung der Block-ID geschrieben wurden. Sie können dazu auch die Länge der im Blockblob gespeicherten Blöcke verfolgen.You can read new entries in the log as they are written by using the block ID or by tracking the length of blocks stored in the block blob. Dadurch können Sie ausschließlich die neuen Einträge lesen.This allows you to read only the new entries.

Nächste SchritteNext steps

Unter Verwenden von Elastic Stack, Verwenden von Grafana und Verwenden von Graylog erfahren Sie mehr zu den Möglichkeiten zum Anzeigen von NSG-Flussprotokollen.Visit Use Elastic Stack, Use Grafana, and Use Graylog to learn more about ways to view NSG flow logs. Ein Open-Source-Ansatz für Azure Functions, um die Blobs direkt zu nutzen und an verschiedene Consumer von Protokollanalysen zu senden, finden Sie hier: AzureNetworkWatcherNSGFlowLogsConnector.An Open Source Azure Function approach to consuming the blobs directly and emitting to various log analytics consumers may be found here: Azure Network Watcher NSG Flow Logs Connector.

Weitere Informationen zu Speicherblobs erhalten Sie im Artikel: Azure Blob Storage-Bindungen für Azure Functions.To learn more about storage blobs visit: Azure Functions Blob storage bindings