Web ACL で Count となったリクエストは WAF ログにどのように記録されますか

Web ACL で特定のルールまたはルールグループのアクションを Count としたときの、WAF ログの出力パターンについて説明します。
2023.10.28

困っていた内容

WAF Web ACL で特定のルールのアクションを Count に設定し、対象のリクエストの数を調査しています。

Count となったリクエストがあるはずですが、Athena を使用し WAF ログ直下の action フィールドが "count" となっているレコードをクエリで抽出しようとしましたが、結果は 0 件でした。

Count リクエストは WAF ログにどのように記録されているのでしょうか。

どう対応すればいいの?

WAF ログ直下の action フィールドに表示されるのは、allow, block, CAPTCHA, および challenge のみで、Count は記録されません。1

結論を先に申し上げると、Count の記録フィールドとログ出力は以下 3 つのケースのいずれかになります。

  1. WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録

  2. "ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録

  3. "ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録

記録されるフィールドは、Count として設定した対象や、項目によって決定されます。

以下では、各フィールドに記録されるケースについて詳しく説明します。

1. WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録

このフィールドに記録されるのは、以下の 2 パターンです。

  • 1-1. カスタムルールのアクションを Count に設定した場合
  • 1-2. ルールグループのアクションを Count にオーバーライドした場合

1-1. カスタムルールのアクションを Count に設定した場合

Web ACL のルール追加画面で [Rule builder] を選択し、カスタムルールを作成・追加することができますが、このカスタムルールのアクションを Count としたケースです。

  • カスタムルールのアクションを Count

  • カスタムルール追加後の Web ACL の画面

1-2.ルールグループのアクションを Count にオーバーライドした場合

Web ACL へのルールグループ追加・編集時に、画面最下部にある項目 [Override rule group action to count] のチェックボックスをチェックを入れることで、ルールグループのルールアクションを Count にオーバーライドしているケースです。

  • Web ACL のルールグループ追加・編集画面最下部

WAF ログ出力例

WAF ログの例は以下の通りです。(トグルを開いて表示)

waflog-example1.json

{
    "timestamp": 1697783245792,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:us-east-1:000000000000:global/webacl/waflog-test/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "terminatingRuleId": "Default_Action",
    "terminatingRuleType": "REGULAR",
    "action": "ALLOW",
    "terminatingRuleMatchDetails": [],
    "httpSourceName": "CF",
    "httpSourceId": "XXXXXXXXXX",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingRule": {
                "ruleId": "NoUserAgent_HEADER",
                "action": "BLOCK",
                "ruleMatchDetails": null
            },
            "nonTerminatingMatchingRules": [],
            "excludedRules": null,
            "customerConfig": null
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [
        {
            "ruleId": "AWS-AWSManagedRulesCommonRuleSet",
            "action": "COUNT",
            "ruleMatchDetails": []
        }
    ],
    "requestHeadersInserted": null,
    "responseCodeSent": null,
    "httpRequest": {
        "clientIp": "1.1.1.1",
        "country": "XX",
        "headers": [
            {
                "name": "host",
                "value": "waflog-example.com"
            },
            {
                "name": "accept",
                "value": "*/*"
            }
        ],
        "uri": "/",
        "args": "",
        "httpVersion": "HTTP/2.0",
        "httpMethod": "GET",
        "requestId": "XXXXXXXXXX"
    },
    "labels": [
        {
            "name": "awswaf:managed:aws:core-rule-set:NoUserAgent_Header"
        }
    ],
    "ja3Fingerprint": "XXXXXXXXXX"
}

2. "ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録

このフィールドに記録されるのは、以下の 2 パターンです。

  • 2-1. ルールグループ内、個別のルールのデフォルトアクションを Count に設定した場合
  • 2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合

2-1. ルールグループ内、個別のルールのデフォルトアクションを Count に設定した場合

カスタムルールグループに登録したルールのデフォルトアクションを Count としたケースです。

・カスタムルールグループに Count アクションのルールを登録

2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合

Web ACL に追加したルールグループ内の各ルールは、それぞれの項目で [Override to count] を選択することで、対象ルールのみアクションを Count にオーバーライドすることができます。

  • ルールグループの編集画面で各ルールのアクションを [Override to count] へ変更

WAF ログ出力例

WAF ログの例は以下の通りです。(トグルを開いて表示)

waflog-example2.json

{
    "timestamp": 1697782387503,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:us-east-1:000000000000:global/webacl/waflog-test/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "terminatingRuleId": "Default_Action",
    "terminatingRuleType": "REGULAR",
    "action": "ALLOW",
    "terminatingRuleMatchDetails": [],
    "httpSourceName": "CF",
    "httpSourceId": "XXXXXXXXXX",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [
                {
                    "ruleId": "NoUserAgent_HEADER",
                    "action": "COUNT",
                    "overriddenAction": "BLOCK",
                    "ruleMatchDetails": []
                }
            ],
            "excludedRules": null,
            "customerConfig": null
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [],
    "requestHeadersInserted": null,
    "responseCodeSent": null,
    "httpRequest": {
        "clientIp": "1.1.1.1",
        "country": "XX",
        "headers": [
            {
                "name": "host",
                "value": "waflog-example.com"
            },
            {
                "name": "accept",
                "value": "*/*"
            }
        ],
        "uri": "/",
        "args": "",
        "httpVersion": "HTTP/2.0",
        "httpMethod": "GET",
        "requestId": "XXXXXXXXXX"
    },
    "labels": [
        {
            "name": "awswaf:managed:aws:core-rule-set:NoUserAgent_Header"
        }
    ],
    "ja3Fingerprint": "XXXXXXXXXX"
}

3. "ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録

このフィールドに記録されるのは、以下の 1 パターンのみです。

3-1. ルールグループ内、個別のルールのアクションを ExcludedRules を用いて、Count とした場合

ExcludedRulesは、2022 年 10 月 27 日にRuleActionOverridesに置き換えられた機能です。2

(※ RuleActionOverrides は、2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合 を JSON で記述したときに使用されます。)

そのため、現在、コンソールから ExcludedRules を設定することはできませんが、以前からこの記述を使用している場合には引き続きこのログ形式となります。

また、AWS CLI や SDK、CloudFormation 等の IaC ツールを使用してWebACL を構成する場合にも、ExcludedRules を使用することが可能です。

  • ルールグループ内のルールに ExcludedRules が使用されている場合の JSON 表示

  • コンソール上は [Override: Count] と表示されます

WAF ログ出力例

WAF ログの例は以下の通りです。(トグルを開いて表示)

waflog-example3.json

{
    "timestamp": 1698125333623,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:us-east-1:000000000000:global/webacl/waflog-test/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "terminatingRuleId": "Default_Action",
    "terminatingRuleType": "REGULAR",
    "action": "ALLOW",
    "terminatingRuleMatchDetails": [],
    "httpSourceName": "CF",
    "httpSourceId": "XXXXXXXXXX",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [],
            "excludedRules": [
                {
                    "exclusionType": "EXCLUDED_AS_COUNT",
                    "ruleId": "NoUserAgent_HEADER",
                    "ruleMatchDetails": null
                }
            ],
            "customerConfig": null
        }
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [],
    "requestHeadersInserted": null,
    "responseCodeSent": null,
    "httpRequest": {
        "clientIp": "1.1.1.1",
        "country": "XX",
        "headers": [
            {
                "name": "host",
                "value": "waflog-example.com"
            },
            {
                "name": "accept",
                "value": "*/*"
            }
        ],
        "uri": "/",
        "args": "",
        "httpVersion": "HTTP/2.0",
        "httpMethod": "GET",
        "requestId": "XXXXXXXXXX"
    },
    "labels": [
        {
            "name": "awswaf:managed:aws:core-rule-set:NoUserAgent_Header"
        }
    ],
    "ja3Fingerprint": "XXXXXXXXXX"
}

まとめ

Web ACL で特定のルールまたはルールグループのアクションを Count としたとき、WAF ログの出力パターンは以下の通りです。

1.WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録

  • 1-1. カスタムルールのアクションを Count に設定した場合
  • 1-2. ルールグループのアクションを Count にオーバーライドした場合

2."ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録

  • 2-1. ルールグループ内、個別のルールのデフォルトアクションを Count に設定した場合
  • 2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合

3."ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録

  • 3-1. ルールグループ内、個別のルールのアクションを excludedRules を用いて、Count とした場合

参考資料

注釈


  1. Log fields - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced

    action

    The terminating action that AWS WAF applied to the request. This indicates either allow, block, CAPTCHA, or challenge.

  2. Action overrides in rule groups - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced

    JSON listing: RuleActionOverrides replaces ExcludedRules

    If you set rule group rule actions to Count in your web ACL configuration before October 27, 2022, AWS WAF saved your overrides in the web ACL JSON as ExcludedRules. Now, the JSON setting for overriding a rule to Count is in the RuleActionOverrides settings.

    When you use the AWS WAF console to edit the existing rule group settings, the console automatically converts any ExcludedRules settings in the JSON to RuleActionOverrides settings, with the override action set to Count.