AWS WAF を利用して DDoS 攻撃を緩和するにはどうすればいいですか?

所要時間5分
0

AWS WAF を利用して分散型サービス拒否 (DDoS) 攻撃を防ぐにはどうすればよいですか?

簡単な説明

DDoS 攻撃は、攻撃者が標的とするシステムの可用性を妨害しようとする試みです。

インフラストラクチャレイヤー攻撃の場合、Amazon CloudFront や Elastic Load Balancing (ELB) などの AWS のサービスを利用して、自動 DDoS 保護を提供できます。詳細については、「AWS best practices for DDoS resiliency」(DDoS 耐性に関する AWS のベストプラクティス) を参照してください。

アプリケーションレイヤー攻撃では、AWS WAF を主要な緩和策として利用できます。AWS WAF ウェブアクセスコントロールリスト (ウェブ ACL) は、アプリケーションレイヤーでの DDoS 攻撃の影響を最小限に抑えます。次を実行します。

  • レートベースのルールを使用する。
  • 既存のレートベースのルールを確認し、不正なリクエストをブロックするためにレート制限のしきい値を低くすることを検討する。
  • AWS WAF ログをクエリして、許可されていないアクティビティの特定の情報を収集する。
  • ビジネスにおいて想定されていない国からの不正なリクエストをブロックする地理的一致ルールを作成する。
  • IP アドレスに基づいて不正なリクエストをブロックする IP セット一致ルールを作成する。
  • 不正なリクエストをブロックする正規表現一致ルールを作成する。

解決方法

レートベースのルールを使用する

包括的または URI 固有のレートベースのルールを作成して、DDoS 攻撃からウェブアプリケーションを保護できます。詳細については、「The three most important AWS WAF rate-based rules」(AWS WAF の最も重要な 3 つのレートベースのルール) を参照してください。

AWS WAF コンソールから包括的なレートベースのルールを作成する

包括的なレートベースのルールを利用すると、ウェブアプリケーションに対して IP が実行できるリクエストの数のしきい値を設定できます。

  1. AWS WAF コンソールを開きます。
  2. RBR が定義されていない [Web ACL] (ウェブ ACL) を選択し、[Rate-based rule] (レートベースのルール) を選択します。
  3. ルールの [Name] (名前) を入力します。
  4. [Rate limit] (レート制限) を入力します。レート制限は、任意の単一 IP アドレスから 5 分間に許可されるリクエストの最大数です。この制限に達すると、レートベースのルールアクションが IP アドレスに適用されます。IP アドレスからのリクエストが制限を下回ると、アクションは中止されます。
    注: レート制限のしきい値は、リクエスト数が過多であり、悪意がある可能性があるとみなされる、単一の IP アドレスからのリクエストの数を表します。これがない場合には、適切なリクエストがブロックされる可能性があります。設定すべき制限が不明な場合は、リクエストパターンをカウントしてモニタリングするようにルールアクションを設定するのがベストプラクティスです。
  5. [IP address to use for rate limiting] (レート制限に使用する IP アドレス) で、[Source IP address] (ソース IP アドレス) または [IP address in header] (ヘッダーの IP アドレス) を選択します。

[IP address in header] (ヘッダー内の IP アドレス): CDN またはその他のプロキシネットワークを介してリクエストが送信されると、ソース IP アドレスによってプロキシが識別され、元の IP アドレスがヘッダーで送信されます。ヘッダーはプロキシによって一貫性のない態様で処理される可能性があるため、[IP address in header] (ヘッダーの IP アドレス) オプションを使用する場合は注意が必要です。また、ヘッダーは検査をバイパスするように変更できます。

[Source IP address] (ソース IP アドレス): [Criteria to count request towards rate limit] (レート制限に向けてリクエストをカウントする基準) で、[count requests that match the criteria of a rule statement] (ルールステートメントの基準に一致するリクエストをカウント) を選択します。 6. リクエスト数が制限を超えている間、IP アドレスからのリクエストをカウントまたはブロックするようにルールアクションを設定します。ルールアクションの適用と削除が有効になるまでに、IP アドレスのリクエストレートが変更されてから 1~2 分後かかる場合があります。 7. [Add Rule] (ルールを追加) を選択します。 8. [Next] (次へ) を選択します。

レートベースのルールステートメントの作成については、「Rate based rule statement」(レートベースのルールステートメント) を参照してください。

AWS WAF コンソールから URI 固有のレートベースのルールを作成する

  1. AWS WAF コンソールを開きます。
  2. レートベースのルールが定義されていないウェブ ACL を選択し、[Rate-based rule] (レートベースのルール) を選択します。
  3. ルールの [Name] (名前) を入力します。
  4. [Rate limit] (レート制限) を入力します。
  5. [IP address to use for rate limiting] (レート制限に使用する IP アドレス) で、[Source IP address] (ソース IP アドレス) または [I****P address in header] (ヘッダーの IP アドレス) を選択します。
  6. [Criteria to count request towards rate limit] (レート制限に対してリクエストをカウントする基準) で、[Only consider requests that match the criteria in a rule statement] (ルールステートメントの条件に一致するリクエストのみを対象にする) を選択します。
  7. 次の変数を利用して [Statement] (ステートメント) を作成します。
    [Inspect] (検査) で、[URI path] (URI パス) を選択します。
    [Match type] (一致タイプ) で、[Exactly matches string] (完全一致文字列) を選択します。
    [String to match] (一致する文字列) で、/login と入力します。アプリケーションに固有の URI を選択できます。
    [Text transformation] (テキスト変換) では、[None] (なし) のままにします。
  8. リクエスト数が制限を超えている間、IP アドレスからのリクエストをカウントまたはブロックするようにルールアクションを設定します。
  9. [Add Rule] (ルールを追加) を選択します。
  10. [Next] (次へ) を選択します。

既存のレートベースのルールを確認し、不正なリクエストをブロックするためにレート制限のしきい値を低くすることを検討する

コンソールで既存のレートベースのルールを変更するには、次を実行します。

  1. AWS WAF コンソールを開きます。
  2. [Web ACL] (ウェブ ACL) を選択し、既存のレートベースのルールを選択します。
  3. 必要に応じて、[Rate limit threshold] (レート制限のしきい値) を下げます。
  4. [Rule action] (ルールアクション) を [Block] (ブロック) に設定します。
  5. [Save rule] (ルールを保存) を選択します。
  6. [Next] (次へ) を選択します。

詳細については、「Rate-based rule statement」(レートベースのルールステートメント) を参照してください。

レートベースのルールによって追跡およびカウントされるリクエストの範囲を狭めることを検討する

AWS WAF が追跡およびカウントするリクエストの範囲を絞り込むには、レートベースのステートメント内でスコープダウンステートメントを利用します。その後、AWS WAF はスコープダウンステートメントに一致するリクエストをカウントします。

米国に所在する攻撃者からの最近のリクエストに基づいて、次のスコープダウンステートメントを利用してレートベースのルールを作成します。

  1. 米国からのリクエストを特定する geo-match 一致ステートメント。
  2. User-Agent ヘッダーで Badbot という文字列を検索する文字列一致ステートメント。

レート制限を 1,000 に設定したとします。AWS WAF は、IP アドレスごとに、ネストされた両方のステートメントの条件を満たすリクエストをカウントします。両方のステートメントを満たさないリクエストはカウントされません。IP アドレスの数が任意の 5 分間において 1,000 リクエストを超えると、ルールのアクションはその IP アドレスに対してトリガーされます。

この例を使用して、コンソールでスコープダウンステートメントをレートベースのルールに追加するには、次を実行します。

  1. AWS WAF コンソールを開きます。
  2. [Web ACL] (ウェブ ACL) を選択し、既存のレートベースのルールを選択します。
  3. [Criteria to count requests towards rate limit] (レート制限に向けてリクエストをカウントする基準) で、[only requests that match the criteria in rule statement] (ルールステートメントの基準に一致するリクエストのみ) を選択します。
  4. 次のステートメントに一致するリクエストのみをカウントします。
    リクエストがすべてのステートメントに一致する場合 (AND)
    ステートメント 1
    [Inspect] (検査): [Originates from a country in](次の国から発信:) を選択します。
    [Country Codes] (国コード):[United States-US] (米国-US) を選択します。
    [IP address to use for rate limiting] (レート制限に使用する IP アドレス): [Source IP address] (ソース IP アドレス) または [IP address in header] (ヘッダーの IP アドレス) のいずれかを選択します。

-および-

ステートメント 2
[Inspect] (検査): [Single Header] (単一ヘッダー) を選択します。
[Header field name] (ヘッダーフィールド名): User-Agent と入力します。
[Match type] (一致タイプ): [Exactly matches string] (完全一致文字列) を選択します。
[String to match] (一致させる文字列): Badbot と入力します。 5. [Save Rule] (ルールを保存) を選択します。 6. [Next] (次へ) を選択します。

AWS WAF ログをクエリして、許可されていないアクティビティの特定の情報を収集する

必ず AWS WAF ログ記録をオンにしてください (まだオンにしていない場合)。

トラフィックを分析するためにウェブ ACL のログ記録をオンにしたら、AWS WAF ログをクエリして DDoS シナリオを調査します。次を利用して AWS WAF ログをクエリできます。

Amazon Athena ログパーサーまたは AWS Lambda ログパーサーを使用する

レートベースのルールを使用すると、連続して更新される 5 分間に任意の単一 IP アドレスから許可されるウェブリクエストの最大数を指定できます。IP アドレスが設定された制限を超えた場合、新しいリクエストはリクエストレートが設定されたしきい値を下回るまでブロックされます。レートベースのルールで許容される最小レート制限値は 100 です。

許可される最小しきい値のためにレートベースのルールを使用できないシナリオでは、AWS WAF Automation で使用可能な Athena ログパーサーまたは Lambda ログパーサーの実装の使用を検討してください。レートベースのルールでは、デフォルトのブロック期間は 240 秒です。Athena と Lambda のログパーサーの両方で、適用可能な IP アドレスをブロックする期間 (分) を選択できます。

Athena と Lambda のログパーサーの実装には、次のパラメータがあります。

  • [Request threshold] (リクエストしきい値): IP アドレスごとに 5 分あたりの許容される最大リクエスト数。
  • [Block period] (ブロック期間): 該当する IP アドレスをブロックする期間 (分)。

どちらのソリューションでも、AWS CloudFormation スタックをプロビジョニングまたは更新するときにパラメータを定義できます。

レートベースのルールまたは Athena ログパーサーが使用できない場合は、Lambda ログパーサーを使用します。詳細については、「AWS Lambda log parser」(AWS Lambda ログパーサー) を参照してください。

Athena Log パーサーを使用する際にはコストの増加に注意してください。HTTP フラッドの保護にこのオプションを使用すると、Athena の使用に対して課金されます。デフォルトでは、各 Athena クエリは 5 分ごとに実行され、過去 4 時間のデータをスキャンします。パーティショニングは、コストを低く抑えるために、ログと Athena クエリに適用されます。WAF Block Period テンプレートパラメータの値を変更することにより、クエリがスキャンするデータの時間数を設定できます。ただし、スキャンするデータ量を増やすと、Athena のコストが増加する可能性があります。

詳細については、「Cost estimate of Amazon Athena」(Amazon Athena の費用見積もり) を参照してください。

ビジネスにおいて想定されていない国からの不正なリクエストをブロックする地理的一致ルールを作成する

1 つ以上の地理的一致ルールステートメントを作成して、発信国に基づいてウェブリクエストを許可またはブロックします。

AWS WAF コンソールで地理的一致ルールを作成するには:

  1. AWS WAF コンソールを開きます。
  2. [Web ACL] (ウェブ ACL) を選択し、[Regular rule] (通常のルール) を選択して、[Geo Match] (地理的一致) ルールを作成します。
  3. [Request options] (リクエストオプション) で、[originates from a country in] (次の国から発信:) を選択し、ドロップダウンリストから国コードを選択します。
  4. ルールアクション[BLOCK] (ブロック) に設定します。
  5. [Add rule] (ルールを追加) を選択します。

IP アドレスに基づいて不正なリクエストをブロックする IP セット一致ルールを作成する

リクエストの発信元の IP アドレスに基づいてウェブリクエストを許可またはブロックする IP セット一致ルールステートメントを作成します。IP 一致条件には、リクエストの発信元となる最大 10,000 個の IP アドレスまたは IP アドレス範囲が一覧表示されます。プロセスの後半で、ウェブ ACL を作成するときに、これらの IP アドレスからのリクエストを許可またはブロックするように指定できます。

AWS WAF コンソールで IP 一致ルールを作成するには:

  1. AWS WAF コンソールを開きます。
  2. IP セットを作成し、その IP アドレスをリストに追加します。
  3. ウェブ ACL を選択し、[Regular rule] (通常のルール) を選択して、IP 一致ルールを作成します。
  4. [Request options] (リクエストオプション) で、[originates from an IP address in] (次の IP アドレスから発生:) を選択し、ステップ 2 で作成した IP セットを選択します。
  5. ルールアクションを [BLOCK] (ブロック) に設定します。
  6. [Add Rule] (ルールを追加) を選択します。

詳細については、「Creating and managing an IP set」(IP セットの作成と管理) を参照してください。

不正なリクエストをブロックする文字列一致ルールを作成する

DDoS 攻撃中は通常、ソース IP が 1 つではないため、単一または少数の IP アドレスに基づいてフィルタリングするのは困難です。このようなシナリオでは、リクエストのすべてのセクションを評価して、正しいリクエストと不正なリクエストの区別パターンを特定することが重要です。文字列一致ルールまたは正規表現一致ルールを作成することは、不正なリクエストをブロックする効率的な方法です。

例えば、不正なリクエストが User-Agent: BadBot からのものである場合、ヘッダーの詳細に基づいて文字列一致ルールを作成できます。

AWS WAF コンソールで文字列一致ルールを作成するには:

  1. AWS WAF コンソールを開きます。
  2. ウェブ ACL を選択し、[Regular rule] (通常のルール) を選択して、文字列一致ルールを作成します。
  3. リクエストオプションで、次を選択します。
    [Inspect] (検査) で、[Header] (ヘッダー) を選択します。
    [Header field name] (ヘッダーフィールド名) で、User-Agent と入力します。
    [Match Type] (一致タイプ) で、[Exactly matches string] (完全一致文字列) を選択します。****[String to Match] (照合する文字列) で、BadBot と入力します。
  4. ルールアクション[BLOCK] (ブロック) に設定します。
  5. [Add rule] (ルールを追加) を選択します。

不正なリクエストをブロックする正規表現一致ルールを作成する

正規表現一致ルールステートメントは、リクエストコンポーネントを単一の正規表現 (regex) と照合するように AWS WAF に指示します。リクエストコンポーネントが指定した正規表現と一致する場合、ウェブリクエストはステートメントと一致します。

AWS WAF コンソールで正規表現一致ルールを作成するには:

  1. AWS WAF コンソールを開きます。
  2. ウェブ ACL を選択し、[Regular rule] (通常のルール) を選択して、文字列一致ルールを作成します。
  3. リクエストオプションで、次を選択します。
    [Inspect] (検査) で、[URI path] (URI パス) を選択します。
    [Match type] (一致タイプ) で、[Matches regular expression] (正規表現に一致) を選択します。
    [String to match] (照合する文字列) で、正規表現を入力します。
  4. ルールアクション[BLOCK] (ブロック) に設定します。
  5. [Add rule] (ルールを追加) を選択します。

AWS公式
AWS公式更新しました 2年前
コメントはありません