AWS WAF を使った Web アプリケーション防御のワークショップをやってみた

AWS WAF を使った Web アプリケーション防御のワークショップをやってみた

CloudFrontを保護する保護パックの作成から、XSS・SQLインジェクション対策、ボットコントロール、レート制限、API保護まで、7つのステップでセキュリティ対策を実装する手順を紹介します。
2026.08.07

今回は、こちらのワークショップを実施しました。

https://catalog.us-east-1.prod.workshops.aws/workshops/81e94a4b-b47f-4acc-a284-914c4514d50f/ja-JP/3-remediate/6-bot-rate

ざっくりまとめ

  • 所要時間:1時間
  • 使用するサービス:WAF、CloudFormation

本記事は、以下のステップで AWS WAF に触れていきます。

  1. 事前準備
  2. AWS WAF 保護パックの作成
  3. XSS と SQL インジェクションのブロック
  4. カスタムルールによるパスの保護
  5. Bot トラフィックの可視化
  6. カスタムルールで不正な Bot をブロック
  7. Bot トラフィックのレート制限とカスタムレスポンスの送信
  8. リクエストボディ解析による API の保護

事前準備

  1. AWS マネジメントコンソールのナビゲーションバーで、CloudShell アイコンをクリックし、CloudShell を起動します。

  2. 以下のコマンドを実行し、CloudFormation テンプレート、およびセットアップスクリプトを含むファイルをダウンロードします。

# Download workshop assets
curl 'https://static.us-east-1.prod.workshops.aws/public/90da0b04-1885-47d8-815b-1df3716ae62f/assets/automated-scanner.zip'      --output automated-scanner.zip
curl 'https://static.us-east-1.prod.workshops.aws/public/90da0b04-1885-47d8-815b-1df3716ae62f/assets/manual-scanner.zip'         --output manual-scanner.zip
curl 'https://static.us-east-1.prod.workshops.aws/public/90da0b04-1885-47d8-815b-1df3716ae62f/assets/rate-limit-trigger.zip'     --output rate-limit-trigger.zip
curl 'https://static.us-east-1.prod.workshops.aws/public/90da0b04-1885-47d8-815b-1df3716ae62f/assets/sample-static-website.html' --output sample-static-website.html
curl 'https://static.us-east-1.prod.workshops.aws/public/90da0b04-1885-47d8-815b-1df3716ae62f/assets/scanning-dashboard.html'    --output scanning-dashboard.html

# Download CloudFormation template and the setup script
curl 'https://static.us-east-1.prod.workshops.aws/public/90da0b04-1885-47d8-815b-1df3716ae62f/static/waf-workshop.yaml' --output waf-workshop.yaml
curl 'https://static.us-east-1.prod.workshops.aws/public/90da0b04-1885-47d8-815b-1df3716ae62f/static/deploy-workshop-own-account.sh' --output deploy-workshop-own-account.sh
  1. 以下のコマンドを実行し、スクリプトを実行して、リソースをデプロイします。
sh deploy-workshop-own-account.sh
  1. CloudFormation のスタック作成が完了したら、[出力] タブを開き、3xProgressDashboard のリンクを開き、WAF 構成に対して現在合格しているテスト(SQL インジェクション、XSS など)の数が表示されたダッシュボードを確認します。

スクリーンショット 2026-08-07 150643

ステップ 1:AWS WAF 保護パックの作成

  1. AWS WAF & Shield コンソール を開きます。

  2. [保護パック (ウェブ ACL) を作成] をクリックします。

スクリーンショット 2026-08-07 105723

  1. アプリカテゴリで [その他] を選択します。

スクリーンショット 2026-08-07 105750

  1. [リソースを追加] のドロップダウンメニューから、[CloudFront リソースまたは Amplify リソースを追加] を選択します。

スクリーンショット 2026-08-07 105817

  1. リソース名に Sample Web Application が含まれる CloudFront ディストリビューションを選択し、[追加] をクリックします。

スクリーンショット 2026-08-07 105843

  1. 保護パックの名前を入力します。

スクリーンショット 2026-08-07 105934

  1. 保護パック (ウェブ ACL) をカスタマイズ - オプション を展開し、以下の内容で設定して、[保護パック(ウェブ ACL)を作成] をクリックします。
  • デフォルトのルールアクション:すべてを Count アクションに設定
  • ログ記録送信先のタイプ:Amazon Data Firehose ストリーム
  • Amazon Data Firehose ストリーム:aws-waf-logs-workshop

スクリーンショット 2026-08-07 110033

ステップ 2:XSS と SQL インジェクションのブロック

  1. 保護パックが作成されたら、ルールの隣にある [表示および編集] をクリックします。

スクリーンショット 2026-08-07 110206

  1. AWS-AWSManagedRulesCommonRuleSet を選択します。

スクリーンショット 2026-08-07 110324

  1. [オーバーライドルールグループ] のチェックを外し、[ルールを保存] をクリックします。

スクリーンショット 2026-08-07 110414

  1. 続いて、AWS-AWSManagedRulesSQLiRuleSet を選択します。

  2. [オーバーライドルールグループ] のチェックを外し、[ルールを保存] をクリックします。

  3. CloudFormation の [出力] タブを開き、3xProgressDashboard のリンクを開きます。
    SQL injectionCross site scripting (XSS)Path traversal attack テストが合格していることを確認します。

スクリーンショット 2026-08-07 150929

ステップ 3:カスタムルールによるパスの保護

  1. 再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。

スクリーンショット 2026-08-07 110457

  1. カスタムルール を選択し、[次へ] をクリックします。

スクリーンショット 2026-08-07 110637

  1. カスタムルール を選択し、[次へ] をクリックします。

スクリーンショット 2026-08-07 110653

  1. 以下の内容でルールを設定し、[ルールを追加] をクリックします。
  • ルール名:path-block
  • 検査:URI パス
  • 一致タイプ:文字列で始まる
  • 一致する文字列:/includes
  • テキスト変換:URL デコードユニコード

スクリーンショット 2026-08-07 110830

  1. CloudFormation の [出力] タブを開き、4xTestProtections のリンクを開きます。
    /includes へのアクセスクエストに対して 403 Forbidden が返されることを確認します。

スクリーンショット 2026-08-07 111734

ステップ 4:Bot トラフィックの可視化

  1. 再度、保護パックのルールの隣にある [表示および編集] をクリックします。

  2. AWS-AWSManagedRulesBotControlRuleSet を選択します。

  3. 以下の内容でルールを設定し、[ルールを追加] をクリックします。

  • 検査:一致ステートメント
  • リクエストが以下の場合:ステートメントと一致しない(NOT)
  • 検査:URI パス
  • 一致タイプ:正規表現に一致
  • 正規表現:(?i).(jpe?g|gif|png|svg|ico|css|js|woff2?)$
  • テキスト変換:なし

スクリーンショット 2026-08-07 111400

ステップ 5:カスタムルールで不正な Bot をブロック

  1. 再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。

  2. [カスタムルール] を選択し、[次へ] をクリックします。

  3. [カスタムルール] を選択し、[次へ] をクリックします。

  4. 以下の内容でルールを設定し、[ルールを追加] をクリックします。

  • ルール名:zyborg-block
  • リクエストが以下の場合:ステートメントと一致する
  • 検査:ラベルがあります
  • ステートメント:ラベル
  • マッチキー:awswaf:managed:aws:bot-control:bot:name:zyborg

スクリーンショット 2026-08-07 111613

  1. CloudFormation の [出力] タブを開き、3xProgressDashboard のリンクを開きます。
    Common bot テストが合格していることを確認します。

スクリーンショット 2026-08-07 151502

ステップ 6:Bot トラフィックのレート制限とカスタムレスポンスの送信

  1. 再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。

  2. [カスタムルール] を選択し、[次へ] をクリックします。

  3. [レートベースのルール] を選択し、[次へ] をクリックします。

スクリーンショット 2026-08-07 111813

  1. 以下の内容でルールを設定し、[ルールを追加] をクリックします。
  • ルール名:phpcrawl-rate-limiter
  • レート制限:100
  • 評価ウィンドウ:5 分
  • リクエスト集約:送信元IPアドレス
  • 検査範囲とレート制限:ルールステートメントの条件に一致するリクエストのみを考慮
  • リクエストが以下の場合:ステートメントと一致する
  • 検査:ラベルがあります
  • ステートメント:ラベル
  • マッチキー:awswaf:managed:aws:bot-control:bot:name:phpcrawl
  • 有効化:True
  • レスポンスコード:429
  • キー:Retry-After
  • 値:900

スクリーンショット 2026-08-07 111914

スクリーンショット 2026-08-07 112038

スクリーンショット 2026-08-07 112107

  1. CloudFormation の [出力] タブを開き、Trigger Rate Limiting のリンクを開きます。
    初期状態では、すべてのリクエストに対して 200 OK が返されます。
    レート制限ルールがトリガーされると、リクエストはブロックされ、429 Too Many Requests が返されます。

スクリーンショット 2026-08-07 112227

スクリーンショット 2026-08-07 112422

ステップ 7:リクエストボディ解析による API の保護

  1. 再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。

  2. [カスタムルール] を選択し、[次へ] をクリックします。

  3. [カスタムルール] を選択し、[次へ] をクリックします。

  4. 以下の内容でルールを設定します。

  • ルール名:api-protection
  • リクエストが以下の場合:すべてのステートメントと一致する (AND)
  • 検査:JSON 本文
  • JSON マッチスコープ:
  • 無効な JSON 本文リクエストのアクション:一致なし
  • 検査するコンテンツ:含まれる要素のみ
  • 含まれる要素:__/numrecords __
  • オーバーサイズ処理:続行
  • 一致タイプ:__正規表現に一致 __
  • 正規表現:^0*(?:[1-9][0-9]?|100)$
  • テキスト変換:なし
  • ステートメントを否定します:チェック

スクリーンショット 2026-08-07 112702

スクリーンショット 2026-08-07 113447

スクリーンショット 2026-08-07 113524

  1. [別のステートメントを追加します] をクリックし、以下の内容でルールを設定します。
  • 検査:URI パス
  • 一致タイプ:文字列に完全に一致
  • 一致する文字列:/api/listproducts.php
  • テキスト変換:なし

スクリーンショット 2026-08-07 113555

スクリーンショット 2026-08-07 113615

  1. CloudFormation の [出力] タブを開き、3xProgressDashboard のリンクを開きます。
    API Misuse テストが合格していることを確認します。

スクリーンショット 2026-08-07 113809

最後に

AWS WAF のレートベースルールとカスタムレスポンスの設定方法が学べる、ボット対策の実践パターンとしておすすめのワークショップでした。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事