Azure Firewallをためしたの続きです。
上記のエントリーはで、Azure Firewallの通信ログをLog Analyticsに投入しました。本エントリーでは、Log Analyticsに投入されたログをいい感じにします。
初期状態
Log Analyticsに投入された通信ログは次のフォーマットになっています。
プロパティ | サンプル |
---|---|
TenantId | da2efae5-32b4-xxxx-xxxx-xxxxxxxxxxx |
SourceSystem | Azure |
TimeGenerated [UTC] | 2018-07-13T16:15:13.703Z |
msg_s | HTTPS request from 10.0.3.4:55584 to da2efae5-32b4-44e1-815d-b5923d52325c.ods.opinsights.azure.com:443. Action: Deny. No rule matched. Proceeding with default action |
ResourceId | /SUBSCRIPTIONS/51B26C53-7AE2-xxxx-xxxx-xxxxxxxxxxx/RESOURCEGROUPS/SAMPLE/PROVIDERS/MICROSOFT.NETWORK/AZUREFIREWALLS/SAMPLEFW |
OperationName | AzureFirewallApplicationRuleLog |
Category | AzureFirewallApplicationRule |
SubscriptionId | 51b26c53-7ae2-xxxx-xxxx-xxxxxxxxxxx |
ResourceGroup | SAMPLE |
ResourceProvider | MICROSOFT.NETWORK |
Resource | SAMPLEFW |
ResourceType | AZUREFIREWALLS |
Type | AzureDiagnostics |
ですので、AzureDiagnosticsを選択してから、ResourceTypeをAZUREFIREWALLSでフィルタしたうえでmsg_sを出力すると、Azure Firewallの通信ログだけを確認できます。
検索しやすくする
msg_sの中にすべての情報が入っていると検索しにくいです。下図のFortiGateのようにログの情報が整理されてほしいところです。
Log Analyticsはクエリを与えることで自由にログを整形できます。parseを使って基本的な部分を抽出したうえで、足りない部分を個別に正規表現で抽出します。
AzureDiagnostics
| where ResourceType == "AZUREFIREWALLS"
| parse kind = regex msg_s with Proto "request from " From ":.*?to " To ":" Dport ". Action: " Result
| extend Result = extract("(Allow|Deny)",1,Result)
| extend Collection = iif(msg_s contains "Rule Collection:" , extract("Rule Collection: (.*?). Rule", 1 , msg_s ) , "")
| extend Rule = iif(msg_s contains "Rule:" , extract("Rule: (.*?)$", 1 , msg_s ) , "")
| project TimeGenerated , From , To , Proto , Dport , Result , Collection , Rule , msg_s
// Iuput your query to the following space.
すると、ログの表示が下図のようになります。
項目ごとに整理されているので、直感的に検索できます。送信元が10.0.3.4でsakeというApplication ruleにマッチした通信を検索すると下図のような出力されます。いい感じですね。