Azure Firewall のログ(Azure Diagnostics)を Log Analytics で見やすくする。

駆け出しアーキテクトのやまぱんです。
今回 Azure Firewall のログ(AzureDiagnostics)を Kusto クエリと Log Analytics を使って見やすくしてみました。

今回のターゲットテーブルは **Azure Diagnostics** です。  **リソース固有**の方の ” **構造化されたファイアウォール ログ** ” もありますが、執筆時現在でプレビュー機能となっています。
https://learn.microsoft.com/ja-jp/azure/firewall/firewall-preview#structured-firewall-logs-preview
こちらについては別の下記記事で記載していますのでご覧ください。

https://qiita.com/aktsmm/private/c3486b17c0482f7da411



### やりたいこと
Azure Firewall のログを見やすくする。
例えば、アプリケーションルールのログの場合 Log Analytics に転送して見てみるとこんな感じです。

**msg_s** の中に送信元や宛先、アクションなどが記載されていて、見れるっちゃ見れるんですが、個人的に見にくい。
だいたい Firewall のログみるならこのあたりの要素が大事なはず。

クエリ
```kql:kusto query
AzureDiagnostics
| where Category == "AzureFirewallApplicationRule" 
|where OperationName =="AzureFirewallApplicationRuleLog"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a2b32fc2-3124-8a34-545d-630b975604ef.png)

そこで今回は **msg_s** の中を parse 処理して見やすくしてみました。

ちなみに、Log Analytics ではなくストレージ アカウントに転送した場合は json ファイルを生で確認できます。もちろんみにくい。検索もしにくい。


```json:json
{ "category": "AzureFirewallApplicationRule", "time": "2022-12-06T18:22:00.1514790Z", "resourceId": "/SUBSCRIPTIONS/E2F1DEC1-XXXXXXXXXXXXXXXXXXX/RESOURCEGROUPS/RG-NORMAL/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/FW-PREM", "operationName": "AzureFirewallApplicationRuleLog", "properties": {"msg":"HTTPS request from 10.0.0.6:52686 to winatp-gw-eus3.microsoft.com:443. Action: Deny. No rule matched. Proceeding with default action"}}
```

#### parse 処理について
下記みたいな要領で記載する。
> parse (parse対象の文字列があるカラム) with "抜き出したい文字列の直前の文字列" (カラム名) "抜き出したい文字列の直前の文字列" (カラム名) ・・・・・

超ざっくり説明すると、例えば下記の記述であれば  **"request from" の文字列の "あと" から次に指定されされる (この場合は ” To :” ) "まで" の文字列を **From** カラムにする。**

```kql:kusto query
| parse msg_s with  *"request from" From "to" To ". Action:" Action
```

例えば下記の文字列が ”msg_s with” の中にあった場合、上記の処理をすると **From** カラムは "10.0.0.6:52686" になります。
> HTTPS request from 10.0.0.6:52686 to winatp-gw-eus3.microsoft.com:443

### 事前準備
Azure Firewall から Log Analytics へ連携をしておきます。

下記のページを参考にできます。
https://learn.microsoft.com/ja-jp/azure/firewall/firewall-diagnostics#enable-diagnostic-logging-through-the-azure-portal

私は今回 allLogsにしましたが、必要に応じて任意のルールを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/5e571c89-0b50-2d13-bbed-40b52301dbce.png)

そうすることで選択した Log Analytics でログがたまってクエリを打つとデータが出るようになります。
すこしラグがありますが、私の環境では一時間もしないうちに連携が開始されていました。

### 困ったポイント
AzureFirewallApplicationRuleLog や、AzureFirewallNetworkRuleLog、AzureFirewallNATRulelog ,AzureFirewallIDSLog で今回試してみましたが、ログの種類によって msg_s 内の記述形式が微妙にことなるので微修正が必要でした。
そのためログの種類ごとに分けて対処してます。(もっとスマートな方法がある気もしています。)

### Kusto クエリ 
下記にサンプルを記載します。
|project の項目などは必要に応じて適宜追加してください。

#### AzureFirewallApplicationRuleLog

クエリサンプル
```kql:kusto query
AzureDiagnostics 
|where OperationName =="AzureFirewallApplicationRuleLog"
| parse msg_s with  *"request from" From "to" To ". Action:" Action
|project  TimeGenerated,OperationName,From,To,Action
```
結果サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e57fb9eb-dd88-e935-cc09-3b90ae3dfdcc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6a11e539-5686-83ee-6f48-93c750b31208.png)


#### AzureFirewallNetworkRuleLog
クエリサンプル
```kql:kusto query
AzureDiagnostics
| where OperationName == "AzureFirewallNetworkRuleLog"
| parse msg_s with  *"request from" From "to" To ". Action:" Action 
|project  TimeGenerated,OperationName,From,To,Action
```
結果サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/34fbfa4e-e266-1519-369a-30586a73e71b.png)


#### AzureFirewallIDSLog
クエリサンプル
```kql:kusto query
AzureDiagnostics
| where OperationName == "AzureFirewallIDSLog"
| parse msg_s with  *"request from" From "to" To ". Action:" Action ". Signature:" AlertSignature ". IDS:" IDS ". Priority:" Priority ". Classification:" Classification
|project  TimeGenerated,OperationName,From,To,Action,AlertSignature,IDS,Priority,Classification
```
結果サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/9adbc9a7-f227-c5c6-256b-ba5e3444a29a.png)


#### AzureFirewallNATRulelog
クエリサンプル
```kql:kusto query
AzureDiagnostics
| where OperationName == "AzureFirewallNatRuleLog"
| parse msg_s with  *"request from" From "to" To "was DNAT'ed to" DNATto ". Policy:" Policy ". Rule:"Rule
|project  TimeGenerated,OperationName,From,To,DNATto,Policy
```
結果サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/c740024d-cce7-3108-94a6-68c9e575c9ac.png)

### これで何が嬉しいか
クエリの使い方の幅があがりましたね！
これによってまず見やすくなったし、アラートルールが設定しやすくなったと思います。


### 参考 Web
下記を参考に作成しました。

https://azuread.net/archives/12622

https://tsubasaxzzz.github.io/fta-hackon2022/ja/docs/advanced/#network