[update] AWS WAFがカスタムレスポンスに対応しました

これまでブロックした際の応答はステータスコード403固定だったAWS WAF、カスタムレスポンスがサポートされたことでステータスコードやレスポンスボディの変更ができるようになりました。実際にブロック時にリダイレクトさせる挙動で確認してみます。
2021.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。本エントリでお届けするアップデート情報はこちら!AWS WAFでカスタムレスポンスがサポートされました。(2021/03/29にポストされたアップデート内容になります。)

AWS WAFを使ってリクエストがブロックされた場合、これまではHTTPステータスコード403 (Forbidden)が返るのみでした。今回のアップデートであるカスタムレスポンス対応で、リクエストをブロックした際にユーザに返されるHTTPステータスコードとレスポンスボディの設定が可能になりました。

AWS WAFのカスタムレスポンスを使ってブロック時にリダイレクトさせてみた

では実際にAWS WAFのカスタムレスポンスを使って、リクエストをブロックした際にステータスコード301を返し、別のサイトにリダイレクトさせるよう設定してみます。

デフォルトの挙動の確認

事前準備として、ALBにAWS WAFを設定、Web ACLで特定のIPアドレスのリクエストのみ許可、それ以外のリクエストはブロックするルールを作成しておきます。

この場合の挙動は以下になります。まず特定のIPアドレスの場合はリクエストが許可され、レスポンスを返します。

curlコマンドでヘッダ情報も確認しておきましょう。

% curl -I https://www.example.net/
HTTP/2 200
date: Tue, 30 Mar 2021 14:14:39 GMT
content-type: text/html; charset=UTF-8
content-length: 11
server: Apache/2.4.46 ()
last-modified: Tue, 02 Mar 2021 07:05:37 GMT
etag: "b-5bc885c85bc9d"
accept-ranges: bytes

特定のIPアドレス以外からのアクセスの場合、リクエストがブロックされます。以下のように、AWS WAFのデフォルトの動作としてはステータスコード403と共に、「403 Forbidde」の文字列を返します。

% curl -I https://www.example.net/
HTTP/2 403
server: awselb/2.0
date: Tue, 30 Mar 2021 14:17:16 GMT
content-type: text/html
content-length: 118

% curl https://www.example.net/
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>

AWS WAFでカスタムレスポンスの設定

それでは今回のアップデート部分、AWS WAFのカスタムレスポンスを設定していきます。AWSマネジメントコンソール、AWS WAFのWeb ACLsの項目から該当のWeb ACLのRulesタブを開きます。今回はデフォルトルールでブロックしていますので、このデフォルトルールにカスタムレスポンスを設定していきます。[Edit]ボタンで編集画面に進みましょう。

「Custom response - optional」の表示があるので文字列をクリックして、設定項目を表示させます。

Enableにチェックが入っていない状態なので、まずはこのチェックを入れます。すると追加で設定項目が現れます。

今回はブロックしたレスポンスについては、本ブログトップページ(https://dev.classmethod.jp/)にステータスコード301でリダイレクトする、とします。まずResponse codeは301を選択、続いてResponse headers欄、[Add new custom header]ボタンを押して入力欄を表示させたら、以下のように入力します。

  • Key
    • Location
  • Value
    • https://dev.classmethod.jp/
    • (リダイレクト先のURL)

最後の「Choose how you would like to specify the response body - optional」については指定なしのまま進めます。今回はリダイレクト目的ですので、レスポンスボディは不要と考えたためです。リダイレクトさせず、ステータスコードとレスポンスボディを表示させたい場合、Web ACLの「Custom response bodies」のタブでレスポンスボディを定義、この設定箇所で選択するかたちになるかと思います。

以上の設定ができたら、[Save]で設定を保存します。保存後、Rules確認画面で以下のように、カスタムレスポンスならびにカスタムレスポンスヘッダの内容が確認できます。

AWS WAFのカスタムレスポンスでリダイレクトさせてみた

それでは実際にAWS WAFのカスタムレスポンス機能を使ったリダイレクトを確認してみます。まずはブラウザからのアクセスです。Chromeブラウザのデベロッパーツールを開き、NetworkタブでPreserve logのチェックボックスをonにして、対象のドメインにアクセスしてみます。すると以下のようにブラウザではDevelopersIOトップページ(https://dev.classmethod.jp/)が表示されます。ステータスコード301でリダイレクトされていることがわかりますね。

curlコマンドでヘッダ情報も確認しておきましょう。以下のように301とLocationヘッダが返っているのがわかります。

% curl -I https://www.example.net/
HTTP/2 301
server: awselb/2.0
date: Tue, 30 Mar 2021 14:36:28 GMT
content-length: 0
location: https://dev.classmethod.jp/

まとめ

AWS WAFで新たにサポートされたカスタムレスポンス機能を使い、ブロックしたリクエストについて特定URLへリダイレクトするよう設定してみました。これまでブロックした際の応答がステータスコード403で固定だったのが、200番台から500番台まで様々なステータスコードを返せるようになり(サポートされているレスポンスコードはAWS WAF Developer Guideを参照ください)、またレスポンスボディも変更できるようになったことで、ブロック時の様々な対応ができるようになったかと思います。