Amazon Web Services ブログ
AWS WAFによるリクエストとレスポンスのカスタマイズ
※2021年9月22日 ALB リスナールールでのリクエストタグ付けのユースケースは、すべてのケースに当てはまらないため削除しました。
AWS WAF は 2021年 3月にカスタムレスポンスとリクエストヘッダー挿入をサポートしました。このブログでは AWS WAF をカスタマイズして、アプリケーションのユーザー体験及びセキュリティを向上させる方法を紹介します。
HTTP レスポンスコードは、クライアントのリクエストに応じてサーバーが送信する標準のレスポンスです。AWS WAF がリクエストをブロックすると、クライアントに送り返されるデフォルトのレスポンスコードは HTTP 403(Forbidden) となります。HTTP 403 レスポンスコードは、Web サーバーのエンジンのデフォルトのエラーページに関連付けられています。このページはユーザーフレンドリーではありません。現在の AWS WAF はカスタムレスポンス機能により、ステータスコードを HTTP 403 から HTTP 2xx、3xx、4xx、5xx に変更したり、リクエストがブロックされた時に、カスタムボディを返すことができるようになりました。また、カスタムレスポンスを利用することで、AWS WAF と自社サーバーのどちらでブロックされたリクエストなのかを区別することができます。
HTTP リクエストが AWS WAF によって検査され許可された時、リクエストは関連するリソースに渡されます。現在は Web アクセスコントロールリスト (Web ACL) 内のルールを Allow または Count に設定する際、カスタムHTTP リクエストヘッダーを挿入できます。これらのリクエストにヘッダーでタグ付けすることで、アプリケーションに追加のロジックを実装できるようになりました。
これらの機能をどのように利用できるか、2つのユースケースを紹介します。
ユースケース1:カスタムレスポンスコード
このケースではカスタムレスポンスコードを使用して、視聴者のリクエストを別の Web ページにリダイレクトします。HTTP 3xx レスポンスコードを使用して、受け取ったリクエストをリダイレクトし、HTTP ヘッダーの Location を使用してリダイレクト先の Web サイトの URL を指定します。図1 にワークフローの概要を示します。
図1:カスタムレスポンスコードを使ったリクエストのリダイレクトの概要
図1 は以下の手順を示しています。
- AWS WAF には 5 分毎に 100 件のリクエストを許可するレートベースのルールがあります
- ユーザーが複数のリクエストを送信し、AWS WAF のレートベースルールの閾値を超えます
- AWS WAF はユーザーからのそれ以上のリクエストをブロックします
- AWS WAF のカスタムレスポンスコード機能は、レスポンスコードを HTTP 403 から HTTP 302 – Temporary Redirect に変更し、リダイレクト先の URL を指定する Location ヘッダーを付けます
AWS WAF の Web ACL とカスタムレスポンスコードのルールを設定する
以下は Application Load Balancer を作成して、AWS WAF に関連付ける手順です。
- ロードバランサーとリスナーを設定する手順に従い、インターネット向けのロードバランサーを作成します
- ロードバランサーが作成されたら、AWS WAF コンソールを開きます
- ナビゲーションペインで「Web ACLs」を選択し「Create web ACL」を選択します
- 「Name」には、この Web ACL を識別するために名前を入力します
- 「Resource type」で作成した Application Load Balancer を選択し、「Add」を選択します
- 「Next」を選択します
- 「Add rules」 から「Add my own rules and rule groups」を選択します
- 「Name」には、このルールを識別するために名前を入力します
- 「Type」では「Rate-based rule」を選択します
- 「Rate limit」には「100」を入力します
- 「Action」ではデフォルトの「Block」のまま、「Custom response」の Enable にチェックを入れます
- 「Response code」には 302 と入力します
- 「Response headers」下の「Add new custom header」で、「Key」が「Location」「Value」を「example.com」としたカスタムヘッダーを追加します
- 「Add rule」を選択します
- 続けて「Next」を選択して概要ページに移動し「Create web ACL」を選択します
Web ACL が作成されると、図2 に示すような Web ACL の設定が表示されます。
これで設定は完了です。ブロックされたリクエストを別の URL にリダイレクトするように、レートベースのルールが設定された Web ACL ができました。期待通り機能していることを確認するために、5 分間に 100 件以上のリクエストを送信しているテストユーザーのログを有効にして分析することができます。
図3 ではテストユーザーインスタンスに 302 という、カスタムレスポンスコードが送信されています。
図3 の例では、ユーザーが PC から 100 以上のリクエストを送信することで、ブロックされることを検証しました。Location ヘッダーを検証するために、ブラウザの開発者ツールを使ってトラフィックを解析しました。図4 に示すように、レスポンスには設定されたリダイレクト URL を含む、カスタムヘッダー Location が含まれています。
ユースケース2:カスタムエラーページ
この例では AWS WAF のカスタムエラーページを使用して、リクエストをデフォルトの Web サーバーのエラーページではなく、別のエラーページにルーティングします。図5 にあるようにワークフローはユースケース1 と似ています。
図5は以下の手順を示しています。
- AWS WAF には、5 分ごとに 100 件のリクエストを許可するレートベースのルールがあります
- ユーザーが複数のリクエストを送信し、AWS WAF のレートベースのルールのしきい値を超えます
- AWS WAF はユーザーからのそれ以上のリクエストをブロックします
- AWS WAF のカスタムレスポンスコード機能は、レスポンスコードを HTTP 307 – Temporary Redirect に修正し、Too Many Requests というメッセージのカスタムエラーページを返します
AWS WAFの Web ACLとカスタムエラーページのルールを設定するには
- AWS WAF コンソールのナビゲーションペインで「Web ACLs」を選択し、ユースケース1 で作成した Web ACL を選択します
- 「Rules」タブから「Add rules」を選択し、「Add my own rules and rule groups」を選択します
- 「Name」には、このルールを識別するために使用する名前を入力します
- 「Type」では「Rate-based rule」を選択します
- 「Rate limit」には「100」を入力します
- 「Action」ではデフォルトの「Block」のまま、「Custom response」の Enable にチェックを入れます
- 「Response code」には「307」を入力します
- 「Choose how you would like to specify the response body」で「Create a custom response body」を選択します
- ポップアップが表示されるので、「Response body object name」に名前を入力します
- 「Content type」では「JSON」「HTML」「Plain Text」のいずれかを選択できます。ここでは「Plain Text」を選択します
- Response body には任意のサンプルテキストを入力します。この例では「This is a sample custom error page」と入力して Save を選択します
- 「Add Rule」を選択します
- 「Set rule priority」で新しいルールを一番上に移動し、このルールが最初に処理されるようにします
図6 はユースケース2 で作成したレートベースのルールの概要を示しています。
これで設定は完了です。ブロックされたリクエストを別の URL にリダイレクトするように、レートベースのルールが設定された Web ACL があります。この設定が期待通りに機能していることを確認するために、5 分間に 100 以上のリクエストを送信している、テストユーザーのログを分析することができます。図7 はテストユーザーのインスタンスに送られた 307 のカスタムレスポンスコードを示しています。
図7:AWS WAF のログで responseCodeSent を確認する
ブラウザからロードバランサーの URL にアクセスすると、図8 のようなカスタムエラーページが表示されます。
図8:ブラウザによるエラーページの確認
おわりに
AWS WAF ではステータスコードやレスポンスボディを変更することで、ブロックされたリクエストに対するカスタムレスポンスを作成することができます。ヘッダー挿入機能では、アプリケーションが別のアクションを実行するために、AWS WAF で許可されたリクエストをタグ付けすることができます。
この記事では、2つの基本的なユースケースを紹介し、拒否されたページで応答する代わりに、ユーザーを別の場所にリダイレクトすることで、より良いユーザーエクスペリエンスを実現する方法を示しました。
AWS WAFを初めて使う方は Getting started with AWS WAF をご覧ください。
翻訳は Solutions Architect 森 が担当しました。原文はこちらです。