はじめに

CloudFront、または API Gateway を利用する際、アクセス制御のために、AWS WAF の Block アクションを利用することがあるかと思います。
AWS WAF Block アクションの応答は、CloudFront カスタムエラーレスポンス、または API Gateway ゲートウェイレスポンスのカスタムの有無と、AWS WAF カスタムレスポンスの有無により、応答する内容が変わります。
本記事では、それぞれの組み合わせと応答する内容のパターンを3つに分け、それぞれの挙動を確認します。

ポイント

  • AWS WAF Block アクションの応答優先順位は以下の通り

1.AWS WAF カスタムレスポンス – AWS WAF Block アクションでカスタムレスポンスが有効になっている場合、保護されたリソースは、設定済みのカスタムレスポンスをクライアントに送信して返します。保護されたリソース自体で定義する応答設定は、効果がありません。

2.保護されたリソースで定義されているカスタムレスポンス – それ以外の場合、保護されたリソースにカスタムレスポンス設定が指定されているときは、保護されたリソースはそれらの設定を使用してクライアントに応答します。

3.AWS WAF デフォルトの Block 応答 – それ以外の場合、保護されたリソースは AWS WAF デフォルトの Block 応答 403 (Forbidden) でクライアントに応答します。

Block アクションのカスタムレスポンス 「保護されたリソースで定義したレスポンスとのインタラクション」:
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/customizing-the-response-for-blocked-requests.html

  • AWS WAF デフォルトアクションに Block のみを設定した場合、CloudFront、または API Gateway 側の設定に従ってエラーレスポンスを返答する
  • CloudFront、または API Gateway に設定したエラーレスポンスを返答したい場合は、AWS WAF のカスタムレスポンスの設定は不要
  • CloudFront、または API Gateway に設定したエラーレスポンスを返答したくない場合は、AWS WAF のカスタムレスポンスの設定が必要

AWS WAF + CloudFront

構成

CloudFront + S3のシンプルな構成です。
CloudFront にデフォルトルートオブジェクトにindex.htmlを設定し、S3 のルートに index.html ファイルを配置することで、CloudFront のディストリビューションドメイン名にアクセスすると、index.html が表示されるように設定しています。

アクセスが許可された場合、下記の通り、S3に配置された index.html が表示されます。

実際の挙動を確認

パターン1 : AWS WAF デフォルトの Block のみ

設定

AWS WAF デフォルトアクションに Block のみを設定しています。

CloudFront のカスタムエラーレスポンスは設定していません。

結果

CloudFront デフォルトの 403 エラーレスポンスが返答されました。
AWS WAF の Block アクションにカスタムレスポンスが設定されていないため、CloudFront の設定を参照しますが、こちらにもカスタムエラーレスポンスの設定がないため、CloudFront デフォルトの 403 エラーが返答されます。

パターン2 : AWS WAF デフォルトの Block + CloudFront カスタムエラーレスポンス

設定

パターン1と同様に、AWS WAF デフォルトアクションに Block のみを設定しています。

CloudFront のカスタムエラーレスポンスを設定しています。
AWS WAF のデフォルトアクションに Block のみを設定した場合、ブロック時に返答されるレスポンスコードは 403 なので、403 に対するカスタムエラーレスポンスを設定しています。
また、CloudFront 403 Error と表示する html (/403/403.html) を S3 へ配置し、403 エラーの場合はそちらを表示するように設定しています。

結果

CloudFront に設定したカスタムエラーレスポンス (/403/403.html) が返答されました。
AWS WAF の Block アクションにカスタムレスポンスが設定されていないため、CloudFront のカスタムエラーレスポンス設定に従い、/403/403.html が表示されます。

パターン3 : AWS WAF カスタムエラーレスポンス + CloudFront カスタムエラーレスポンス

設定

AWS WAF デフォルトアクションの Block にカスタムレスポンスを設定しています。
また、AWS WAF のカスタムレスポンスが表示されていることを確認するため、カスタムレスポンスボディを作成し、そちらを表示するように設定しています。

CloudFront カスタムエラーレスポンスは、パターン2と同様の設定です。

結果

AWS WAF に設定したカスタムレスポンスボディ (403) が返答されました。
AWS WAF の Block アクションにカスタムレスポンスが設定されているため、CloudFront の設定は参照せず、AWS WAF の Block アクションに設定されたカスタムレスポンスボディが表示されます。

AWS WAF + API Gateway

構成

Mock を設定した API Gateway (REST API) を準備しました。

アクセスが許可された場合、下記のように {“message”: “WAF Block Action Test”} を返答します。

実際の挙動を確認

パターン1 : AWS WAF デフォルトの Block のみ

設定

AWS WAF デフォルトアクションに Block のみを設定しています。

API Gateway のゲートウェイのレスポンスは全てデフォルトです。

結果

API Gateway デフォルトの 403 エラーレスポンス (レスポンスタイプ : WAF がフィルタリングされました) が返答されました。
AWS WAF の Block アクションにカスタムレスポンスが設定されていないため、API Gateway のゲートウェイのレスポンスを参照し、「レスポンスタイプ : WAF がフィルタリングされました」に設定された内容 (デフォルト) を返答します。

パターン2 : AWS WAF デフォルトの Block + API Gateway のゲートウェイレスポンスをカスタム

設定

パターン1と同様に、AWS WAF デフォルトアクションに Block のみを設定しています。

API Gateway ゲートウェイのレスポンスの「レスポンスタイプ : WAF がフィルタリングされました」をカスタムし、 {“message”:”API Gateway 403 Error”} が返答されるように設定しています。

結果

API Gateway ゲートウェイのレスポンスの「レスポンスタイプ : WAF がフィルタリングされました」に設定した {“message”:”API Gateway 403 Error”} が返答されました。
AWS WAF の Block アクションにカスタムレスポンスが設定されていないため、API Gateway のゲートウェイのレスポンスを参照し、「レスポンスタイプ : WAF がフィルタリングされました」に設定された内容 (カスタム) を返答します。

パターン3 : AWS WAF カスタムエラーレスポンス + API Gateway のゲートウェイレスポンスをカスタム

設定

AWS WAF デフォルトアクションの Block にカスタムレスポンスを設定しています。
また、AWS WAF のカスタムレスポンスが表示されていることを確認するため、カスタムレスポンスボディを作成し、そちらを表示するように設定しています。

API Gateway のゲートウェイレスポンスは、パターン2と同様の設定です。

結果

AWS WAF に設定したカスタムレスポンスボディ (403) が返答されました。
AWS WAF の Block アクションにカスタムレスポンスが設定されているため、API Gateway の設定は参照せず、AWS WAF の Block アクションに設定されたカスタムレスポンスボディが表示されます。

まとめ

いかがだったでしょうか。
AWS WAF で Block アクションを設定しておけば、CloudFront や API Gateway の設定に基づいて応答することはないと思われがちですが、実はそうではありません。

特に CloudFront を利用する際は、コンテンツの公開までアクセス制限を付与する場合があるかと思います。
また、カスタムエラーレスポンスにコンテンツ独自のエラーページを準備することがあるかと思います。
そういった場合、AWS WAF で Block アクションのみを設定していると、エラーページだけが先に公開状態となってしまいますので、AWS WAF Block アクションには必ずカスタムレスポンスを設定しましょう。