AWS WAF を使った Web アプリケーション防御のワークショップをやってみた
今回は、こちらのワークショップを実施しました。
ざっくりまとめ
- 所要時間:1時間
- 使用するサービス:WAF、CloudFormation
本記事は、以下のステップで AWS WAF に触れていきます。
- 事前準備
- AWS WAF 保護パックの作成
- XSS と SQL インジェクションのブロック
- カスタムルールによるパスの保護
- Bot トラフィックの可視化
- カスタムルールで不正な Bot をブロック
- Bot トラフィックのレート制限とカスタムレスポンスの送信
- リクエストボディ解析による API の保護
事前準備
-
AWS マネジメントコンソールのナビゲーションバーで、CloudShell アイコンをクリックし、CloudShell を起動します。
-
以下のコマンドを実行し、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
- 以下のコマンドを実行し、スクリプトを実行して、リソースをデプロイします。
sh deploy-workshop-own-account.sh
- CloudFormation のスタック作成が完了したら、[出力] タブを開き、3xProgressDashboard のリンクを開き、WAF 構成に対して現在合格しているテスト(SQL インジェクション、XSS など)の数が表示されたダッシュボードを確認します。

ステップ 1:AWS WAF 保護パックの作成
-
AWS WAF & Shield コンソール を開きます。
-
[保護パック (ウェブ ACL) を作成] をクリックします。

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

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

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

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

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

ステップ 2:XSS と SQL インジェクションのブロック
- 保護パックが作成されたら、ルールの隣にある [表示および編集] をクリックします。

- AWS-AWSManagedRulesCommonRuleSet を選択します。

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

-
続いて、AWS-AWSManagedRulesSQLiRuleSet を選択します。
-
[オーバーライドルールグループ] のチェックを外し、[ルールを保存] をクリックします。
-
CloudFormation の [出力] タブを開き、3xProgressDashboard のリンクを開きます。
SQL injection、Cross site scripting (XSS)、Path traversal attack テストが合格していることを確認します。

ステップ 3:カスタムルールによるパスの保護
- 再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。

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

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

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

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

ステップ 4:Bot トラフィックの可視化
-
再度、保護パックのルールの隣にある [表示および編集] をクリックします。
-
AWS-AWSManagedRulesBotControlRuleSet を選択します。
-
以下の内容でルールを設定し、[ルールを追加] をクリックします。
- 検査:一致ステートメント
- リクエストが以下の場合:ステートメントと一致しない(NOT)
- 検査:URI パス
- 一致タイプ:正規表現に一致
- 正規表現:(?i).(jpe?g|gif|png|svg|ico|css|js|woff2?)$
- テキスト変換:なし

ステップ 5:カスタムルールで不正な Bot をブロック
-
再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。
-
[カスタムルール] を選択し、[次へ] をクリックします。
-
[カスタムルール] を選択し、[次へ] をクリックします。
-
以下の内容でルールを設定し、[ルールを追加] をクリックします。
- ルール名:zyborg-block
- リクエストが以下の場合:ステートメントと一致する
- 検査:ラベルがあります
- ステートメント:ラベル
- マッチキー:awswaf:managed:aws:bot-control:bot:name:zyborg

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

ステップ 6:Bot トラフィックのレート制限とカスタムレスポンスの送信
-
再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。
-
[カスタムルール] を選択し、[次へ] をクリックします。
-
[レートベースのルール] を選択し、[次へ] をクリックします。

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



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


ステップ 7:リクエストボディ解析による API の保護
-
再度、保護パックのルールの隣にある [表示および編集] を選択し、[ルールを追加] をクリックします。
-
[カスタムルール] を選択し、[次へ] をクリックします。
-
[カスタムルール] を選択し、[次へ] をクリックします。
-
以下の内容でルールを設定します。
- ルール名:api-protection
- リクエストが以下の場合:すべてのステートメントと一致する (AND)
- 検査:JSON 本文
- JSON マッチスコープ:値
- 無効な JSON 本文リクエストのアクション:一致なし
- 検査するコンテンツ:含まれる要素のみ
- 含まれる要素:__/numrecords __
- オーバーサイズ処理:続行
- 一致タイプ:__正規表現に一致 __
- 正規表現:^0*(?:[1-9][0-9]?|100)$
- テキスト変換:なし
- ステートメントを否定します:チェック



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


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

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







