[update] AWS WAFがカスタムレスポンスに対応しました
はじめに
清水です。本エントリでお届けするアップデート情報はこちら!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を参照ください)、またレスポンスボディも変更できるようになったことで、ブロック時の様々な対応ができるようになったかと思います。