AWS WAF で JSON Body 検査時のフォールバック動作についてドキュメントが更新されたので、改めて挙動を確認してみた

2024.06.27

いわさです。

AWS WAF ではリクエストの検査を行うためのカスタムルールを作成することが出来るのですが、Body を検査する場合は、JSON コンテンツであることとその場合に特定のキーバリューの検査を行うことが出来ます。

みなさん AWS WAF の公式ドキュメントは毎朝チェックされていると思いますが、今朝 JSON コンテンツ検査周りの仕様に関する記述が少し変わりましたね。
内容としては、JSON Body 検査時の解析仕様などが少し明文化されましたとのことです。

Document history - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced より

ドキュメント上の変更点

私のほうで新旧ドキュメントを比較してみました。
細かい記述や表記箇所が少し変わっていたりはするのですが無視して良い程度の表記変更であり、大きく変わった点としては以下の赤枠部分が明記された、と考えて良さそうです。

Request component options - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced より

フォールバック動作が発生する条件について明記されるようになりました。
フォールバック動作は以下で設定する部分です。

AWS WAF の JSON Body 検査の挙動は以下の流れで動作します。
この時、JSON の検査に失敗した場合に上記フォールバック動作が発生するのですが、フォールバック動作は 1 の抽出時に無効だと判断された場合にのみ適用されるという点が明記されました。

  1. 検査のために JSON 要素を抽出するために、ウェブリクエスト本文の内容を解析
  2. 検査する JSON 要素のサブセットを識別(キー、バリュー、すべて)
  3. 抽出された JSON 要素に指定したテキスト変換を適用し、結果の要素セットをルールステートメントの一致基準と照合

実際の挙動を確認してみた

適当な API Gateway を用意して、Web ACL の挙動を確認してみます。
作成手順は割愛させて頂きますが、JSON Body を受信出来る API を用意しました。

% curl -X POST "https://bkoi2noesc.execute-api.ap-northeast-1.amazonaws.com/hogestage" -H "Content-Type: application/json" -d '{"hoge": {"fuga": "iwasa", "piyo": "iwasa2"}}'
{
    "result": "hoge"
}

ルールを設定

これに Web ACL をアタッチします。
先程のドキュメントに従って以下のようなルールを作成してみました。

ルールにマッチした場合はブロックさせるルールとしています。
JSON Body の/hoge/fugaあるいは/hoge/piyoの値がiwasaであればブロックされます。
また、フォールバック時の動作は「マッチ」にしていますので、JSON パースに失敗した場合もブロックされます。

そもそも/hoge/fugaあるいは/hoge/piyoが含まれない場合にブロックされるのかどうかという点がポイントでしょうか。今回のドキュメント明記された内容からすると、ルールアクションは発生しないはずです。

ルールマッチの動作を確認

まずは期待された構造の JSON リクエストを受信した際の挙動を確認してみます。
ルールに一致した場合はブロック(403: Forbidden)となり、一致しない場合は正常にレスポンスが返却されています。期待どおりです。

# 一致する場合
% curl -X POST "https://bkoi2noesc.execute-api.ap-northeast-1.amazonaws.com/hogestage" -H "Content-Type: application/json" -d '{"hoge": {"fuga": "iwasa", "piyo": "iwasa2"}}'
{"message":"Forbidden"}

# 一致しない場合
% curl -X POST "https://bkoi2noesc.execute-api.ap-northeast-1.amazonaws.com/hogestage" -H "Content-Type: application/json" -d '{"hoge": {"fuga": "val1", "piyo": "val2"}}'
{
    "result": "hoge"
}

フォールバック動作の確認

続いてフォールバック動作も確認してみましょう。
JSON パースにい失敗するように不正な構造としてみます。

% curl -X POST "https://bkoi2noesc.execute-api.ap-northeast-1.amazonaws.com/hogestage" -H "Content-Type: application/json" -d '{"hoge": {"fuga": "val1", "piyo": "val2"'
{"message":"Forbidden"}

Forbidden となりましたね。フォールバック動作で指定したブロックが発生しています。これも期待どおりです。

期待していない構造だが JSON パースは成功する場合

最後に、JSON パースは成功するが期待するフィールドがそもそも含まれていない場合も確認してみましょう。

% curl -X POST "https://bkoi2noesc.execute-api.ap-northeast-1.amazonaws.com/hogestage" -H "Content-Type: application/json" -d '{"key1": {"fuga": "iwasa", "piyo": "iwasa"}}'
{
    "result": "hoge"
}

ドキュメントに明記されたとおりフォールバック動作が発生しないことが確認出来ました。
そもそも不正なリクエスト構造の場合にブロックする用途ではフォールバック動作は利用出来ないということですね。なるほど。

さいごに

本実は AWS WAF で JSON Body 検査時のフォールバック動作を確認してみました。

私はあまり意識したことがなかったのですが、特に期待する JSON 構造ではない場合もフォールバック発生するのでは?という点が曖昧で、問い合わせが多かったとか、ユーザーフィードバックがあったのかもしれませんね。

AWS WAF のカスタムルールで JSON Body を検査されている方は、このフォールバック動作のタイミングを把握しておきましょう。