VNetフローログでNSGフローログの制約を解決！

# はじめに
2023年8月16日の更新で __「VNetフローログ」__ なるものがプレビューされました。

https://azure.microsoft.com/ja-jp/updates/public-preview-azure-vnet-flow-logs/

Azureには元々NSGフローログというものがあり、NSG(Network Security Group)の挙動（Allow/Deny）を元にAzure内のネットワークのトラフィックを監視することができました。通信断が発生した場合にNSGフローログを用いて被疑部位を調査する、といった運用をされている方も多いかと思います。
今回は新たにプレビューされた「VNetフローログ」についてNSGフローログと何が違うかも含めて調査してみました。


# VNetフローログとは
VNetフローログは、VNETを通過するトラフィックに関する情報をログに出力する Azure Network Watcher の機能です。トラフィック情報を監視することで、不規則なネットワーク動作やトラフィックのスパイク等、ネットワークの状態を管理・把握することができ、さらに障害発生時の調査にも有効です。

従来のNSGにより制御されるトラフィックに加えて、Azure Virtual Network Managerにより制御されるトラフィックについてもサポートしてくれます。加えて、VNETの暗号化(※)が有効になっている場合においても、トラフィックの暗号化状態の評価をサポートしています。


詳細情報については下記サイトをご参照ください。

https://learn.microsoft.com/ja-jp/azure/network-watcher/vnet-flow-logs-overview

※VNETの暗号化については下記サイトをご参照ください。

https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-encryption-overview

ログ記録については、トラフィック毎ではなく1分間隔の統計情報が出力されます。アクセスログをメージしがちですが、そうではなく、フローログはあくまで統計情報ということを認識しておく必要があります。

## なにが出力される？
出力内容については上記MSサイトにも記載されていますが、ざっくり書くと「送信元IP:ポート、宛先IP:ポート、プロトコル、通信ステータス」を取得することができます。既存のNSGフローログのフォーマットと比較してみましたが、大枠では同様の内容が出力されるようです。VNETの暗号化有無の情報が大きく異なる所でしょうか。

以下に、（見えずらいですが）VNetフローログと従来のNSGフローログの出力内容についてMSサイトの情報を元にマッピングしてみました。

|VNetフローログ	|NSGフローログ|
| ---- | ---- |
|time: イベントがログに記録された時刻 (UTC)。	|time: イベントがログに記録された時刻 (UTC)。|
|-	|systemId: ネットワーク セキュリティ グループのシステム ID です。|
|flowLogVersion: フロー ログ スキーマのバージョン。	|-|
|flowLogGUID: FlowLog リソースのリソース GUID。	|-|
|macAddress: イベントがキャプチャされたネットワーク インターフェイスの MAC アドレス。	|-|
|category: イベントのカテゴリ。 カテゴリは常に FlowLogFlowEvent となります。	|category: イベントのカテゴリ。 カテゴリは常に NetworkSecurityGroupFlowEvent となります。|
|flowLogResourceID: FlowLog リソースのリソース ID。	|resourceid: ネットワーク セキュリティ グループのリソース ID です。|
|targetResourceID: FlowLog リソースに関連付けられているターゲット リソースのリソース ID。	|-|
|operationName: 常に FlowLogFlowEvent となります。	|operationName: 常に NetworkSecurityGroupFlowEvents となります。|
|-	|properties: フローのプロパティのコレクションです。|
|-	|Version: フロー ログのイベント スキーマのバージョン番号です。|
|flowRecords: フロー レコードのコレクション。	|-|
|flows: フローのコレクション。 このプロパティには異なる ACL に対する複数のエントリがあります。	|flows: フローのコレクション。 このプロパティには、異なる規則に対して複数のエントリがあります。|
|aclID: トラフィックを評価するリソース (ネットワーク セキュリティ グループまたは Virtual Network マネージャー) の識別子。 暗号化によって拒否されたトラフィックなどの場合、この値は unspecified です。	|-|
|flowGroups: ルール レベルでのフロー レコードのコレクション。	|-|
|rule: トラフィックを許可または拒否したルールの名前。 暗号化が原因で拒否されたトラフィックの場合、この値は unspecified です。	|rule: フローが一覧表示されている規則。|
|-	|flows: フローのコレクション。|
|-	|mac: フローが収集された VM の NIC の MAC アドレス。|
|flowTuples: コンマ区切り形式のフロー タプルに対する複数のプロパティを含む文字列。	|flowTuples: コンマ区切り形式のフローの組に対する複数のプロパティを含む文字列。|
|Time Stamp: フローが発生したときのタイム スタンプ (UNIX エポック形式)。	|Time stamp: フローが発生したときのタイム スタンプ (UNIX エポック形式)。|
|Source IP: 送信元 IP アドレス。	|Source IP: 送信元 IP アドレス。|
|Destination IP: 宛先 IP アドレス。	|Destination IP: 宛先 IP アドレス。|
|Source port: 送信元ポート。	|Source port: 送信元ポート。|
|Destination port: 送信先ポート。	|Destination port: 宛先ポート。|
|Protocol: IANA 割り当て値で表されるフローのレイヤー 4 プロトコル。	|Protocol: フローのプロトコル。 有効な値は TCP の T と UDP の U です。|
|Flow direction: トラフィックの方向。 有効な値は受信の I と送信の O です。	|Traffic flow: トラフィックの方向。 有効な値は受信の I と送信の O です。|
|-	|Traffic decision: トラフィックが許可されたか、拒否されたか。 有効な値は許可の A と拒否の D です。|
|Flow state: フローの状態。 次の状態があります。	|Flow State - Version 2 Only: フローの状態。 次の状態があります。|
|B: 開始。フローが作成された時点。 統計は提供されません。	|B: 開始。フローが作成された時点。 統計は提供されません。|
|C: 継続中。フローが進行中。 5 分間隔で統計が提供されます。	|C: 継続中。フローが進行中。 5 分間隔で統計が提供されます。|
|E: 終了。フローが終了した時点。 統計が提供されます。	|E: 終了。フローが終了した時点。 統計が提供されます。|
|D: フローが拒否された場合 (Deny)。	|-|
|Flow encryption: フローの暗号化の状態。 次のいずれかの値になります。	|-|
|X: 暗号化。	|-|
|NX: 非暗号化。	|-|
|NX_HW_NOT_SUPPORTED: サポートされていないハードウェア。	|-|
|NX_SW_NOT_READY: ソフトウェアの準備ができていません。	|-|
|NX_NOT_ACCEPTED: 暗号化されていないために削除。	|-|
|NX_NOT_SUPPORTED: 検出がサポートされていません。	|-|
|NX_LOCAL_DST: 同じホスト上の宛先。	|-|
|NX_FALLBACK: 暗号化なしにフォールバックします。	|-|
|Packets sent: 最後の更新以降に送信元から宛先に送信されたパケット数の合計。	|Packets sent - Version 2 Only: 最後の更新以降に送信元から宛先に送信された TCP パケットの合計。|
|Bytes sent: 最後の更新以降に送信元から宛先に送信されたパケットのバイト数の合計。 パケットのバイト数には、パケット ヘッダーとペイロードが含まれます。	|Bytes sent - Version 2 Only: 最後の更新以降に送信元から宛先に送信された TCP パケットのバイト数の合計。 パケットのバイト数には、パケット ヘッダーとペイロードが含まれます。|
|Packets received: 最後の更新以降に宛先から送信元に送信されたパケット数の合計。	|Packets received - Version 2 Only: 最後の更新以降に宛先から送信元に送信された TCP パケットの合計。|
|Bytes received: 最後の更新以降に宛先から送信元に送信されたパケットのバイト数の合計。 パケットのバイト数には、パケット ヘッダーとペイロードが含まれます。	|Bytes received - Version 2 Only: 最後の更新以降に宛先から送信元に送信された TCP パケットのバイト数の合計。 パケットのバイト数には、パケット ヘッダーとペイロードが含まれます。|

## NSGフローログからVNetフローログにして何が変わるのか？
NSGフローログには既知の制約がありました。詳細については以下の記事で記載しましたが、簡単に書くと、NSGはサブネットとVMのNICに付与することができ、トラフィックがどちらのNSGをチェックしているかが不定ということが問題でした。NSGフローログの制約はLogAnalyticsに喰わせることで軽減することができますが、例えば3rd Party ソリューションの連携を考慮した場合、1つのフローログに集約してもらった方が良いのは間違いありません。VNetフローログの登場により、メンテナンシビリティが向上するのは必至かと思います。

https://qiita.com/hiro10149084/items/422e329d8a8fb0192214

## 利用するためには・・・
2023年8月時点で、VNetフローログはパブリックプレビュー中ですが、Azureポータルからすぐに使えるものではありません。試用にあたりMicrosoftへ申請が必要になります。試してみたい場合は以下のサイトから申請してみましょう。

https://aka.ms/VNetflowlogspreviewsignup

# おわりに
今回は、8月にプレビューされたVNetフローログについて解説してみました。机上調査レベルの解説となってしまいましたが、現在、申請中ステータスですので、利用できるようになったらまた使用感についてレポートしたいと思います。それではまた！