AWS WAF でブロックされた特定の URI リクエストに対して除外設定を適用させてみた
AWS WAF を導入し運用していると、正常な通信もブロック(誤検知)されることが多々あるかと思います。そこで、本ブログでは、AWS WAF で特定の URI リクエストがブロックされた時に対象のルールのみ除外設定する方法について解説します。
AWS WAF は Web アプリケーションを保護するための重要なサービスですが、誤ってブロックされるケースも存在し、そういった場合の対処方法を理解することで、AWS WAF をより適切に運用できるようになります。
目次
AWS WAFとは
AWS WAF の役割
AWS WAF は、Web アプリケーションに対する一般的な攻撃パターンを検出し、それらをブロックすることで、アプリケーションを保護するマネージドサービスです。SQL インジェクション、クロスサイトスクリプティング、その他の一般的な攻撃ベクトルからアプリケーションを保護できます。
AWS WAF のルール
AWS WAF ではルールを設定し、そのルールに基づいてリクエストをモニタリングおよびブロックします。ルールは、IP アドレス、HTTP ヘッダー、HTTP ボディ、URI などの Web リクエストの特性に基づいて設定できます。AWS Managed Rules や自分でカスタムルールを作成することができます。
AWS WAF で特定の URI リクエストがブロックされた時
正規のリクエストであっても、AWS WAF に誤ってブロックされてしまい、一部の機能が利用できなくなってしまうことがあります。その場合以下の流れで原因調査を行い対象のルールを確認します。
- AWS WAF のアクセスログを確認し、ブロックされたリクエストの詳細を把握
- ログから、そのリクエストがどの WAF ルールにマッチしてブロックされたかを特定
- ルールの内容を確認し、なぜそのリクエストがブロックされたのか原因を分析
ブロックされた AWS WAF ログの一例をご参考までに載せます。
ログは一部省略しています。今回は「AWS-AWSManagedRulesCommonRuleSet」の ruleid「CrossSiteScripting_BODY」で「uri=/test/document」がブロックされたログとなります。
2024-MM-DD 00:00:00.000 Asia/Tokyo,"アカウント番号","1","arn:aws:wafv2:ap-northeast-1","AWS-AWSManagedRulesCommonRuleSet","MANAGED_RULE_GROUP","BLOCK","[{conditiontype=XSS, location=BODY, matcheddata=[<, meta]}]", {rulegroupid=AWS#AWSManagedRulesCommonRuleSet, terminatingrule={ruleid=CrossSiteScripting_BODY, action=BLOCK, rulematchdetails=null},~~省略~~,uri=/test/document,~~省略~~
調査の結果ブロックされた通信が問題なかった場合、除外設定を適用します。
除外設定の手順
今回はサイトの URI /test/document リクエストが誤って AWS WAF の Rules の「AWS-AWSManagedRulesCommonRuleSet」でブロックされたと仮定し、除外設定する手順を解説していきます。
※ 本手順では、予め AWS WAF を作成し、Rules に「AWS-AWSManagedRulesCommonRuleSet」を設定しています。
- マネジメントコンソールから AWS WAF > Web ACLs > 対象の WAF(今回は test-waf) を選択し、Rules > AWS-AWSManagedRulesCommonRuleSet を押下
- 右上の Edit を選択
- Scope of inspection > Choose the scope of inspection の
Only inspect requests that match a scope-down statement を選択し
If a request で don't match the statement (NOT) を選択
※ don't match the statement (NOT) を選択することで除外設定となります。
- Statement の設定を以下の値に設定します。
Inspect:URI Path
Match type:Matches regular expression
Regular expression:^/test/document$
Text transformation:None
<設定値の補足説明>
- Inspect:検査対象を指定します。この場合は URI Path なので、リクエストの URI パスが検査対象になります。
- Match type:マッチングの種類を指定します。Matches regular expression は正規表現によるパターンマッチングを行います。
- Regular expression:マッチングさせる正規表現パターンを指定します。ここでは ^/test/document$ を設定しています。この正規表現は、/test/document という URI パスにのみ一致します。
- Text transformation:検査対象のテキストに対する変換処理を指定します。ここでは None なので、テキストに変換はされません。
- Scope of inspectionを設定後、右下の Save rule を選択
- ルールのプライオリティーの画面に遷移するので必要に応じ変更し、右下 Save を選択
以上で設定完了となります。
今回は「/test/document」の URI のみ除外する設定を解説しました。しかし、AWS WAF を運用していると複数の URI を除外設定したいことも大いにあるかと思いますので、正規表現の補足説明をさせていただきます。
複数の URI を除外設定したい場合の設定例を以下に解説します。
2つの「/test/document」と「/images/work」の URI を除外したい場合は以下のように表現します。
^/test/document$|^/images/work$
^ は行頭を表します。
$ は行末を表します。
| は論理和(OR)を表す正規表現の記号です。
また、/images/work 配下全てのパスを対象とする正規表現の場合は、以下のように表現します。
^/test/document$|^/images/work/.*
次のようなパスにマッチします。
/images/work/
/images/work/abc
/images/work/abc/def
/images/work/123/456
/images/work 自体にはマッチしませんのでご注意ください。
以上、正規表現の補足説明でした。
AWS WAF でブロックされた特定の URI リクエストに対して除外設定を適用させてみた(まとめ)
本ブログでは、AWS WAF でブロックされた特定の URI リクエストに対して除外設定する方法を解説させていただきました。
他にも除外設定をする方法として、Regex Pattern Sets を利用して設定する方法がありますが、複雑さやパフォーマンスへの影響に注意が必要なため、今回は特定のルールのみに設定する方法を解説させていただきました。
誤検知問題は、AWS WAF を導入し運用していると必ずと言っていいほど遭遇する問題のひとつです。本ブログが、WAF の活用に関する理解を深め、問題解決の一助となれば幸いです。
AWS WAF の活用にご興味のある方は お問い合わせフォーム よりお気軽にご相談ください。
元記事発行日: 2024年08月30日、最終更新日: 2024年08月30日