Odczytywanie dzienników przepływu
Ważne
30 września 2027 r. dzienniki przepływów sieciowej grupy zabezpieczeń zostaną wycofane. W ramach tego wycofania nie będzie już można tworzyć nowych dzienników przepływów sieciowej grupy zabezpieczeń od 30 czerwca 2025 r. Zalecamy migrację do dzienników przepływów sieci wirtualnej, co pozwala wyeliminować ograniczenia dzienników przepływów sieciowej grupy zabezpieczeń. Po dacie wycofania analiza ruchu włączona z dziennikami przepływów sieciowej grupy zabezpieczeń nie będzie już obsługiwana, a istniejące zasoby przepływów sieciowej grupy zabezpieczeń w subskrypcjach zostaną usunięte. Jednak rekordy dzienników przepływu sieciowej grupy zabezpieczeń nie zostaną usunięte i będą nadal zgodne z odpowiednimi zasadami przechowywania. Więcej informacji znajdziesz w oficjalnym ogłoszeniu.
Z tego artykułu dowiesz się, jak selektywnie odczytywać fragmenty dzienników przepływu usługi Azure Network Watcher przy użyciu programu PowerShell bez konieczności analizowania całego dziennika. Dzienniki przepływu są przechowywane na koncie magazynu w blokowych obiektach blob. Każdy dziennik to oddzielny blokowy obiekt blob generowany co godzinę i aktualizowany przy użyciu najnowszych danych co kilka minut. Korzystając ze skryptu podanego w tym artykule, możesz odczytać najnowsze dane z dzienników przepływu bez konieczności pobierania całego dziennika.
Pojęcia omówione w tym artykule nie są ograniczone do programu PowerShell i mają zastosowanie do wszystkich języków obsługiwanych przez interfejsy API usługi Azure Storage.
Wymagania wstępne
Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
Program PowerShell zainstalowany na maszynie. Aby uzyskać więcej informacji, zobacz Instalowanie programu PowerShell w systemach Windows, Linux i macOS. Ten artykuł wymaga modułu Az programu PowerShell. Aby uzyskać więcej informacji, zobacz How to install Azure PowerShell (Jak zainstalować program Azure PowerShell). Aby dowiedzieć się, jaka wersja została zainstalowana, uruchom polecenie
Get-Module -ListAvailable Az
.Dzienniki przepływu w regionie lub więcej. Aby uzyskać więcej informacji, zobacz Tworzenie dzienników przepływu sieciowej grupy zabezpieczeń lub Tworzenie dzienników przepływu sieci wirtualnej.
Niezbędne uprawnienia RBAC dla subskrypcji dzienników przepływu i konta magazynu. Aby uzyskać więcej informacji, zobacz Network Watcher RBAC permissions (Uprawnienia RBAC usługi Network Watcher).
Pobieranie listy zablokowanych
Poniższy skrypt programu PowerShell konfiguruje zmienne wymagane do wykonywania zapytań względem obiektu blob dziennika przepływu sieciowej grupy zabezpieczeń i wyświetlania listy blokowych blokowych obiektów blob CloudBlockBlob . Zaktualizuj skrypt, aby zawierał prawidłowe wartości dla środowiska, w szczególności "yourSubscriptionId", "FLOWLOGSVALIDATIONWESTCENTRALUS", "V2VALIDATIONVM-NSG", "yourStorageAccountName", "ml-rg", "000D3AF87856", "11/11/2018 03:00". Na przykład identyfikator subskrypcji powinien zostać zastąpiony identyfikatorem subskrypcji.
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
Zmienna $blockList
zwraca listę bloków w obiekcie blob. Każdy blokowy obiekt blob zawiera co najmniej dwa bloki. Pierwszy blok ma długość 12 bajtów i zawiera nawiasy otwierające dziennika JSON. Drugi blok to nawiasy zamykające i ma długość 2 bajtów. Poniższy przykładowy dziennik zawiera siedem pojedynczych wpisów. Wszystkie nowe wpisy w dzienniku są dodawane do końca bezpośrednio przed ostatnim blokiem.
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
Odczytywanie blokowego obiektu blob
W tej sekcji odczytujesz zmienną $blocklist
, aby pobrać dane. W poniższym przykładzie iterujemy przez listę bloków, aby odczytywać bajty z każdego bloku i przechowywać je w tablicy. Użyj metody DownloadRangeToByteArray, aby pobrać dane.
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
Tablica $valuearray
zawiera teraz wartość ciągu każdego bloku. Aby sprawdzić wpis, pobierz drugą do ostatniej wartości z tablicy, uruchamiając polecenie $valuearray[$valuearray.Length-2]
. Nie potrzebujesz ostatniej wartości, ponieważ jest to nawias zamykający.
Wyniki tej wartości są wyświetlane w poniższym przykładzie:
{
"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"
]
}
]
}
]
}
}
]
}