WAFログのCountリクエストをAthenaで確認したい

S3に保存されている WAF ログのうち、アクションが COUNT として記録されたリクエストのレコードを Athena で抽出するクエリ例を紹介します。
2024.01.27

困っていた内容

S3 に出力されている AWS WAF ログから、Count1 のリクエストを確認したいと考えています。

そのため、まず以下ドキュメントに記載のクエリを使用し、Amazon Athena で WAF ログのテーブルの作成を行いました。

WAF ログの中に Count のリクエストは存在することは間違いないのですが、作成したテーブルに対し、Count のリクエストを抽出するためのクエリを作成・実行したところ結果が 0 件となりました。

どう対応すればいいの?

該当する Count アクションが WAF ログのどのフィールドに記録されているか把握し、それに応じたクエリを実行する必要があります。

現在、WAF ログの Count の記録フィールドは以下の三箇所があります。

  1. WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録
  2. "ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録
  3. "ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録

※ それぞれのログ形式の詳細と、対応する WebACL の設定につきましては、以下ブログ記事をご確認ください。

この三つのログパターンのうち、1 および 3 を Athena で抽出するためのクエリについては、以下の AWS ブログで確認することができます。2

しかし、2 については、2022 年 10 月 27 日のアップデート3 により記録されるようになったフィールドであるため、2022 年 9 月に公開されている上記の AWS ブログでカバーされない内容となります。

以下では、上述の三つのログパターンで記録された COUNT を抽出するためのクエリの一例をそれぞれ紹介します。

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

SELECT
    from_unixtime(timestamp/1000, '+00:00') AS UTC,
    from_unixtime(timestamp/1000, '+09:00') AS JST,
    httprequest.clientip,
    httprequest.uri,
    httprequest.country,
    t.ruleid
FROM "waf_logs"
CROSS JOIN UNNEST(nonTerminatingMatchingRules) AS t(t)
WHERE t.action='COUNT'

2. "ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録されている場合

SELECT
    from_unixtime(timestamp/1000, '+00:00') AS UTC,
    from_unixtime(timestamp/1000, '+09:00') AS JST,
    httprequest.clientip,
    httprequest.uri,
    httprequest.country,
    t1.rulegroupid,
    t2.ruleId
FROM "waf_logs"
CROSS JOIN UNNEST(rulegrouplist) AS t(t1)
CROSS JOIN UNNEST(t1.nonTerminatingMatchingRules) AS t(t2)
WHERE t2.action='COUNT'

3. "ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録されている場合

SELECT
    from_unixtime(timestamp/1000, '+00:00') AS UTC,
    from_unixtime(timestamp/1000, '+09:00') AS JST,
    httprequest.clientip,
    httprequest.uri,
    httprequest.country,
    t.rulegroupid,
    t.excludedrules
FROM "waf_logs"
CROSS JOIN UNNEST(rulegrouplist) AS t(t)
WHERE t.excludedrules IS NOT NULL

参考資料

注釈


  1. Count は、WAF のルールやルールグループに設定できるアクションの一つです。特定のルールやルールグループのアクションを Block や Allow に決定する前に該当するリクエストについて調べる、対象のリクエストにラベルを追加する、などの用途で使用されます。

    Count – AWS WAF はリクエストをカウントしますが、リクエストを許可するかブロックするかは決定しません。これは非終了アクションです。AWS WAF がウェブ ACL の残りのルールの処理を継続します。定義したルールでは、リクエストにカスタムヘッダーを挿入し、他のルールで一致するラベルを追加できます。


    出典: ルールアクション - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced

  2. 1 は「例: Athena で “action”:”COUNT” を抽出するためのクエリ」、3 は「例: Athena で “EXCLUDED_AS_COUNT” を抽出するためのクエリ」に掲載されているクエリが使用できます。本記事で紹介しているクエリ例も、これらを基にしています。 
  3. 該当のアップデートは以下のものになります。

    変更 説明 日付
    ルールグループ内のアクションオーバーライド ルールグループ内のルールアクションを任意のルールアクション設定にオーバーライドできるようになりました。前の Count アクションオーバーライドと同様に、オーバーライドをルールグループ内のすべてのルールと個々のルールに適用できます。 2022 年 10 月 27 日

    出典: ドキュメント履歴 - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced