目次

  1. 1. はじめに
  2. 2. Amazon CloudWatch Logs とは
  3. 3. AWS WAF ログの設定方法
  4. 4. WafCharm ルールでの利用方法
  5. 5. おわりに

1. はじめに

今回は AWS の公式ブログをご紹介します。
https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/

2022年9月7日に翻訳バージョンも公開された Amazon CloudWatch Logs による AWS WAF の解析ブログです。

2021年11月15日 PTD に CloudWatch Logs に直接 WAF ログが出力可能になりましたが、その活用例となります。
https://www.wafcharm.com/jp/blog/aws-waf-logging-cloudwatch-s3-update-ja/

WafCharm ルールであればどうするべきかという点も踏まえて解説していきます。

2. Amazon CloudWatch Logs とは

AWS 関連の各種ログやその他のソースからログファイルをモニタリング、保存、およびアクセスするソリューションとなります。様々なログを集約し一元管理することが可能です。

専用のダッシュボードを作成し、日々の監視の効率化などにも期待できるかと思います。

3. AWS WAF ログの設定方法

設定をしたい Web ACL を開き「Logging and metrics」を選択します。

Logging の項目の「Enable」を選択します。

CloudWatch Logs log group を選択し、「Create new」を選択します。

CloudWatch のロググループの作成画面が表示されますのでロググループ名を入力します。
ロググループ名には制約があり、「aws-waf-logs-」で始まる必要があります。

ロギングの編集画面に戻り、作成したロググループを選択して保存すれば設定は完了です。

CloudWatch Log Insights でクエリを実行して結果を表示することも可能です。

検索結果からログが取得できていることが確認できました。

4. WafCharm ルールでの利用方法

具体的な利用方法については公式ブログを確認いただくことで、特定の条件での出力や視覚的に見やすくできるようにグラフ化する方法も理解できるかと思います。

そこで、本ブログでは WafCharm ルールでもうまく活用するためにはという点を確認していきます。

WafCharm をご利用の皆様はご存知かと思いますが、WafCharm ルールは基本的にルールグループを利用した構成となります。
ルールグループ内に複数のルールが配置され、COUNT に変更する際にはルールグループ内のルールのアクションを上書きして COUNT 状態にしていただきます。こちらは厳密には例外設定(Override rules action)となります。

ルールグループの構成

ACL
 ├ rule1
 ├ rule2
 ├ rule group
 │  ├  rule 4
 │  └  rule 5
 └ rule3

具体的にログを確認すると以下のようになります。
※検知内容箇所のみ抜粋

"terminatingRuleId": "Default_Action",
"terminatingRuleType": "REGULAR",
"action": "ALLOW",
"terminatingRuleMatchDetails": [],
"httpSourceName": "APPSYNC",
"httpSourceId": "arn:aws:appsync:ap-southeast-2:XXXXXXXXXXXX:apis/chh2qnyamnhddmpiht27x4nrwm",
"ruleGroupList": [
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Common_Basic_Group/f41990e9-e78c-4966-80ce-ac861789ac75",
        "terminatingRule": null,
        "nonTerminatingMatchingRules": [],
        "excludedRules": null,
        "customerConfig": null
    },
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Common_Advanced_Group/d669d977-d4ae-4021-b09b-0e7bc5f567bb",
        "terminatingRule": null,
        "nonTerminatingMatchingRules": [],
        "excludedRules": null,
        "customerConfig": null
    },
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Custom_Group/cc6f7ed8-43c8-4981-9ab6-37931291f878",
        "terminatingRule": null,
        "nonTerminatingMatchingRules": [],
        "excludedRules": [
            {
                "exclusionType": "EXCLUDED_AS_COUNT",
                "ruleId": "WafCharm_Custom_001",
                "ruleMatchDetails": null
            }
        ],
        "customerConfig": null
    },
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Blacklist_Group_946/86dc545d-f042-401c-a89b-d05e05dd78af",
        "terminatingRule": null,
        "nonTerminatingMatchingRules": [],
        "excludedRules": null,
        "customerConfig": null
    }
],

excludedRules 内にルール名が表示されることがわかります。
こちらからルール名を取り出す場合は以下のように parse します。
count_rule で COUNT のルール名を取り出すことが可能です。

parse @message '{"exclusionType":"EXCLUDED_AS_COUNT","ruleId":"*","ruleMatchDetails":null}' as count_rule

※あまり多いパターンではないかと思いますが、COUNTは複数のルールでマッチしている可能性があります。COUNT の詳細を確認する必要がある場合は該当のログ内容を全て確認することが推奨です。

次にBLOCKした場合のルール名の取り出し方法となります。
こちらも具体的なログを確認しましょう。
※検知内容箇所のみ抜粋

"terminatingRuleId": "WafCharm_Blacklist_Group_946",
"terminatingRuleType": "GROUP",
"action": "BLOCK",
"terminatingRuleMatchDetails": [],
"httpSourceName": "APPSYNC",
"httpSourceId": "arn:aws:appsync:ap-southeast-2:XXXXXXXXXXXX:apis/chh2qnyamnhddmpiht27x4nrwm",
"ruleGroupList": [
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Common_Basic_Group/f41990e9-e78c-4966-80ce-ac861789ac75",
        "terminatingRule": null,
        "nonTerminatingMatchingRules": [],
        "excludedRules": null,
        "customerConfig": null
    },
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Common_Advanced_Group/d669d977-d4ae-4021-b09b-0e7bc5f567bb",
        "terminatingRule": null,
        "nonTerminatingMatchingRules": [],
        "excludedRules": null,
        "customerConfig": null
    },
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Custom_Group/cc6f7ed8-43c8-4981-9ab6-37931291f878",
        "terminatingRule": null,
        "nonTerminatingMatchingRules": [],
        "excludedRules": null,
        "customerConfig": null
    },
    {
        "ruleGroupId": "arn:aws:wafv2:ap-southeast-2:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Blacklist_Group_946/86dc545d-f042-401c-a89b-d05e05dd78af",
        "terminatingRule": {
            "ruleId": "wafcharm-blacklist-946",
            "action": "BLOCK",
            "ruleMatchDetails": null
        },
        "nonTerminatingMatchingRules": [],
        "excludedRules": null,
        "customerConfig": null
    }
],

terminatingRuleId にはルールグループ名で後半の terminatingRule の箇所でルール名が記載されます。
こちらからルール名を取り出す場合は以下のように parse します。
block_rule で BLOCK のルール名を取り出すことが可能です。

parse @message '"terminatingRule":{"ruleId":"*","action":"BLOCK"' as block_rule

ログ内から必要な情報のみ表示する例

fields @timestamp
| parse @message '"terminatingRule":{"ruleId":"*","action":"BLOCK"' as block_rule
| parse @message '{"exclusionType":"EXCLUDED_AS_COUNT","ruleId":"*","ruleMatchDetails":null}' as count_rule
| parse webaclId '/webacl/*/' as webacl
| display @timestamp, httpRequest.clientIp, httpRequest.country, httpRequest.httpMethod, httpRequest.uri, terminatingRuleId, action, block_rule, count_rule, webacl

※ webaclId も Web ACL 名のみ取り出すように加工しています。

表示は「時間、IP、国、メソッド、URI、terminatingRuleId、アクション、ブロックルール、カウントルール、Web ACL名」としてみました。

ここまでくれば、特定の情報のみでフィルターすることやグラフ化といった加工も容易かと思います。
このクエリは AWS WAF の Web ACL の画面でも実行可能です。

5. おわりに

WAF ログを利用した SIEM や Athena を利用した確認方法もありますが、特に他のソリューションと連携する必要もなく、かなり手軽に確認することができるかと思います。お手軽さで言えば Athena での確認も簡単なので、どちらか慣れ親しんだ方法で利用していきましょう。

WAF ログを確認する例