AWS WAF のリクエストコンポーネント - AWS WAF、AWS Firewall Manager、AWS Shield Advanced、および AWS Shield ネットワークセキュリティディレクター

AWS WAF の新しいコンソールエクスペリエンスのご紹介

更新されたエクスペリエンスを使用して、コンソールの任意の場所で AWS WAF 機能にアクセスできるようになりました。詳細については、「更新されたコンソールエクスペリエンスを使用する」を参照してください。

AWS WAF のリクエストコンポーネント

このセクションでは、検査のために指定できるウェブリクエストのコンポーネントについて説明します。ウェブリクエスト内のパターンを検索する一致ルールステートメントのリクエストコンポーネントを指定します。これらのステートメントのタイプには、文字列一致、正規表現一致、サイズ制約、SQL インジェクション攻撃などのステートメントがあります。リクエストコンポーネント設定の使用方法については、「AWS WAF での文字列一致ルールステートメントを使用する」で個々のルールステートメントを参照してください。

特に明記されていない限り、ウェブリクエストがルールステートメントで指定されているリクエストコンポーネントを含まない場合、AWS WAF はリクエストをルール基準と一致しないものとして評価します。

注記

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

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

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

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

このセクションの残りの部分では、ウェブリクエストの検査対象部分のオプションについて説明します。

HTTP メソッド

リクエストの HTTP メソッドが検査されます。HTTP メソッドは、ウェブリクエストが保護対象リソースに対して実行を求めている操作のタイプ (POST または GET など) を示しています。

単一ヘッダー

リクエスト内の単一の名前付きヘッダーが検査されます。

このオプションでは、User-AgentReferer などのヘッダー名を指定します。名前と一致する文字列は、大文字と小文字を区別しません。

すべてのヘッダー

すべてのリクエストヘッダー (cookie を含む) を検査します。フィルターを適用して、すべてのヘッダーのサブセットを検査できます。

このオプションでは、次の仕様を指定します。

  • [Match patterns] (一致パターン) – 検査用のヘッダーのサブセットを取得するために使用するフィルター。AWS WAF は、ヘッダーキーでこれらのパターンを検索します。

    一致パターン設定は、次のいずれかになります。

    • [All] (すべて) – すべてのキーに一致します。すべてのヘッダーのルール検査基準を評価します。

    • [Excluded headers] (除外されるヘッダー) – ここで指定した文字列のいずれとも一致しないキーを持つヘッダーのみを検査します。キーと一致する文字列は大文字と小文字に区別されません。

    • [Included headers] (含まれるヘッダー) – ここで指定した文字列のいずれかに一致するキーを持つヘッダーのみを検査します。キーと一致する文字列は大文字と小文字に区別されません。

  • [Match scope] (一致範囲) – AWS WAF がルール検査基準で検査すべきヘッダーの一部。[キー][値]、または [すべて] を指定して、キーと値の両方で一致するものがあるかどうかを検査することができます。

    [すべて] では、キーで一致するもの、および値で一致するものを見つける必要はありません。キー、値、またはその両方で一致するものを見つける必要があります。キーと値で一致するものを見つけるようにするには、論理 AND ステートメントを使用して、キーを検査する一致ルールと値を検査する一致ルールの 2 つを組み合わせます。

  • オーバーサイズの処理 – AWS WAF で検査可能なサイズよりも大きいヘッダーデータを含むリクエストを AWS WAF が処理する方法。AWS WAF は、リクエストヘッダーの最初の 8 KB (8,192 バイト) まで、および最初の 200 個のヘッダーまでを検査できます。コンテンツは、最初の制限に達するまで、AWS WAF での検査に使用できます。検査を続行するか、検査をスキップするかを選択できます。検査をスキップする場合、リクエストがルールに一致するとマークするか一致しないとマークするかを選択できます。オーバーサイズコンテンツの処理の詳細については、「AWS WAF のオーバーサイズウェブリクエストコンポーネント」を参照してください。

ヘッダーの順序

AWS WAF ではリクエストのヘッダー名のリストを含む文字列を、検査用に受け取ったウェブリクエストに表示される順序で検査します。AWS WAF はこの文字列を生成し、検査でコンポーネントと照合するフィールドとして使用します。AWS WAF は、文字列内のヘッダー名をコロンで区切り、スペースを追加しません (例: host:user-agent:accept:authorization:referer)。

このオプションでは、次の仕様を指定します。

  • オーバーサイズの処理 – AWS WAF で検査可能な数よりも多い、またはサイズが大きいヘッダーデータを含むリクエストを AWS WAF が処理する方法。AWS WAF が検査できるのは、リクエストヘッダーの最初の 8 KB (8,192 バイト) まで、および最初の 200 個のヘッダーまでです。コンテンツは、最初の制限に達するまで、AWS WAF での検査に使用できます。使用可能なヘッダーの検査を続行するか、検査をスキップするかを選択できます。検査をスキップする場合、リクエストがルールに一致するか一致しないかをマークします。オーバーサイズコンテンツの処理の詳細については、「AWS WAF のオーバーサイズウェブリクエストコンポーネント」を参照してください。

Cookie

すべてのリクエスト cookie を検査します。フィルターを適用して、すべての cookie のサブセットを検査できます。

このオプションでは、次の仕様を指定します。

  • [Match patterns] (一致パターン) – 検査用の cookie のサブセットを取得するために使用するフィルター。AWS WAF は、cookie キーでこれらのパターンを検索します。

    一致パターン設定は、次のいずれかになります。

    • [All] (すべて) – すべてのキーに一致します。すべての cookie のルール検査基準を評価します。

    • [Excluded cookies] (除外される cookie) – ここで指定した文字列のいずれとも一致しないキーを持つ cookie のみを検査します。キーの文字列一致は大文字と小文字が区別され、完全に一致する必要があります。

    • [Included cookies] (含まれる cookie) – ここで指定した文字列のいずれかに一致するキーを持つ cookie のみを検査します。キーの文字列一致は大文字と小文字が区別され、完全に一致する必要があります。

  • [Match scope] (一致範囲) – AWS WAF によってルール検査基準で検査される cookie の対象部分。キーと値の両方に、[Keys] (キー)、[Values] (値)、または [All] (すべて) を指定できます。

    [すべて] では、キーで一致するもの、および値で一致するものを見つける必要はありません。キー、値、またはその両方で一致するものを見つける必要があります。キーと値で一致するものを見つけるようにするには、論理 AND ステートメントを使用して、キーを検査する一致ルールと値を検査する一致ルールの 2 つを組み合わせます。

  • オーバーサイズの処理 – AWS WAF で検査可能なサイズよりも大きい Cookie データを含むリクエストを AWS WAF が処理する方法。AWS WAF は、リクエスト Cookie の最初の 8 KB (8,192 バイト) まで、および最初の 200 個の Cookie までを検査できます。コンテンツは、最初の制限に達するまで、AWS WAF での検査に使用できます。検査を続行するか、検査をスキップするかを選択できます。検査をスキップする場合、リクエストがルールに一致するとマークするか一致しないとマークするかを選択できます。オーバーサイズコンテンツの処理の詳細については、「AWS WAF のオーバーサイズウェブリクエストコンポーネント」を参照してください。

URI フラグメント

注記

フラグメント検査は、CloudFront ディストリビューションと Application Load Balancer でのみ利用可能です。

「#」記号の後に続く URL の一部を検査し、#section2 など、リソースに関する追加情報を提供します。詳細については、「Uniform Resource Identifier (URI): 一般的な構文」を参照してください。

このオプションでテキスト変換を使用しない場合、AWS WAF は URI フラグメントを正規化せず、リクエストでクライアントから受信したままの形で URI を検査します。テキスト変換については、「AWS WAF でのテキスト変換の使用」を参照してください。

ルールステートメントの要件

このルールステートメントにはフォールバック動作を指定する必要があります。フォールバック動作は、URI にフラグメントがないか、関連付けられたサービスが Application Load Balancer または CloudFront でない場合に、AWS WAF がウェブリクエストに割り当てるようにする一致ステータスです。一致を選択した場合、AWS WAF はリクエストをルールステートメントに一致するものとして処理し、ルールアクションをリクエストに適用します。一致なしを選択した場合、AWS WAF はリクエストをルールステートメントと一致しないものとして処理します。

URI パス

URL 内でリソースを識別する部分 (/images/daily-ad.jpg など) が検査されます。詳細については、「Uniform Resource Identifier (URI): 一般的な構文」を参照してください。

このオプションでテキスト変換を使用しない場合、AWS WAF は URI を正規化せず、リクエストでクライアントから受信したままの形で URI を検査します。テキスト変換については、「AWS WAF でのテキスト変換の使用」を参照してください。

JA3 フィンガープリント

リクエストの JA3 フィンガープリントを検査します。

注記

JA3 フィンガープリント検査は、Amazon CloudFront ディストリビューションと Application Load Balancer でのみ利用可能です。

JA3 フィンガープリントは、受信リクエストの TLS Client Hello から生成される 32 文字のハッシュです。このフィンガープリントは、クライアントの TLS 設定の一意の識別子として機能します。AWS WAF は、計算を行うのに十分な TLS Client Hello 情報が含まれているリクエストごとに、このフィンガープリントを計算して記録します。この情報は、ほとんどすべてのウェブリクエストに含まれています。

クライアントの JA3 フィンガープリントを取得する方法

クライアントリクエストの JA3 フィンガープリントは、保護パック (ウェブ ACL) ログからを取得できます。AWS WAF がフィンガープリントを計算できる場合は、ログに含まれています。フィールドのログ記録については、「保護パック (ウェブ ACL) トラフィックのログフィールド」を参照してください。

ルールステートメントの要件

JA3 フィンガープリントは、指定した文字列と完全に一致するように設定されている文字列一致ステートメント内のみで検査することができます。同じ TLS 設定を持つ将来のリクエストと一致させるために、文字列一致ステートメントの仕様のログから JA3 フィンガープリント文字列を指定します。文字列一致ルールステートメントの詳細については、「文字列一致ルールステートメント」を参照してください。

このルールステートメントにはフォールバック動作を指定する必要があります。フォールバック動作とは、AWS WAF が JA3 フィンガープリントを計算できない場合に、AWS WAF がウェブリクエストに割り当てる一致ステータスです。一致を選択した場合、AWS WAF はリクエストをルールステートメントに一致するものとして処理し、ルールアクションをリクエストに適用します。一致なしを選択した場合、AWS WAF はリクエストをルールステートメントと一致しないものとして処理します。

この一致オプションを使用するには、保護パック (ウェブ ACL) トラフィックをログに記録する必要があります。詳細については、「ログ記録 AWS WAF 保護パック (ウェブ ACL) トラフィック」を参照してください。

JA4 フィンガープリント

リクエストの JA4 フィンガープリントを検査します。

注記

JA4 フィンガープリント検査は、Amazon CloudFront ディストリビューションと Application Load Balancer でのみ利用可能です。

JA4 フィンガープリントは、受信リクエストの TLS Client Hello から生成される 36 文字のハッシュです。このフィンガープリントは、クライアントの TLS 設定の一意の識別子として機能します。JA4 フィンガープリントは JA3 フィンガープリントの拡張機能であり、一部のブラウザでは一意のフィンガープリントが少なくなります。AWS WAF は、計算に十分な TLS Client Hello 情報を持つリクエストごとにこのフィンガープリントを計算してログに記録します。この情報は、ほとんどすべてのウェブリクエストに含まれています。

クライアントの JA4 フィンガープリントを取得する方法

クライアントリクエストの JA4 フィンガープリントは、保護パック (ウェブ ACL) ログからを取得できます。AWS WAF がフィンガープリントを計算できる場合は、ログに含まれています。フィールドのログ記録については、「保護パック (ウェブ ACL) トラフィックのログフィールド」を参照してください。

ルールステートメントの要件

JA4 フィンガープリントは、指定した文字列と完全に一致するように設定されている文字列一致ステートメント内のみで検査することができます。同じ TLS 設定を持つ将来のリクエストと一致させるために、文字列一致ステートメントの仕様のログから JA4 フィンガープリント文字列を指定します。文字列一致ルールステートメントの詳細については、「文字列一致ルールステートメント」を参照してください。

このルールステートメントにはフォールバック動作を指定する必要があります。フォールバック動作とは、AWS WAF が JA4 フィンガープリントを計算できない場合に、AWS WAF がウェブリクエストに割り当てる一致ステータスです。一致を選択した場合、AWS WAF はリクエストをルールステートメントに一致するものとして処理し、ルールアクションをリクエストに適用します。一致なしを選択した場合、AWS WAF はリクエストをルールステートメントと一致しないものとして処理します。

この一致オプションを使用するには、保護パック (ウェブ ACL) トラフィックをログに記録する必要があります。詳細については、「ログ記録 AWS WAF 保護パック (ウェブ ACL) トラフィック」を参照してください。

クエリ文字列

URL 内で ? 文字の後に続く部分 (ある場合) が検査されます。

注記

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

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

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

このオプションでは、[Query argument] (クエリ引数) も指定します。例えば、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 (すべてのクエリパラメータ)

リクエスト内のすべてのクエリパラメータが検査されます。これは、単一のクエリパラメータコンポーネントを選択した場合に似ていますが、AWS WAF では、クエリ文字列に含まれるすべての引数の値を検査します。例えば、URL が www.xyz.com?UserName=abc&SalesRegion=seattle である場合は、UserName または SalesRegion の値が検査基準に一致すると、AWS WAF は一致をトリガーします。

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

[Body] (本文)

プレーンテキストとして評価されて、リクエストボディが検査されます。また、JSON コンテンツタイプを使用して、本文を JSON として評価することもできます。

リクエストボディは、リクエストの一部で、リクエストヘッダーの直後に続く部分です。これには、フォームからのデータなど、ウェブリクエストに必要な追加データが含まれます。

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

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

Application Load Balancer と AWS AppSync の場合、AWS WAF はリクエストボディの最初の 8 KB を検査できます。CloudFront、API Gateway、Amazon Cognito 、App Runner、Verified Access の場合、AWS WAF がデフォルトで最初の 16 KB を検査でき、保護パック (ウェブ ACL) 設定で制限を最大 64 KB まで引き上げることができます。詳細については、「AWS WAF でのボディ検査の管理に関する考慮事項」を参照してください。

このコンポーネントタイプには、オーバーサイズの処理を指定する必要があります。オーバーサイズの処理には、本文のデータが AWS WAF で検査できるサイズより大きいリクエストを AWS WAF で処理する方法が定義されます。検査を続行するか、検査をスキップするかを選択できます。検査をスキップする場合、リクエストがルールに一致するとマークするか一致しないとマークするかを選択できます。オーバーサイズコンテンツの処理の詳細については、「AWS WAF のオーバーサイズウェブリクエストコンポーネント」を参照してください。

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

JSON 本文

JSON として評価されて、リクエストボディが検査されます。本文をプレーンテキストとして評価することもできます。

リクエストボディは、リクエストの一部で、リクエストヘッダーの直後に続く部分です。これには、フォームからのデータなど、ウェブリクエストに必要な追加データが含まれます。

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

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

Application Load Balancer と AWS AppSync の場合、AWS WAF はリクエストボディの最初の 8 KB を検査できます。CloudFront、API Gateway、Amazon Cognito 、App Runner、Verified Access の場合、AWS WAF がデフォルトで最初の 16 KB を検査でき、保護パック (ウェブ ACL) 設定で制限を最大 64 KB まで引き上げることができます。詳細については、「AWS WAF でのボディ検査の管理に関する考慮事項」を参照してください。

このコンポーネントタイプには、オーバーサイズの処理を指定する必要があります。オーバーサイズの処理には、本文のデータが AWS WAF で検査できるサイズより大きいリクエストを AWS WAF で処理する方法が定義されます。検査を続行するか、検査をスキップするかを選択できます。検査をスキップする場合、リクエストがルールに一致するとマークするか一致しないとマークするかを選択できます。オーバーサイズコンテンツの処理の詳細については、「AWS WAF のオーバーサイズウェブリクエストコンポーネント」を参照してください。

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

このオプションでは、以下のセクションで説明されている通り追加の仕様を提供します。

AWS WAF が JSON ボディ検査を処理する方法

がウェブリクエストボディを JSON として AWS WAF 検査すると、ボディを解析し、検査用に JSON 要素を抽出するステップを実行します。AWS WAF は、設定の選択に従ってこれらのステップを実行します。

AWS WAF が実行するステップを以下に示します。

  1. ボディの内容を解析する – AWS WAF は、検査のために JSON 要素を抽出するために、ウェブリクエストボディのコンテンツを解析します。AWS WAF はボディのコンテンツ全体を解析するために最善を尽くしますが、コンテンツのさまざまなエラー状態で解析が失敗する可能性があります。例としては、無効な文字、重複するキー、切り捨て、ルートノードがオブジェクトまたは配列ではないコンテンツなどがあります。

    [ボディ解析のフォールバック動作] オプションは、JSON ボディの完全な解析に失敗した場合の AWS WAF を決定します:

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

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

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

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

    注記

    このフォールバック動作は、AWS WAF が JSON 文字列の解析中にエラーが発生した場合にのみ行われます。

    解析では JSON が完全に検証されません

    AWS WAF 解析では入力の JSON 文字列を完全に検証できないため、無効な JSON であっても解析は成功する可能性があります。

    例えば、AWS WAF は、次の無効な JSON をエラーなしで解析します:

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

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

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

    このように、解析は成功したものの結果が完全に有効な JSON ではない場合、評価の後続のステップの結果が異なることがあります。抽出で一部の要素が欠落したり、ルール評価で予期しない結果が出たりする可能性があります。アプリケーションで受信した JSON を検証し、必要に応じて無効な JSON を処理することをお勧めします。

  2. JSON 要素を抽出 – AWS WAF は、設定に従って検査する必要がある JSON 要素のサブセットを識別します。

    • オプション [JSON一致スコープ] は、AWS WAF が検査すべき JSON 内の要素の種類を指定します。

      キーと値の両方に、[Keys] (キー)、[Values] (値)、または [All] (すべて) を指定できます。

      [すべて] では、キーで一致するもの、および値で一致するものを見つける必要はありません。キー、値、またはその両方で一致するものを見つける必要があります。キーと値で一致するものを見つけるようにするには、論理 AND ステートメントを使用して、キーを検査する一致ルールと値を検査する一致ルールの 2 つを組み合わせます。

    • オプション [検査するコンテンツ] は、AWS WAF が検査するサブセットに要素セットをフィルタリングする方法を指定します。

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

      • [完全な JSON コンテンツ] – すべての要素を評価します。

      • [含まれる要素のみ] – パスが提供された JSON ポインタの基準に一致する要素のみを評価します。このオプションで JSON 内のすべてのパスを表示しないでください。代わりに [完全な JSON コンテンツ] を使用してください。

        JSON ポインタ構文の詳細については、インターネットエンジニアリングタスクフォース (IETF) ドキュメントの「JavaScript オブジェクト表記 (JSON) ポインタ」を参照してください。

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

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

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

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

    例えば、[検査するコンテンツ] 設定が [含まれる要素のみ] で、含まれている要素設定が /a/b であるとします。

    たとえば、次の JSON ボディの例の場合:

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

    AWS WAF が各 [JSON 一致スコープ] 設定のために検査する要素セットを以下に示します。含まれている要素のパスの一部であるキー b は評価されないことを注意してください。

    • すべて: ef, および g

    • キー : e および f

    • : g

  3. JSON 要素セットを検査 – AWS WAF は指定されたテキスト変換を抽出された JSON 要素に適用し、その結果の要素セットをルールステートメントの一致条件と一致します。これは、他のウェブリクエストコンポーネントに対するものと同じ変換および評価の動作です。抽出された JSON 要素のいずれかが一致する場合、そのウェブリクエストはルールに一致します。