AWS WAF のマネージドルールで誤検知が発生した場合、どうすれば回避できますか?

2023.02.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

AWS WAF のマネージドルールにて誤検知(BLOCK)が発生しました。
どのような設定を行えば誤検知を回避できるか教えてください。

具体的な回答

誤検知の一般的な回避方法は、以下手順にて設定を行う必要があります。

①.誤検知があったルールと文字列を特定する。
②.誤検知があった文字列を許可(ALLOW)するルールを追加する。
③.追加したルールを、誤検知があったルールより高い優先度に設定する。

誤検知があったルールと文字列を特定する。

始めに、誤検知があったルールと誤検知の根本的な原因である文字列を WAF のログから特定する必要があります。
※WAF ログが無効となっている場合は有効に設定し、ログの取得を行う必要があります。

誤検知が発生した時間帯の WAF ログを取得し、ログから誤検知があったルールと文字列を特定します。
まず、ログから "action" フィールドが "BLOCK" となっているルールを探します。

例として、AWS ドキュメントのログの例を抜粋して解説します。

{
    "timestamp":1592361810888,
    "formatVersion":1,
    "webaclId":"arn:aws:wafv2:us-east-1:123456789012:global/webacl/hello-world/5933d6d9-9dde-js82-v8aw-9ck28nv9"
    ,"terminatingRuleId":"RG-Reference"
    ,"terminatingRuleType":"GROUP"
    ,"action":"BLOCK",
    "terminatingRuleMatchDetails":
    [{
        "conditionType":"XSS"
        ,"location":"HEADER"
        ,"matchedData":["<","frameset"]
    }]
    ,"httpSourceName":"-"
    ,"httpSourceId":"-"
    ,"ruleGroupList":

ログの例 - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced

"action" フィールドが "BLOCK" となっているルールの、
"terminatingRuleId" フィールド内の記述が、誤検知したルールID
"matchedData"フィールド内が、誤検知した文字列です。
※文字列は ,(カンマ)区切りで1文字です。

上記 JSON を例とすると、
"RG-Reference"誤検知したルールID
"<""frameset"誤検知した文字列となります。

誤検知があった文字列を許可(ALLOW)するルールを追加する。

文字列一致ステートメントを用いて、誤検知した文字列を許可するルールを追加します。

ルール一覧画面から「Add rules」→「Add my own rules and rule groups」を選択し、ルール追加画面に移行します。

ここでは、ルール名やステートメントを設定します。

今回は例として、下記の設定にしていますが、こちらの設定は要件に合った選択肢を選んでください。

If a request:matches the statement
(以下に設定するステートメントに一致した場合に、Action の内容を行う)

Inspect:All query parameters
(全てのクエリパラメータを検査する)

Match type:Contains string
(以下に設定した「文字列を含む」場合に一致とする)

※文字列一致で設定を行うため、Match type は String match condition(文字列一致)の中から選んでください。(下記画像参照)

選択肢の詳細については、以下ドキュメントを参照ください。

ウェブリクエストコンポーネント - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced

文字列一致ルールステートメント - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced

String to match に先ほど特定した文字列を入力、Action を ALLOW に設定し、ルールの追加を完了します。

例として取り上げた設定内容の場合、「全てのクエリパラメータを検査、その中に誤検知があった文字列を含む記述があった場合、一致と判定する。一致と判定した場合、許可アクションを行う」となります。

追加したルールを、誤検知があったルールより高い優先度に設定する。

最後に、Set rule priority にて、追加したルールのpriority(優先度)を調整します。

Move upMove down のボタンでルールの priority(優先度)を調整し、誤検知があったルールよりも追加したルールの優先度を高く(priority の数字を低く)設定して完了です。

以上、マネジメントルールにて発生した誤検知への一般的な回避方法でした。

参考資料