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

ウェブリクエストコンポーネント設定

このセクションでは、ウェブリクエストのコンポーネントを検査するルールステートメントに指定できる設定について説明します。使用の詳細については、個別のルールステートメントを参照してください。

リクエストコンポーネント

リクエストコンポーネントは、AWS WAF で検査するウェブリクエストの部分を指定します。これは、ウェブリクエスト内のパターンを検索する標準ルールステートメントで指定します。これには、正規表現パターン一致、SQL インジェクション攻撃、サイズ制約のステートメントなどが該当します。

特に明記されていない限り、ルールステートメントで指定されているリクエストコンポーネントがウェブリクエストにない場合、リクエストはルールと一致しません。

注記

リクエストコンポーネントは、それを必要とするルールステートメントごとに 1 つずつ指定します。リクエストの複数のコンポーネントを検査するには、コンポーネントごとにルールステートメントを作成します。

AWS WAF コンソールと API のドキュメントには、次の場所でのこれらの設定に関するガイダンスが記載されています。

  • コンソールのルールビルダー – 通常のルールタイプの [Statement] (ステートメント) 設定で、[Request components] (コンポーネントをリクエスト) の下の [Inspect] (検査) ダイアログで検査するコンポーネントを選択します。

  • API ステートメントのコンテンツFieldToMatch

ウェブリクエストの検査対象部分のオプションは以下のとおりです。

リクエストの検査対象部分のオプション

[Header] (ヘッダー)

特定のリクエストヘッダー。このオプションでは、[Header type] (ヘッダータイプ) フィールドでヘッダーの名前 (User-AgentReferer など) も選択します。

[HTTP method] (HTTP メソッド)

ウェブリクエストで送信元に実行を求めている操作のタイプを示す HTTP メソッド。

[Query string] (クエリ文字列)

URL 内で ? 文字の後に続く部分 (ある場合)。

注記

クロスサイトスクリプティングの一致条件については、[Query string] (クエリ文字列) ではなく、[All query parameters] (すべてのクエリパラメータ) を選択することをお勧めします。[All query parameters] (すべてのクエリパラメータ) を選択すると、基本コストに 10 WCU が追加されます。

Single query parameter (単一クエリパラメータ)

クエリ文字列の一部として定義したパラメータ。AWS WAF は、指定されたパラメータの値を検査します。

このオプションでは、[Query parameter name] (クエリパラメータ名) も指定します。例えば、URL が www.xyz.com?UserName=abc&SalesRegion=seattle である場合は、名前として UserName または SalesRegion を指定できます。名前は最大 30 文字です。名前では大文字と小文字が区別されないため、名前として UserName を指定すると、AWS WAF は UserName のすべてのバリエーション (usernameUsERName など) と一致します。

クエリ文字列に、指定された名前のインスタンスが複数含まれている場合、AWS WAF は OR ロジックを使用して、一致するすべての値を検査します。例えば、URL www.xyz.com?SalesRegion=boston&SalesRegion=seattle では、AWS WAF は、指定された名前を boston および seattle に対して評価します。いずれかが一致する場合、検査結果は一致となります。

All query parameters (すべてのクエリパラメータ)

[Single query parameter] (単一クエリパラメータ) に似ていますが、AWS WAF はクエリ文字列に含まれるすべてのパラメータの値を検査します。例えば、URL が www.xyz.com?UserName=abc&SalesRegion=seattle である場合は、UserName または SalesRegion の値が検査基準に一致すると、AWS WAF は一致をトリガーします。

このオプションを選択すると、基本コストに 10 WCU が追加されます。

URI パス

URL 内でリソースを識別する部分 (/images/daily-ad.jpg など)。詳細については、「Uniform Resource Identifier (URI): 一般的な構文」を参照してください。このオプションでテキスト変換を使用しない場合、AWS WAF は URI を正規化せず、リクエストでクライアントから受信したとおりに検査します。

[Body] (本文)

リクエストヘッダーの直後に続くリクエストの部分。プレーンテキストとして評価されます。これには、フォームからのデータなど、ウェブリクエストに必要な追加データが含まれます。

  • コンソールで、[Content type] (コンテンツタイプ) の [Plain text] (プレーンテキスト) を選択して、[Request option] (リクエストオプション) の [Body] (本文) でこれを選択します。

  • API では、ルールの FieldToMatch の指定で、リクエストボディをプレーンテキストとして検査するように Body を指定します。

警告

リクエストボディの最初の 8 KB (8,192 バイト) のみが、検査のために AWS WAF に転送されます。これを管理する方法については、「ウェブリクエストボディの検査」を参照してください。

本文を解析された JSON として評価することもできます。これに関する詳細については、以降のセクションを参照してください。

JSON 本文

リクエストヘッダーの直後に続くリクエストの部分。解析された JSON として評価されます。本文には、フォームからのデータなど、ウェブリクエストに必要な追加データが含まれます。本文をプレーンテキストとして評価することもできます。これに関する詳細については、前のセクションを参照してください。

  • コンソールで、[Content type] (コンテンツタイプ) の [JSON] を選択して、[Request option] (リクエストオプション) の [Body] (本文) でこれを選択します。

  • API で、ルールの FieldToMatch の指定で JsonBody を指定します。

警告

リクエストボディの最初の 8 KB (8,192 バイト) のみが、検査のために AWS WAF に転送されます。これを管理する方法については、「ウェブリクエストボディの検査」を参照してください。

JSON 本文の検査の詳細については、次のセクションを参照してください。JSON 本文オプションを選択すると、一致ステートメントの基本コスト WCU が 2 倍になります。例えば、一致ステートメントのベースコストが JSON 解析なしで 5 WCU の場合、JSON 解析を使用すると、コストが 10 WCU に倍増します。

JSON 本文リクエストコンポーネント

JSON 本文の検査は、ウェブリクエストボディの特殊な検査を提供します。ウェブリクエストボディの検査に関する一般的な情報については、前のセクションを参照してください。

警告

リクエストボディの最初の 8 KB (8,192 バイト) のみが、検査のために AWS WAF に転送されます。これを管理する方法については、「ウェブリクエストボディの検査」を参照してください。

AWS WAF がウェブリクエストボディを解析された JSON として検査する場合、JSON から要素を解析および抽出し、ルールの一致ステートメントの基準を使用して指定した部分を検査します。

このオプションを選択すると、一致ステートメントの基本コスト WCU が 2 倍になります。例えば、一致ステートメントのベースコストが JSON 解析なしで 5 WCU の場合、JSON 解析を使用すると、コストが 10 WCU に倍増します。

このオプションを使用すると、AWS WAF は、リクエストボディに対して 2 つの一致パターンを実行し、最初の一致パターンの出力を 2 つ目のパターンへの入力として使用します。

  1. AWS WAF は、JSON コンテンツを解析して抽出し、検査対象の要素を識別します。これを行うために、AWS WAF はルールの JSON 本文の仕様で指定した基準を使用します。

  2. AWS WAF は、抽出された要素にテキスト変換を適用し、結果として生じる JSON 要素のセットをルールステートメントの一致基準と照合します。いずれかの要素が一致する場合、ウェブリクエストはルールに一致します。

検査する JSON 要素を識別するために、最初のパターン一致ステップで AWS WAF が使用できるように次の基準を指定します。

  • [Body parsing fallback behavior] (本文解析のフォールバック動作) – JSON 本文の完全な解析に失敗した場合の AWS WAF の対応。オプションは次のとおりです。

    • [None (default behavior)] (なし (デフォルトの動作)) - AWS WAF は解析エラーが発生する時点までのコンテンツを評価します。

    • [Evaluate as string] (文字列として評価) - プレーンテキストとして本文を検査します。AWS WAF は、JSON 検査用に定義したテキスト変換と検査基準を本文テキスト文字列に適用します。

    • [Match] (一致) - ウェブリクエストをルールステートメントと一致するものとして扱います。AWS WAF はルールアクションをリクエストに適用します。

    • 一致なし - ウェブリクエストをルールステートメントと一致しないものとして処理します。

    AWS WAF は、JSON 本文全体を解析するために最善を尽くしますが、無効な文字、重複キー、切り詰め、ルートノードがオブジェクトまたは配列でないコンテンツなどの理由で強制的に停止されることがあります。

    AWS WAF は、次の例の JSON を 2 つの有効なキーと値のペアとして解析します。

    • カンマ不足: {"key1":"value1""key2":"value2"}

    • コロン不足: {"key1":"value1","key2""value2"}

    • 余分なコロン: {"key1"::"value1","key2""value2"}

  • JSON 一致範囲 – AWS WAF が検査する必要がある JSON の要素のタイプ。キーと値の両方に、[Keys] (キー)、[Values] (値)、または [All] (すべて) を指定できます。

  • 検査するコンテンツ – AWS WAF が検査する、解析および抽出された JSON 内の要素。

    いずれかを指定する必要があります。

    • [Full JSON content] (完全な JSON コンテンツ) - 解析された JSON のすべての要素を評価します。

    • [Only included elements] (含まれる要素のみ) - 指定した JSON ポインター基準に一致する JSON の要素のみを評価します。JSON Pointer 構文の詳細については、インターネットエンジニアリングタスクフォース (IETF) ドキュメントの「JavaScript Object Notation (JSON) Pointer」を参照してください。

      このオプションを使用して、JSON にすべてのパスを含めないでください。代わりに [Full JSON content] (完全な JSON コンテンツ) を使用してください。

      例えば、コンソールで次の内容を指定できます。

      /dogs/0/name /dogs/1/name

      API または CLI では、次を指定できます。

      "IncludedPaths": ["/dogs/0/name", "/dogs/1/name"]

JSON 本文の検査シナリオの例

含まれる要素の設定が /a/b の場合、次の JSON 本文については次のとおりです。

{ "a":{ "c":"d", "b":{ "e":{ "f":"g" } } } }

次のリストは、AWS WAF が一致範囲の各設定について何を評価するかを示しています。含まれている要素のパスの一部であるキー b は評価されません。

  • 一致範囲がすべてに設定されている場合: ef,、および g

  • 一致範囲がキーに設定されている場合: e および f

  • 一致範囲が値に設定されている場合: g

テキスト変換

パターンを探すステートメント、または制約を設定するステートメントで、リクエストを検査する前に AWS WAF が適用する変換を指定できます。変換では、AWS WAF をバイパスするために攻撃者が使用する異常なフォーマットの一部を削除するために、ウェブリクエストが再フォーマットされます。

これを JSON 本文リクエストコンポーネントの選択で使用する場合、AWS WAF は JSON から検査する要素を解析および抽出した後、変換を適用します。詳細については、前のセクションの「JSON 本文リクエストコンポーネント」を参照してください。

複数の変換が指定された場合、AWS WAF は変換の適用順序も設定します。

WCU - テキスト変換ごとには 10 個の WCU。

AWS WAF コンソールと API のドキュメントには、次の場所でのこれらの設定に関するガイダンスも記載されています。

  • コンソールのルールビルダー - [Text transformation] (テキスト変換)。このオプションは、リクエストコンポーネントの使用時に選択できます。

  • API ステートメントのコンテンツTextTransformations

テキスト変換のオプション

Base64 デコード

AWS WAF は、Base64 でエンコードされた文字列をデコードします。

Base64 デコードテキスト

AWS WAF は Base64 でエンコードされた文字列をデコードしますが、無効な文字を無視する寛容な実装を使用します。

コマンドライン

このオプションは、攻撃者がオペレーティングシステムのコマンドラインコマンドを挿入し、異常なフォーマットを使用して、コマンドの一部またはすべてを偽装する状況を緩和します。

このオプションを使用して、次の変換を実行します。

  • 次の文字を削除します: \ " ' ^

  • 次の文字の前にあるスペースを削除します: / (

  • 次の文字をスペースに置き換えます: , ;

  • 複数のスペースを 1 つのスペースに置き換えます。

  • 大文字 A-Z を小文字 a-z に変換します。

空白を圧縮する

AWS WAF は、複数のスペースを 1 つのスペースに置き換え、次の文字を空白文字 (10 進数の 32) に置き換えます。

  • \f、フォームフィード、10 進数の 12

  • \t、タブ、10 進数の 9

  • \n、改行、10 進数の 10

  • \r、キャリッジリターン、10 進数の 13

  • \v、垂直タブ、10 進数の 11

  • 改行なしスペース、10 進数 160

CSS デコード

AWS WAF は、CSS 2.x エスケープルール syndata.html#characters を使用してエンコードされた文字をデコードします。この関数は、デコード処理で最大 2 バイトを使用するため、通常はエンコードされない CSS エンコーディングを使用してエンコードされた ASCII 文字を発見するのに役立ちます。また、バックスラッシュと 16 進数以外の文字の組み合わせである回避対策にも役立ちます。例えば、javascript の場合は ja\vascript とします。

エスケープシーケンスデコード

AWS WAF は、次の ANSI C エスケープシーケンスをデコードします: \a, \b, \f, \n, \r, \t, \v, \\, \?, \', \", \xHH (hexadecimal), \0OOO (octal)。有効でないエンコーディングは出力に残ります。

16 進数のデコード

AWS WAF は、16 進数の文字列をバイナリにデコードします。

HTML エンティティのデコード

AWS WAF は、HTML エンコードされた文字をエンコードされていない文字に置き換えます。

  • "" に置き換えます。

  •   を改行なしスペース、10 進数 160 に置き換えます

  • &lt;< に置き換えます。

  • &gt;> に置き換えます。

  • 16 進数形式の文字 (&#xhhhh;) を対応する文字に置き換えます。

  • 10 進数形式の文字 (&#nnnn;) を対応する文字に置き換えます。

JS デコード

AWS WAF は、JavaScript のエスケープシーケンスをデコードします。\uHHHH コードが FF01-FF5E の全角 ASCII コード範囲内にある場合、高位バイトを使用して下位バイトが検出され、調整されます。そうでない場合は、下位バイトのみが使用され、上位バイトはゼロになり、情報が失われる可能性があります。

小文字

AWS WAF は、大文字 (A〜Z) を小文字 (a〜z) に変換します。

MD5

AWS WAF は、入力内のデータから MD5 ハッシュを計算します。計算されたハッシュは生のバイナリ形式です。

[None] (なし)

AWS WAF は、テキスト変換なしで、受信したとおりにウェブリクエストを検査します。

正規化パス

AWS WAF は、入力文字列から、入力の先頭にない複数のスラッシュ、ディレクトリ自己参照、およびディレクトリバックリファレンスを削除します。

正規化パス win

AWS WAF はこれを NORMALIZE_PATH のように処理しますが、最初にバックスラッシュ文字をフォワードスラッシュに変換します。

null を削除する

AWS WAF は入力からすべての NULL バイトを削除します。

コメントを置換する

AWS WAF は、C スタイルのコメント (/* ... */) の各出現を 1 つのスペースに置き換えます。複数の連続する出現は圧縮されません。終端されていないコメントもスペース (ASCII 0x20) に置き換えられます。ただし、コメントのスタンドアロン終了 (*/) は処理されません。

null を置換する

AWS WAF は入力の NULL バイトをスペース文字 (ASCII 0x20) に置き換えます。

SQL 16 進数デコード

AWS WAF は、SQL 16 進数のデータをデコードします。例えば、(0x414243) は (ABC) にデコードされます。

[URL decode] (URL デコード)

AWS WAF は、URL でエンコードされた値をデコードします。

URL デコード Uni

URL_DECODE と同様ですが、Microsoft 固有の %u エンコーディングをサポートしています。コードが FF01-FF5E の全角 ASCII コード範囲内にある場合、高位バイトを使用して下位バイトが検出され、調整されます。それ以外の場合は、下位バイトのみが使用され、高位バイトはゼロになります。

Unicode への UTF8

AWS WAF は、すべての UTF-8 文字シーケンスを Unicode に変換します。これは、英語以外の言語の入力正規化や、偽陽性および偽陰性を最小限に抑えるのに役立ちます。