Akış günlüklerini okuma
Önemli
30 Eylül 2027'de ağ güvenlik grubu (NSG) akış günlükleri kullanımdan kaldırılacaktır. Bu kullanımdan kaldırmanın bir parçası olarak 30 Haziran 2025'den itibaren yeni NSG akış günlükleri oluşturamayacaksınız. NSG akış günlüklerinin sınırlamalarını aşan sanal ağ akış günlüklerine geçiş yapmanızı öneririz. Kullanımdan kaldırma tarihinden sonra NSG akış günlükleriyle etkinleştirilen trafik analizi artık desteklenmeyecektir ve aboneliklerinizdeki mevcut NSG akış günlükleri kaynakları silinir. Ancak NSG akış günlükleri kayıtları silinmez ve ilgili bekletme ilkelerini izlemeye devam eder. Daha fazla bilgi için resmi duyuruya bakın.
Bu makalede, tüm günlüğü ayrıştırmak zorunda kalmadan PowerShell kullanarak Azure Ağ İzleyicisi akış günlüklerinin bölümlerini seçmeli olarak okumayı öğreneceksiniz. Akış günlükleri blok bloblarındaki bir depolama hesabında depolanır. Her günlük, saatte bir oluşturulan ve birkaç dakikada bir en son verilerle güncelleştirilen ayrı bir blok blobudur. Bu makalede sağlanan betiği kullanarak günlüklerin tamamını indirmek zorunda kalmadan akış günlüklerindeki en son verileri okuyabilirsiniz.
Bu makalede açıklanan kavramlar PowerShell ile sınırlı değildir ve Azure Depolama API'leri tarafından desteklenen tüm diller için geçerlidir.
Önkoşullar
Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
Makinenizde Yüklü PowerShell. Daha fazla bilgi için bkz . Windows, Linux ve macOS'a PowerShell yükleme. Bu makale, Az PowerShell modülünü gerektirir. Daha fazla bilgi için bkz . Azure PowerShell'i yükleme. Yüklü sürümü bulmak için
Get-Module -ListAvailable Az
komutunu çalıştırın.Bir bölgede veya daha fazla bölgede akış günlükleri. Daha fazla bilgi için bkz . Ağ güvenlik grubu akış günlükleri oluşturma veya Sanal ağ akış günlükleri oluşturma.
Akış günlükleri ve depolama hesabı abonelikleri için gerekli RBAC izinleri. Daha fazla bilgi için bkz. RBAC izinlerini Ağ İzleyicisi.
Blok listesini alma
Aşağıdaki PowerShell betiği, ağ güvenlik grubu akış günlüğü blobunu sorgulamak ve CloudBlockBlob blok blobu içindeki blokları listelemek için gereken değişkenleri ayarlar. Betiği ortamınız için geçerli değerler içerecek şekilde güncelleştirin; özellikle "yourSubscriptionId", "FLOWLOGSVALIDATIONWESTCENTRALUS", "V2VALIDATIONVM-NSG", "yourStorageAccountName", "ml-rg", "000D3AF87856", "11/11/2018 03:00". Örneğin, yourSubscriptionId değerinin abonelik kimliğiniz ile değiştirilmesi gerekir.
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
değişkeni blobdaki $blockList
blokların listesini döndürür. Her blok blobu en az iki blok içerir. İlk bloğun uzunluğu 12 bayttır ve JSON günlüğünün açma köşeli ayraçlarını içerir. Diğer blok, kapatma köşeli ayraçlarıdır ve uzunluğu 2 bayttır. Aşağıdaki örnek günlükte yedi ayrı giriş vardır. Günlükteki tüm yeni girdiler, son bloğun hemen önüne eklenir.
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
Blok blobunu okuma
Bu bölümde, verileri almak için değişkenini okuyacaksınız $blocklist
. Aşağıdaki örnekte, her bloktaki baytları okumak ve bunları bir dizide depolamak için blok listesi üzerinden yineleyeceğiz. Verileri almak için DownloadRangeToByteArray yöntemini kullanın.
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
Dizi $valuearray
artık her bloğun dize değerini içerir. Girdiyi doğrulamak için komutunu çalıştırarak $valuearray[$valuearray.Length-2]
dizideki ikinci değerden son değere geçin. Kapanış köşeli ayracı olduğundan son değere ihtiyacınız yoktur.
Bu değerin sonuçları aşağıdaki örnekte gösterilmiştir:
{
"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"
]
}
]
}
]
}
}
]
}