駆け出しアーキテクトのやまぱんです。
今回 Azure Firewall のログ(AzureDiagnostics)を Kusto クエリと Log Analytics を使って見やすくしてみました。
今回のターゲットテーブルは Azure Diagnostics です。 リソース固有の方の ” 構造化されたファイアウォール ログ ” もありますが、執筆時現在でプレビュー機能となっています。
https://learn.microsoft.com/ja-jp/azure/firewall/firewall-preview#structured-firewall-logs-preview
こちらについては別の下記記事で記載していますのでご覧ください。
やりたいこと
Azure Firewall のログを見やすくする。
例えば、アプリケーションルールのログの場合 Log Analytics に転送して見てみるとこんな感じです。
msg_s の中に送信元や宛先、アクションなどが記載されていて、見れるっちゃ見れるんですが、個人的に見にくい。
だいたい Firewall のログみるならこのあたりの要素が大事なはず。
クエリ
AzureDiagnostics
| where Category == "AzureFirewallApplicationRule"
|where OperationName =="AzureFirewallApplicationRuleLog"
そこで今回は msg_s の中を parse 処理して見やすくしてみました。
ちなみに、Log Analytics ではなくストレージ アカウントに転送した場合は 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 カラムにする。
| 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にしましたが、必要に応じて任意のルールを選択してください。
そうすることで選択した Log Analytics でログがたまってクエリを打つとデータが出るようになります。
すこしラグがありますが、私の環境では一時間もしないうちに連携が開始されていました。
困ったポイント
AzureFirewallApplicationRuleLog や、AzureFirewallNetworkRuleLog、AzureFirewallNATRulelog ,AzureFirewallIDSLog で今回試してみましたが、ログの種類によって msg_s 内の記述形式が微妙にことなるので微修正が必要でした。
そのためログの種類ごとに分けて対処してます。(もっとスマートな方法がある気もしています。)
Kusto クエリ
下記にサンプルを記載します。
|project の項目などは必要に応じて適宜追加してください。
AzureFirewallApplicationRuleLog
クエリサンプル
AzureDiagnostics
|where OperationName =="AzureFirewallApplicationRuleLog"
| parse msg_s with *"request from" From "to" To ". Action:" Action
|project TimeGenerated,OperationName,From,To,Action
AzureFirewallNetworkRuleLog
クエリサンプル
AzureDiagnostics
| where OperationName == "AzureFirewallNetworkRuleLog"
| parse msg_s with *"request from" From "to" To ". Action:" Action
|project TimeGenerated,OperationName,From,To,Action
AzureFirewallIDSLog
クエリサンプル
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
AzureFirewallNATRulelog
クエリサンプル
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
これで何が嬉しいか
クエリの使い方の幅があがりましたね!
これによってまず見やすくなったし、アラートルールが設定しやすくなったと思います。
参考 Web
下記を参考に作成しました。