Lire les journaux de flux
Important
Le 30 septembre 2027, les journaux de flux de groupe de sécurité réseau (NSG) seront mis hors service. Dans le cadre de cette mise hors service, vous ne pourrez plus créer de journaux de flux de NSG à compter du 30 juin 2025. Nous vous recommandons de migrer vers des journaux de flux de réseau virtuel, qui surmontent les limitations des journaux de flux de NSG. Après la date de mise hors service, l’analytique du trafic activée avec les journaux de flux de NSG ne sera plus prise en charge, et les ressources de journaux de flux de NSG existantes dans vos abonnements seront supprimées. Toutefois, les enregistrements des journaux de flux de NSG ne seront pas supprimés et continueront de suivre leurs stratégies de rétention respectives. Pour plus d’informations, consultez l’annonce officielle.
Dans cet article, vous apprendrez à lire sélectivement des parties des journaux de flux d’Azure Network Watcher à l’aide de PowerShell sans avoir à analyser l’ensemble du journal. Les journaux de flux sont stockés dans un compte de stockage en objet blob de blocs. Chaque journal est un objet blob de blocs distinct généré toutes les heures et mis à jour avec les données les plus récentes toutes les quelques minutes. En utilisant le script fourni dans cet article, vous pouvez lire les dernières données des journaux de flux sans avoir à télécharger l’intégralité du journal.
Les concepts abordés dans cet article ne se limitent pas à PowerShell et sont applicables à tous les langages pris en charge par les API de stockage Azure.
Prérequis
Compte Azure avec un abonnement actif. Créez un compte gratuitement.
PowerShell installé sur votre ordinateur. Pour plus d’informations, consultez Installer PowerShell sur Windows, Linux et macOS. Cet article nécessite le module Az PowerShell. Pour plus d’informations, consultez Comment installer Azure PowerShell. Pour trouver la version installée, exécutez
Get-Module -ListAvailable Az
.Journaux de flux dans une ou plusieurs régions. Pour plus d’informations, consultez Créer des journaux de flux de groupe de sécurité réseau ou Créer des journaux de flux de réseau virtuel.
Autorisations RBAC nécessaires pour les abonnements des journaux de flux et du compte de stockage. Pour plus d’informations, consultez Autorisations RBAC Network Watcher.
Récupérer la liste de refus
Le script de la commande PowerShell suivante définit les variables nécessaires pour interroger l’objet blob des journaux de flux de groupe de sécurité réseau et répertorier les blocs dans l’objet blob de blocs CloudBlockBlob. Mettez à jour le script pour contenir des valeurs valides pour votre environnement, en particulier « yourSubscriptionId », « FLOWLOGSVALIDATIONWESTCENTRALUS », « V2VALIDATIONVM-NSG », « yourStorageAccountName », « ml-rg », « 000D3AF87856 », « 11/11/2018 03:00 ». Par exemple, votre SubscriptionId doit être remplacé par votre ID d’abonnement.
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
La variable $blockList
renvoie une liste des blocs dans l’objet blob. Chaque objet blob de blocs contient au moins deux blocs. Le premier bloc a une longueur de 12 octets et contient les crochets d’ouverture du journal JSON. L’autre bloc contient les crochets fermant avec une longueur de 2 octets. L’exemple de journal suivant contient sept entrées individuelles. Toutes les nouvelles entrées dans le journal sont ajoutées à la fin, juste avant le dernier bloc.
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
Lire l’objet blob de blocs
Dans cette section, vous lisez la variable $blocklist
pour récupérer les données. Dans l’exemple suivant, nous parcourons la liste de blocage pour lire les octets de chaque bloc et les stocker dans un tableau. Utilisez la méthode DownloadRangeToByteArray pour récupérer les données.
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
Le $valuearray
tableau contient maintenant la valeur de la chaîne de caractères de chaque bloc. Pour vérifier l’entrée, enregistrez le deuxième à la dernière valeur du tableau en exécutant $valuearray[$valuearray.Length-2]
. Vous n’avez pas besoin de la dernière valeur, car il s’agit du crochet fermant.
Les résultats de cette valeur sont affichés dans l’exemple suivant :
{
"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"
]
}
]
}
]
}
}
]
}