[Azure] NSGフローログV2をPower BI Desktopで分析する

Azure NSG(Network Security Group)フローログは、NSGで処理されたIPトラフィックの情報をログに記録できる機能です。セキュリティ規則で拒否された通信の詳細も記録され、確認することができます。

ログの可視化については [こちらのドキュメント](https://docs.microsoft.com/ja-jp/azure/network-watcher/network-watcher-visualize-nsg-flow-logs-power-bi) に情報があったのですが、まだフローログV2に対応していませんでした。

そこで今回、フローログV2のPower BI Desktopでの分析を試してみたので、その手順のまとめになります。

# NSGフローログの構成

NSGフローログはデフォルトで無効になっているので、手動で有効にする必要があります。セキュリティグループのメニュー「NSGフローログ」から有効にして下さい。フローログはストレージアカウントに出力されます。

ログの形式については [こちら](https://docs.microsoft.com/ja-jp/azure/network-watcher/network-watcher-nsg-flow-logging-overview) にドキュメントがありますが、下記のようなログが出力されます(一部抜粋しています)。詳細のトラフィックデータは"flowTuples"の中に出力されますが、これがJSONの中でコンマ区切りテキストになっているのと、"flowTuples"自体のネストが深く、かつ複数出力される(1ファイル中にも複数あります)のが分析するのに少し手間がかかるポイントになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/66f0c2e9-462a-71f2-1d70-15577e3af46e.png)

# 今回確認したこと

今回は以下の2つを調査したため、その手順となっています。ログをインポートするまでの手順は共通なので、そこまでは他の分析でも利用できるかと思います。

- VMからの送信トラフィックの通信先
- セキュリティ規則で拒否されたリクエストの通信元

# 実行手順

## 1．ストレージアカウントからフローログを取得

フローログは、設定したストレージアカウントに出力されます。1時間ごと、アクセス元ごとに別ファイルになるため、多数のファイルを扱うことになります(ファイルのパスも非常に深いです)。Azureストレージエクスプローラ等で、処理対象のログをまとめてダウンロードしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/f03010da-ae7b-b0cf-5bd7-a369540bfa61.png)

## 2．フォルダごとインポート

ここからはPowerBIでの手順です。メニューから「データを取得」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/079e8bac-1dfd-5138-7860-a30d0dbe0aa4.png)

ファイルタイプにJSONがありますが、複数の場合はその下の「フォルダー」を選択し、「接続」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/12fad712-66f3-4596-dd62-c749616ad234.png)

ログを保管したフォルダを指定して、「OK」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/d6faba7c-27e2-d372-adec-f2917f46e5c7.png)

読み込みが完了すると、ダイアログが表示されます。複数のJSONファイルが認識されていることを確認して「データの変換」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/8b2caa52-23d2-cdbb-8a22-f737f370bfb4.png)

## 3．リストを展開後、コンマ区切りの項目を分割

読み込みが完了すると、Power Queryエディタ－に結果が表示されます。Contentの右にある「Fileの結合」ボタンを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/3f9922be-54f0-6122-3d5f-fd4026c45919.png)

しばらく待つとファイルが展開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/bc6ee991-bb2b-48b4-6012-ddc050026ec0.png)

データを右にスクロールすると、最後に"records.properties.flows.flows"が Listとして表示されているので、右のボタンを押し、「新しい行に展開する」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/006ed92a-1478-46a5-8a6a-f2c81c97f9d0.png)

データの表示が"Record"になるので、再びボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/3a8a7c61-6088-5d29-ac19-a22f0a5afcd8.png)

ここまででネストを展開して"flowTuples"に辿り着きました。「元の列名をプレフィックスとして使用します」のチェックを外して「OK」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/22001205-df01-ae4c-0645-a37a813c4001.png)

"flowTuples"が Listとして表示されるので、再び展開(「新しい行に展開する」を選択)します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/884a7760-2e8c-8646-c942-f208bf56ca51.png)

トラフィックデータ(コンマ区切り文字列)が表示されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/e2027763-3b7f-7c75-b714-af9177528cc6.png)

今度は項目名を右クリックして、「列の分割」→「区切り記号による分割」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/54b3748a-c586-c607-5228-316593e26a40.png)

コンマ区切りを選択して「OK」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/5f892dbf-0f0c-cc6e-af1b-7084a8b6bea4.png)

列が分割され、各データが列として追加されたことを確認します。これで全てのデータが展開できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/522499be-6e51-c509-33e6-89e5f8a3293a.png)

## 4．タイムスタンプを変換し、項目名を変更

項目のうち、タイムスタンプがUnixtimeで保管されているので変換しておきます。

メニューから、「列の追加」→「カスタム列」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/5235443c-39a8-e480-ea24-61edae542f8d.png)

カスタム列の式に `#datetime(1970, 1, 1, 0, 0, 0) + #duration(0, 0, 0, [flowTuples.1])` を入力します。項目名が flowTuples.1 でない場合は変更して下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/3a79440c-d075-5e95-4ecd-e2bf80d98abd.png)

「OK」を押して、タイムスタンプが列として追加されたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/a6fb154e-385c-9e83-398c-d8a435957e01.png)

その他の項目も、展開した時の列名 ( `flowTuples.X` ) では分かりづらいので変更しておきます。列名を右クリックして「名前の変更」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/be27d885-04b3-d354-15af-faa286a35b90.png)

[ドキュメント](https://docs.microsoft.com/ja-jp/azure/network-watcher/network-watcher-nsg-flow-logging-overview) を参照して、自分が使用する項目の名前を変更しておくと、この後分かりやすいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/fbda8f02-6ac6-0adc-38cc-0f78521e7c1f.png)

※この手順通りであれば、以下のように展開されているはずです。

| 展開後名称 | フローログ項目名 |
|:--|:--|
| flowTuples.2  |  Source IP  |
| flowTuples.3  |  Destination IP  |
| flowTuples.4  |  Source Port  |
| flowTuples.5  |  Destination Port  |
| flowTuples.6  |  Protocol   |
| flowTuples.7  |  Traffic Flow  |
| flowTuples.8  |  Traffic Decision  |
| flowTuples.9  |  Flow State  |
| flowTuples.10  |  Packets - Source to destination  |
| flowTuples.11  |  Bytes sent - Source to destination  |
| flowTuples.12  |  Packets - Destination to source  |
| flowTuples.13  |  Bytes sent - Destination to source  |

また、Source Port(flowTuples.2) と Destination Port(flowTuples.5) はデータ型を文字列に変更しておきます。（整数型だと自動でSUMとか計算されたりしますが、ポート番号の処理としては適切でないため。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/094905f6-7290-8afe-e4f5-163659bab8a8.png)

## 5．読み込んで、分析

ここまでの手順が終わったら、メニューから「閉じて適用」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/462368ae-5e2a-c9e8-4f20-57a697a5f9e5.png)

読み込みが終わり、画面の右に「視覚化」メニュー、「フィールド」メニュー内に設定した項目名が表示されていることを確認して下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/c5513b85-5951-879f-95ad-698815d43060.png)

あとは目的に応じてデータの分析を行うことになります。

3．4．のデータ変換処理に関して後から何か変更したい場合は、ホーム → データの変換 で再編集することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/2b25a698-d0b5-0326-3853-aa0c25c7bebc.png)

## 6．分析例

## 6－1．VMからの送信トラフィックの通信先

「フィールド」メニューから、"Destination IP"、"bytes sent destination to source"、"bytes sent source to destination"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/821cd7fa-754f-951f-b0a8-5ee374dd768d.png)

「視覚化」メニューで積み上げ棒グラフを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/81932ec2-7107-e6af-ddb6-b23f318cb75f.png)

画面の左にグラフが表示され、特定の通信先と多く通信していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/b74cd49c-2067-7964-b369-78d4645fdd58.png)

「視覚化」メニューでテーブルを選択すると、元データを確認することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/2e375079-f0ca-901b-07a6-ddbed9fcbfe8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/e0578fdf-8703-33a2-c599-a71a7cd4fb26.png)

## 6－2．セキュリティ規則で拒否されたリクエストの通信元

「フィールド」メニューから、"Source IP"、"Destination IP"、"Traffic Decision"を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/4b3274af-b24d-1215-84b6-3f6d206c6e39.png)

「視覚化」メニューでテーブルを選択し、"Traffic Decision"でソートすると、拒否された通信を確認することができます("D"が拒否された通信です)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/2e375079-f0ca-901b-07a6-ddbed9fcbfe8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/26193af0-3056-9fda-b68e-f45a8e3970a9.png)

追加で"Source Port"、"Destination Port"、"Time Stamp"をチェックすると、より詳細を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/2674ab8a-cbd0-7b99-e0d2-03a1745cc225.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/4a6d9d69-0b00-fcd5-88fd-e91184194cab.png)

手順は以上です。手数が多いですが、元のデータ構造を考えると、サクサク展開されて分析できているとは思います。
分析例は初歩的なものだと思いますので、もっと視覚化された分析を活用するようにしていきたいです。

# 参考資料

- [ネットワーク セキュリティ グループのフローのログ記録の概要](https://docs.microsoft.com/ja-jp/azure/network-watcher/network-watcher-nsg-flow-logging-overview)
- [Convert UNIX Timestamp to DATE or DATETIME format in Power BI](https://whatthefact.bi/power-bi/dax/convert-unix-timestamp-to-date-or-datetime-format-in-power-bi/)
- [Power BI: Expand JSON Array Column to New Table(YouTube動画)](https://www.youtube.com/watch?v=BDE9GJgGi6E)
- [Power BI Desktop でファイル (バイナリ) を結合する](https://docs.microsoft.com/ja-jp/power-bi/transform-model/desktop-combine-binaries)