Amazon Web Services ブログ

AWS WAFによるリクエストとレスポンスのカスタマイズ

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 リクエストヘッダーを挿入できます。これらのリクエストにヘッダーでタグ付けすることで、アプリケーションに追加のロジックを実装できるようになりました。

これらの機能をどのように利用できるか、3つのユースケースを紹介します。

ユースケース1:カスタムレスポンスコード

このケースではカスタムレスポンスコードを使用して、視聴者のリクエストを別の Web ページにリダイレクトします。HTTP 3xx レスポンスコードを使用して、受け取ったリクエストをリダイレクトし、HTTP ヘッダーの Location を使用してリダイレクト先の Web サイトの URL を指定します。図1 にワークフローの概要を示します。


図1:カスタムレスポンスコードを使ったリクエストのリダイレクトの概要

図1 は以下の手順を示しています。

  1. AWS WAF には 5 分毎に 100 件のリクエストを許可するレートベースのルールがあります
  2. ユーザーが複数のリクエストを送信し、AWS WAF のレートベースルールの閾値を超えます
  3. AWS WAF はユーザーからのそれ以上のリクエストをブロックします
  4. AWS WAF のカスタムレスポンスコード機能は、レスポンスコードを HTTP 403 から HTTP 302 – Temporary Redirect に変更し、リダイレクト先の URL を指定する Location ヘッダーを付けます

AWS WAF の Web ACL とカスタムレスポンスコードのルールを設定する

以下は Application Load Balancer を作成して、AWS WAF に関連付ける手順です。

  1. ロードバランサーとリスナーを設定する手順に従い、インターネットに面したロードバランサーを作成します
  2. ロードバランサーが作成されたら、AWS WAF コンソールを開きます
  3. ナビゲーションペインで「Web ACLs」を選択し「Create web ACL」を選択します
  4. 「Name」には、この Web ACL を識別するために名前を入力します
  5. 「Add AWS resources」で、作成した Application Load Balancer を選択し「Add」を選択します
  6. 「Next」を選択します
  7. 「Add rules」 から「Add my own rules and rule groups」を選択します
  8. 「Name」には、このルールを識別するために名前を入力します
  9. 「Type」では「Rate-based rule」を選択します
  10. 「Rate limit」には「100」を入力します
  11. 「Action」ではデフォルトの「Block」のまま、「Custom response」の Enable にチェックを入れます
  12. 「Response code」には 302 と入力します
  13. 「Response headers」下の「Add new custom header」で、「Key」が「Location」「Value」を「example.com」としたカスタムヘッダーを追加します
  14. 「Add rule」を選択します
  15. 続けて「Next」を選択して概要ページに移動し「Create web ACL」を選択します

Web ACL が作成されると、図2 に示すような Web ACL の設定が表示されます。


図2:カスタムレスポンス – Web ACL の設定

これで設定は完了です。ブロックされたリクエストを別の URL にリダイレクトするように、レートベースのルールが設定された Web ACL ができました。期待通り機能していることを確認するために、5 分間に 100 件以上のリクエストを送信しているテストユーザーのログを有効にして分析することができます。

図3 ではテストユーザーインスタンスに 302 という、カスタムレスポンスコードが送信されています。


図3:カスタムレスポンスのログの検証

図3 の例では、ユーザーが PC から 100 以上のリクエストを送信することで、ブロックされることを検証しました。Location ヘッダーを検証するために、ブラウザの開発者ツールを使ってトラフィックを解析しました。図4 に示すように、レスポンスには設定されたリダイレクト URL を含む、カスタムヘッダー Location が含まれています。


図4:ブラウザツールでカスタムレスポンスの内容を確認

ユースケース2:カスタムエラーページ

この例では AWS WAF のカスタムエラーページを使用して、リクエストをデフォルトの Web サーバーのエラーページではなく、別のエラーページにルーティングします。図5 にあるようにワークフローはユースケース1 と似ています。


図5:カスタムエラーページを使ってリクエストをリダイレクト

図5は以下の手順を示しています。

  1. AWS WAF には、5 分ごとに 100 件のリクエストを許可するレートベースのルールがあります
  2. ユーザーが複数のリクエストを送信し、AWS WAF のレートベースのルールのしきい値を超えます
  3. AWS WAF はユーザーからのそれ以上のリクエストをブロックします
  4. AWS WAF のカスタムレスポンスコード機能は、レスポンスコードを HTTP 307 – Temporary Redirect に修正し、Too Many Requests というメッセージのカスタムエラーページを返します

AWS WAFの Web ACLとカスタムエラーページのルールを設定するには

  1. AWS WAF コンソールのナビゲーションペインで「Web ACLs」を選択し、ユースケース1 で作成した Web ACL を選択します
  2. 「Rules」タブから「Add rules」を選択し、「Add my own rules and rule groups」を選択します
  3. 「Name」には、このルールを識別するために使用する名前を入力します
  4. 「Type」では「Rate-based rule」を選択します
  5. 「Rate limit」には「100」を入力します
  6. 「Action」ではデフォルトの「Block」のまま、「Custom response」の Enable にチェックを入れます
  7. 「Response code」には「307」を入力します
  8. 「Choose how you would like to specify the response body」で「Create a custom response body」を選択します
  9. ポップアップが表示されるので、「Response body object name」に名前を入力します
  10. 「Content type」では「JSON」「HTML」「Plain Text」のいずれかを選択できます。ここでは「Plain Text」を選択します
  11. Response body には任意のサンプルテキストを入力します。この例では「This is a sample custom error page」と入力して Save を選択します
  12. 「Add Rule」を選択します
  13. 「Set rule priority」で新しいルールを一番上に移動し、このルールが最初に処理されるようにします

図6 はユースケース2 で作成したレートベースのルールの概要を示しています。


図6:カスタムエラーページ – Web ACL の設定

これで設定は完了です。ブロックされたリクエストを別の URL にリダイレクトするように、レートベースのルールが設定された Web ACL があります。この設定が期待通りに機能していることを確認するために、5 分間に 100 以上のリクエストを送信している、テストユーザーのログを分析することができます。図7 はテストユーザーのインスタンスに送られた 307 のカスタムレスポンスコードを示しています。


図7:AWS WAF のログで responseCodeSent を確認する

ブラウザからロードバランサーの URL にアクセスすると、図8 のようなカスタムエラーページが表示されます。

図8:ブラウザによるエラーページの確認

 

ユースケース3:リクエストタグ付けのためのヘッダー挿入

この例では、位置情報に基づいてリクエストをルーティングするために、AWS WAF のヘッダー挿入機能を検証します。ヘッダーの country-check を使って、Application Load Balancer の高度なリクエストルーティング機能を使って、リクエストを別のターゲットグループにルーティングするように Application Load Balancer に通知します。


図9:ダウンストリームで処理されるリクエストにリクエストヘッダーを挿入

図9 は以下の手順を示しています。

  1. ユーザーは AWS WAF が接続されている Application Load Balancer にリクエストを送信します
  2. AWS WAF は Count モードで、想定外の国からのリクエストを条件付きで許可するジオロケーションルールを適用しています
  3. AWS WAF はこのリクエストをタグ付けするために、カスタムHTTP リクエストヘッダーを追加します
  4. Application Load Balancer のリスナールールは、このヘッダーに基づいてリクエストをルーティングするよう構成されています
  5. AWS WAF によってカスタムヘッダーでタグ付けされたリクエストは、別のターゲットグループにルーティングされます

リクエストヘッダー挿入のためのジオロケーションルールを追加するには

  1. AWS WAF コンソールのナビゲーションペインで、「Web ACLs」を選択し、ユースケース1 で作成した Web ACL を選択します
  2. 「Rules」タブで「Add rules」を選択し、「Add my own rules and rule groups」を選択します
  3. 「Name」にはこのルールを識別するために名前を入力します
  4. 「Type」では「Regular rule」を選択します
  5. 「If a request」の部分は「doesn’t match the statement (NOT)」を選択します
  6. 「Inspect」は「Originates from a country in」を選択します
  7. このケースでは通常のトラフィックは米国から発信されているため「Country codes」で「United States – US」を選択します
  8. 「IP address to use to determine the country of origin」では「Source IP address」を選択します
  9. 「Action」では「Count」を選択します。この設定により後続のルールを処理する間に、リクエストを記録してタグ付けすることができます
  10. 「Custom request」を展開し「Add new custom header」を選択します。「Key」には「country-check」、「Value」には「true」を入力します
    注意: カスタムリクエストヘッダーのプレフィックスは x-amzn-waf- です
  11. 「Add rule」を選択します
  12. 新しいルールを「Move up」で一番上に移動し、このルールが最初に処理されるようにします
  13. 「Save」を選択します
    図 10: カスタムリクエストヘッダーの挿入 – Web ACL の構成

このユースケースでは、アプリケーションの通常のトラフィックフローの外にある国(この例では米国)から発信されたリクエストをチェックするために、地理的な場所を示すルールを設定します。リクエストをすぐにブロックするのではなく、このAWS WAF ルールによってトリガーされたリクエストをタグ付けして、アプリケーションロジックによるダウンストリームでのさらなる検証を行いたいと考えています。タグ付けされたリクエストを別の方法でルーティングするために、ALB の高度なリクエストルーティング機能を使って、AWS WAFのタグ付けされたトラフィックを別のターゲットグループにルーティングします。

図11 に示すように AWS WAF のフルログを有効にして、requestHeadersInserted フィールドを見ることで、ルールによって挿入されたヘッダーを確認することができます。


図11:AWS WAFのログでヘッダー挿入を確認する

おわりに

AWS WAF ではステータスコードやレスポンスボディを変更することで、ブロックされたリクエストに対するカスタムレスポンスを作成することができます。ヘッダー挿入機能では、アプリケーションが別のアクションを実行するために、AWS WAF で許可されたリクエストをタグ付けすることができます。

この記事では、3つの基本的なユースケースを紹介し、拒否されたページで応答する代わりに、ユーザーを別の場所にリダイレクトすることで、より良いユーザーエクスペリエンスを実現する方法を示しました。アプリケーションロジックのリクエストが検査されていることを確認するためにタグ付けすることで、カスタム AWS WAF ルールを作成し、この情報をもとにどのような判断を下すことができるかを紹介しました。

AWS WAFを初めて使う方は Getting started with AWS WAF をご覧ください。

翻訳は Solutions Architect 森 が担当しました。原文はこちらです。