NSG Flow Log を Azure PowerShell で扱いたい

NSG Flow Log を Azure Storage にエクスポートしておいても、JSON のままだと解析が難しいので Tuple (IP / Port, etc…) だけ簡単に抽出できる PowerShell を書いてみました。

Traffic Analytics を有効化して Log Analytics で Kusto クエリを使う方がおすすめですが、有効化し忘れてて JSON を生で見るしか無い時などで使ってみてください。ログの量が多いと非常に時間がかかるので、適当に条件追加してフィルターしたりしていただければと。

# 各種パラメーター (要変更)
$ResourceGroupName = "RG-Name"
$StorageName = "StrName"
$LogPath = "C:\Users\UserName\Desktop\NsgFlowLog\"    # 作成済みのフォルダを指定、末尾に \ が必要
$ResultPath = "C:\Users\UserName\Desktop\NsgFlowLog\"     # 同上

# Azure Storage へのアクセス用の認証情報を取得
$StorageAccount = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageName
$Context = $StorageAccount.Context

# Blob から NSG フロー ログをダウンロード
Get-AzStorageBlob -Container "insights-logs-networksecuritygroupflowevent" -Context $Context | Get-AzStorageBlobContent -Destination $LogPath

# ファイル一覧を取得
$FileList = Get-ChildItem -Path $LogPath -include *.json -Recurse -Force 

# NSG フローログから flowTuples のみを抽出
$Records = @("Time Stamp,Source IP,Destination IP,Source Port,Destination Port,Protocol,Traffic Flow,Traffic Decision,Flow State,Packets - Source to destination,Bytes sent - Source to destination,Packets - Destination to source,Bytes sent - Destination to source")
$Records += $FileList | foreach {(Get-Content -Path $_.FullName | ConvertFrom-Json).records.properties.flows.flows.flowtuples}

# 全てのレコードを抽出して CSV ファイルを生成
$Records | Out-File "$ResultPath\AllRecords.csv" -Encoding utf8

# 特定の条件を満たすレコードを抽出して CSV ファイルを生成 ("O,D" すなわち Outbound で Deny されたものだけ抽出する場合)
$Records | Select-String "O,D" | Out-File "$ResultPath\FilteredRecords.csv" -Encoding utf8

# 特定の条件を満たすレコードを抽出して画面表示
$CSV = ($Records | ConvertFrom-Csv)
$CSV | where {$_."Destination Port" -eq 443 -and $_."Traffic Flow" -eq "O"} | Format-Table

なお、NSG Flow Log のログ フォーマットについては、以下のドキュメントに記載があります。TCP は “T”、UDP は “U”、Inbound は “I”、Outbound は “O”、Allow は “A”、Deny は “D” といった感じなので、特に難しくは無いと思いますが、フィルターする文字列はログ フォーマットを読みつついじってください。

※ Windows ではファイル パスが 260 文字の制約があるので、ダウンロード フォルダは C ドライブ直下などにする事を推奨します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください