AWS WAF、AWS Firewall Manager、および AWS Shield アドバンスド
開発者ガイド (API バージョン 2015-08-24)

チュートリアル: 一般的な攻撃に対する保護のための AWS WAF の迅速な設定

このチュートリアルでは、以下の一般的な攻撃に対して保護するように、AWS CloudFormation を使用して、AWS WAF を迅速に設定する方法を示しています。

  • クロスサイトスクリプティング攻撃 – 攻撃者は、ウェブアプリケーションの脆弱性を悪用するために、スクリプトをウェブリクエストに挿入することがあります。クロスサイトスクリプティング一致条件では、AWS WAF によって悪意のあるスクリプトが検査されるウェブリクエストの部分 (URI やクエリ文字列など) を識別します。

  • SQL インジェクション攻撃 – 攻撃者は、データベースからデータを抽出するために、ウェブリクエストに悪意のある SQL コードを挿入することがあります。SQL インジェクション一致条件では、AWS WAF によって悪意のある SQL コードが検査されるウェブリクエストの部分を識別します。

  • 既知の不正な IP アドレスからの攻撃 – IP 一致条件を使用して、ウェブリクエストをその発生元の IP アドレスに基づいて、許可、ブロック、またはカウントできます。IP 一致条件では、特定の IP アドレスまたは IP アドレス範囲を 1,000 個まで指定できます。

注記

このチュートリアルでは、ウェブアプリケーションのコンテンツの配信に使用する CloudFront ディストリビューションがあることを前提としています。CloudFront ディストリビューションがない場合は、Amazon CloudFront 開発者ガイドの「CloudFront コンソールを使用したウェブディストリビューションの作成または更新」を参照してください。

ソリューションの概要

AWS CloudFormation では、テンプレートを使用して、以下の AWS WAF の条件、ルール、ウェブ ACL を設定します。

条件

AWS CloudFormation によって以下の条件が作成されます。

IP 一致条件

既知の不正な IP アドレスからのリクエストをフィルタします。これにより、簡単に IP をリストに追加して、ウェブサイトへのアクセスをブロックできます。これが必要になるのは、1 つ以上の IP アドレスから多くの不正なリクエストを受信している場合です。リクエストをその発生元の IP アドレスに基づいて許可、ブロック、またはカウントする場合は、このチュートリアルの後半の「ステップ 3 :(オプション) IP 一致条件に IP アドレスを追加する」を参照してください。

条件の名前は prefixManualBlockSet です。ここで、prefix は AWS CloudFormation スタックの作成時にウェブ ACL に指定する名前です。

サイズ制約条件

本文が 8,192 バイトより長いリクエストをフィルタします。フィルタで指定したリクエスト部分の最初の 8,192 バイトのみが AWS WAF によって評価されます。有効なリクエストボディが 8,192 バイトを超えることがない場合は、サイズ制約条件を使用することで、他の方法では見過ごされる可能性のある悪意のあるリクエストを捕えることができます。

このチュートリアルでは、AWS CloudFormation によって、本文が 8,192 バイトより長いリクエストがブロックされるのではなく、カウントのみされるように、AWS WAF を設定しています。有効なリクエストボディがその長さを超えることがない場合は、本文がその長さを超えたリクエストをブロックするように設定を変更できます。8,192 バイトを超えるリクエストの数を表示する方法と、8,192 バイトを超える本文を含むリクエストをブロックするようにウェブ ACL を変更する方法については、「ステップ 4: (オプション) 大きい本文をブロックするようにウェブ ACL を更新する」を参照してください。

条件の名前は prefixLargeBodyMatch です。ここで、prefix は AWS CloudFormation スタックの作成時にウェブ ACL に指定する名前です。

SQL インジェクション条件

悪意のある可能性がある SQL コードを含むリクエストをフィルタします。この条件には、リクエストの以下の部分を評価するフィルタが含まれます。

  • クエリ文字列 (URL デコード変換)

  • URI (URL デコード変換)

  • 本文 (URL デコード変換)

  • 本文 (HTML デコード変換)

条件の名前は prefixSqliMatch です。ここで、prefix は AWS CloudFormation スタックの作成時にウェブ ACL に指定する名前です。

クロスサイトスクリプティングの条件

悪意のある可能性があるスクリプトを含むリクエストをフィルタします。この条件には、リクエストの以下の部分を評価するフィルタが含まれます。

  • クエリ文字列 (URL デコード変換)

  • URI (URL デコード変換)

  • 本文 (URL デコード変換)

  • 本文 (HTML デコード変換)

条件の名前は prefixXssMatch です。ここで、prefix は AWS CloudFormation スタックの作成時にウェブ ACL に指定する名前です。

ルール

AWS CloudFormation スタックを作成すると、AWS CloudFormation によって以下のルールが作成され、対応する条件が各ルールに追加されます。

prefixManualIPBlockRule

AWS CloudFormation によって、このルールに prefixManualBlockSet 条件が追加されます。

prefixSizeMatchRule

AWS CloudFormation によって、このルールに prefixLargeBodyMatch 条件が追加されます。

prefixSqliRule

AWS CloudFormation によって、このルールに prefixSqliMatch 条件が追加されます。

prefixXssRule

AWS CloudFormation によって、このルールに prefixXssMatch 条件が追加されます。

ウェブ ACL

AWS CloudFormation によって、AWS CloudFormation スタックの作成時に指定した名前でウェブ ACL が作成されます。ウェブ ACL には、指定した設定が適用された以下のルールが含まれます。

prefixManualIPBlockRule

デフォルトでは、このルールの条件に IP アドレスは含まれません。リクエストをその発生元の IP アドレスに基づいて許可、ブロック、またはカウントする場合は、このチュートリアルの後半の「ステップ 3 :(オプション) IP 一致条件に IP アドレスを追加する」を参照してください。

prefixSizeMatchRule

デフォルトでは、AWS WAF によって本文が 8,192 バイトより長いリクエストがカウントされます。

prefixSqliRule

AWS WAF によって、このルールの設定に基づいてリクエストがブロックされます。

prefixXssRule

AWS WAF によって、このルールの設定に基づいてリクエストがブロックされます。

要件

このチュートリアルでは、ウェブアプリケーションのコンテンツの配信に使用する CloudFront ディストリビューションがあることを前提としています。CloudFront ディストリビューションがない場合は、Amazon CloudFront 開発者ガイドの「CloudFront コンソールを使用したウェブディストリビューションの作成または更新」を参照してください。このチュートリアルではまた、AWS CloudFormation を使用してプロビジョンプロセスを簡素化しています。詳細については、AWS CloudFormation ユーザーガイドを参照してください。

推定時間

このチュートリアルの完了までの推定時間は、CloudFront ディストリビューションがすでにある場合は 15 分、CloudFront ディストリビューションを作成する必要がある場合は 30 分です。

コスト

このチュートリアルで作成するリソースに対しては料金が発生します。チュートリアルの終了後にそれらのリソースを削除することで、それらに対する料金の発生を停止できます。詳細については、「AWS WAF 料金表」および「Amazon CloudFront 料金表」を参照してください。

ステップ 1: 一般的な攻撃に対する AWS WAF の保護を設定する AWS CloudFormation スタックを作成する

以下の手順では、AWS CloudFormation テンプレートを使用して、一般的な攻撃に対する AWS WAF の保護を設定するスタックを作成します。

重要

このソリューションをデプロイする AWS CloudFormation スタックを作成すると、さまざまなサービスに対する料金が発生します。AWS CloudFormation スタックを削除するまで、料金は発生し続けます。詳細については、「ステップ 5: (オプション) AWS CloudFormation スタックを削除する」を参照してください。

不正なリクエストを送信する IP アドレスをブロックするための AWS CloudFormation スタックを作成するには

  1. AWS CloudFormation スタックを作成するには、まず、AWS リソースを作成するリージョンのリンクを選択します。

  2. AWS マネジメントコンソール にまだサインインしておらず、サインインを求められた場合は、サインインしてください。

  3. [Specify template] ページで、[Amazon S3 URL] を選択します。テンプレートの URL として「https://s3.amazonaws.com/cloudformation-examples/community/common-attacks.json​」と入力します。

  4. [Next] を選択します。

  5. [Specify Details] ページで、次の値を指定します。

    スタックの名前

    デフォルトの名前 (CommonAttackProtection) を使用するか、名前を変更できます。スタック名にスペースを含めることはできません。また、スタック名は AWS アカウント内で一意である必要があります。

    名前

    AWS CloudFormation によって作成されるウェブ ACL の名前を指定します。指定した名前は、AWS CloudFormation によって作成される条件とルールのプレフィックスとしても使用されるため、すべての関連オブジェクトを簡単に見つけることができます。

  6. [Next] を選択します。

  7. (オプション) [Configure stack options] ページで、タグと詳細設定を入力するか、ボックスを空白のままにします。

  8. [Next] を選択します。

  9. [Review] ページで、構成を確認し、[Create stack] を選択します。

    [Create stack] の選択後、AWS CloudFormation によって、「ソリューションの概要」で示している AWS WAF リソースが作成されます。

ステップ 2: ウェブ ACL を CloudFront ディストリビューションに関連付ける

AWS CloudFormation によってスタックが作成されたら、CloudFront ディストリビューションを関連付けて AWS WAF を有効化する必要があります。

注記

必要なだけ多くのディストリビューションにウェブ ACL を関連付けることができますが、特定のディストリビューションに関連付けることができるのは 1 つのウェブ ACL のみです。

ウェブ ACL と CloudFront ディストリビューションを関連付けるには

  1. AWS マネジメントコンソールにサインインし、AWS WAF コンソール(https://console.aws.amazon.com/wafv2/)を開きます。

  2. [AWS WAF へ移動] を選択します。

  3. ナビゲーションペインで [Web ACL] を選択します。

  4. CloudFront ディストリビューションに関連付けるウェブ ACL を選択します。

  5. [Rules] タブの [AWS resources using this web ACL] で、[Add association] を選択します。

  6. プロンプトが表示されたら、[リソース] リストを使用して、このウェブ ACL を関連付けるディストリビューションを選択します。

  7. [追加] を選択します。

  8. このウェブ ACL を追加の CloudFront ディストリビューションと関連付けるには、ステップ 4~6 を繰り返します。

ステップ 3 :(オプション) IP 一致条件に IP アドレスを追加する

AWS CloudFormation スタックを作成したとき、AWS CloudFormation によって IP 一致条件が作成され、ルールに追加され、ルールがウェブ ACL に追加されました。また、IP アドレスに基づいてリクエストをブロックするように、ウェブ ACL が設定されました。ただし、IP 一致条件に IP アドレスは含まれていません。IP アドレスに基づいてリクエストをブロックする場合は、以下の手順を実行します。

AWS CloudFormation パラメータ値を編集するには

  1. AWS WAF コンソール (https://console.aws.amazon.com/wafv2/) を開きます。

  2. ナビゲーションペインで、[IP addresses] を選択します。

  3. [IP match conditions] ペインで、編集する IP 一致条件を選択します。

  4. IP アドレス範囲を追加するには:

    1. ナビゲーションペインで、[IP addresses] を選択します。

    2. 1 つの IP アドレスを入力するか、CIDR 表記で IP アドレス 範囲を入力します。ここでは、以下の 2 つの例を示します。

      • IP アドレス 192.0.2.44 を指定するには、「192.0.2.44/32」と入力します。

      • IP アドレス範囲 192.0.2.0 ~ 192.0.2.255 を指定するには、「192.0.2.0/24」と入力します。

      AWS WAF は IPv4 アドレス範囲: /8、および /16 から /32 までの範囲をサポートしています。AWS WAF は IPv6 アドレス範囲: /24、/32、/48、/56、/64、および /128 をサポートしています。CIDR 表記の詳細については、Wikipedia の「Classless Inter-Domain Routing」を参照してください。

      注記

      AWS WAF は IPv4 と IPv6 の両方の IP アドレスをサポートしています。

    3. IP アドレスをさらに追加するには、[Add another IP address] を選択して、その値を入力します。

    4. [Add] を選択します。

ステップ 4: (オプション) 大きい本文をブロックするようにウェブ ACL を更新する

AWS CloudFormation スタックを作成したとき、AWS CloudFormation によって、本文が 8,192 バイトより長いリクエストをフィルタするサイズ制約条件が作成されました。また、その条件がルールに追加され、ルールがウェブ ACL に追加されました。この例では、AWS CloudFormation によって、リクエストをブロックしないでカウントするように、ウェブ ACL が設定されました。これは、有効なリクエストが誤ってブロックされないようにするのに便利です。

8,192 バイトより長いリクエストをブロックする場合は、以下の手順を実行します。

ウェブ ACL でルールのアクションを変更するには

  1. AWS WAF コンソール (https://console.aws.amazon.com/wafv2/) を開きます。

  2. ナビゲーションペインの [Web ACLs] を選択します。

  3. 編集するウェブ ACL を選択します。

  4. 右ペインで、[Rules] タブを選択します。

  5. [Edit Web ACL] を選択します。

  6. prefixLargeBodyMatchRule のアクションを変更するには、目的のオプションを選択します。(prefix は ウェブ ACL の名前として指定した値です)。

  7. [Save changes] を選択します。

ステップ 5: (オプション) AWS CloudFormation スタックを削除する

ソリューションの概要」で説明した一般的な攻撃からの保護を停止する場合は、「ステップ 1: 一般的な攻撃に対する AWS WAF の保護を設定する AWS CloudFormation スタックを作成する」で作成した AWS CloudFormation スタックを削除します。これにより、AWS CloudFormation が作成した AWS WAF リソースが削除され、それらのリソースに対する AWS 料金が発生しなくなります。

AWS CloudFormation スタックを削除するには

  1. AWS マネジメントコンソール にサインインした後、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. スタックのチェックボックスをオンにします。デフォルト名は、CommonAttackProtection です。

  3. [Delete Stack] を選択します。

  4. [Yes, Delete] を選択して確定します。

  5. スタックの削除状況を追跡するには、スタックのチェックボックスをオンにし、下部のペインにある [Events] タブを選択します。

関連リソース

Lambda 関数、AWS CloudFormation テンプレート、SDK の使用例を含む AWS WAF サンプルについては、GitHub の https://github.com/awslabs/aws-waf-sample にアクセスしてください。