Amazon-Athena

【Amazon Athena】WAF マネージドルールでオーバーライドしたルールを除外してクエリする。

はじめに

AWS WAFでは2022年10月27日のアップデートでAWSマネージドルールグループ内のルールのアクションが個別に変更できるようになりました。[1]

またAWSのWAFにおけるルールグループのルールアクションの設定では、2022年10月27日以前に、Countとした場合、
クエリ時などに利用するJSONにて"ExcludedRules"として保存されていたんですが
それ以降に当該設定を変更すると、"ExcludedRules"が自動的に "RuleActionOverrides" へと変換され保存されるようになりました。

変更前

変更後

詳細な仕様については、下記のドキュメントをご参照下さい。

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-rule-group-override-options.html

ただ変更に伴い(副次的に)、CAPCHA/CHALLENGE等色々混ざって出力されるようになってしまったので個別に除外する必要あるかと思います。[2]

今回は、WAFマネージドルールで一部をAllowでオーバーライドし、Amazon Athenaでそのルールを除外してクエリしたいと思います。

事前準備

クエリを実行するために、データを格納しているテーブルを作成する必要があります。
テーブルの作成には以下のドキュメントを参照してください。
今回は、target_waflogからwaf_tableを作成する形で進めさせていただければと思います。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/waf-logs.html#create-waf-table

また、この記事では対象のWAFログでNoUserAgent_HEADERをAllowでオーバーライドしている状態で進めます。

実行するクエリ文

WAFのマネージドルールでオーバーライドした除外したいルールを{ルール名}_RC_COUNTで設定します。
RCはReleaseCandidateの略らしいです。[3]
今回は、NoUserAgent_HEADERのルールを除外します。

SELECT
    *
FROM "target_waflog"."waf_table"
    CROSS JOIN UNNEST(rulegrouplist) AS t(t)
WHERE action <> 'BLOCK' AND # アクションがBLOCKではない。
    CARDINALITY(FILTER(t.nonTerminatingMatchingRules, rule -> rule.ruleId != 'NoUserAgent_HEADER_RC_COUNT')) > 0 #対象のルールを除外してもnonTerminatingMatchingRulesが存在する場合

除外するルールのクエリとの差分で正常に動作することが確認できるかと思います。
必要であればCARDINALITY..の行を増やしても問題ありません。

おわりに

この記事では、Amazon AthenaでAWS WAFのログをクエリする際にWAF マネージドルールのオーバーライドしたルールを除外する手順について紹介しました。
アップデート以降でWAFルールを更新した際に利用できるかと思います。
なにかしらどこかしら参考になれば幸いです。

参考にさせていただいた記事

[1] Document history
https://docs.aws.amazon.com/waf/latest/developerguide/doc-history.html

[2]
CAPTCHA and Challenge in AWS WAF
https://docs.aws.amazon.com/waf/latest/developerguide/waf-captcha-and-challenge.html

[3]
What does CR mean in version numbers?
https://softwareengineering.stackexchange.com/questions/125308/what-does-cr-mean-in-version-numbers

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA