目次
1. はじめに
2021年3月29日に二つのカスタマイズ機能が AWS WAF にリリースされました。
ひとつめは、 AWS WAF を経由した際にカスタムヘッダーを付与することが出来る機能です。もうひとつは、 BLOCK した際のレスポンスをカスタマイズする機能となります。
それぞれどのような機能か確認していきましょう。
どんな効果があるのか先に知りたい方は 6. 考えられる利用例 に飛んでください。
2. カスタムヘッダー機能
リクエストが AWS WAF を ALLOW , COUNT で通過した際にカスタムヘッダーを付与する機能となります。挿入されたヘッダー情報を元にした後続処理や、分析のためのフラグとしての利用が想定されています。
・カスタムリクエストヘッダー名はすでにリクエストにあるヘッダーとの混同を避けるために、「x-amzn-waf-」が文字列の頭に付与されます。例えば「test」というカスタムヘッダーを付与しようとすると「x-amzn-waf-test」になります。
・同一のカスタムヘッダーが元のリクエストに存在した場合、AWS WAF に上書きされます。
・同一のカスタムヘッダーを付与するルールが複数存在し、複数のルールにマッチした場合は優先順位順にチェックされ、最終的にマッチしたルール(ルールの優先順が低いルール)の内容で設定されます。
・COUNT と ALLOW の二つにマッチして、それぞれ異なるカスタムヘッダーが付与される場合、両方が付与されることになります。
簡単な例で言うと以下のルール順で全てのルールにマッチする場合、ヘッダー名[count-test]の値は最終的に「2」となります。さらにヘッダー名[allow-test]:値[3]についてもヘッダーは付与されます。
- ルール1(COUNT)→ ヘッダー名[count-test]:値[1] を追加
- ルール2(COUNT)→ ヘッダー名[count-test]:値[2] を上書き
- ルール3(ALLOW)→ ヘッダー名[allow-test]:値[3] を追加
※ ルールグループでのオーバーライドアクションによる COUNT ではカスタムヘッダー機能は利用できません。
3. カスタムレスポンス機能
AWS WAF で BLOCK された際のレスポンスを設定できる機能となります。
デフォルトでは BLOCK された際は HTTP ステータスコードは 403 が返りますが、ステータスコードやヘッダー、静的ページを設定できるようになりました。
CloudFront や API Gateway でもレスポンス設定をカスタマイズすることができますが、AWS WAF での設定が優先されますので注意してください。
4. 設定方法
カスタムヘッダー機能
ルール作成の「 Action 」の項目で「 Allow , Count 」の場合、「 Custom request 」の設定が行えます。
「Add new custom header」を選択することで Key と Value を設定できます。
複数登録も可能です。
JSON で確認すると、これまで Action には「Allow , Count 」だけだったものが CustomRequestHandlingと言う形で加わっていることがわかります。
```` "Action": { "Count": { "CustomRequestHandling": { "InsertHeaders": [ { "Name": "test2", "Value": "2" } ] } } }, ````
カスタムレスポンス機能
ルール作成の「 Action 」の項目で「 Block 」の場合、「 Custom response 」の設定が行えます。
「 Enable 」のチェックを入れることで入力欄がでます。
「 Response code 」で利用したいステータスコードを設定します
「Add new custom header」を選択することで Key と Value を設定できます。
複数登録も可能です。
「 response body 」の項目で「Create a custom response body」を選択するとそのまま静的ページの設定が可能です。事前に登録した内容(下の画像で test と書かれた部分)の選択も可能です。
事前に登録する方法は対象の ACL を選択後に「 Custom response bodies」を選択し、Create を押下します
編集画面で必要な情報を入力します。
JSON で確認すると、CustomResponse と言うキーで「Block」内に追加情報が加わっていることがわかります。
```` "Action": { "Block": { "CustomResponse": { "ResponseCode": 404, "CustomResponseBodyKey": "test", "ResponseHeaders": [ { "Name": "test", "Value": "1" } ] } } }, ````
「 Custom response bodies 」の内容は ACL に紐づく情報となり、ACL の情報をJSONで表示すると以下の情報が追加されています。「test」というキーでルールから参照される形です。
```` "CustomResponseBodies": { "test": { "ContentType": "TEXT_PLAIN", "Content": "test" } } ````
ルールグループの場合はルールグループ自体に「 Custom response bodies 」を紐付けて、ルールグループ配下の各ルールの「 Action 」の項目に「 CustomResponse 」の内容を設定します。
5. WafCharm での対応について
現時点で WafCharm で2つの機能に対応する何かしらの機能を実装する予定はございません。
例えば、カスタムレスポンス機能で WAF による BLOCK が実施されたことがわかるように設定することは、レスポンスの違いによって、攻撃者になんらかの推測可能な情報を与えることになり、セキュリティの観点からリスクになる可能性があることが理由です。
6. 考えられる利用例
カスタムヘッダー機能は、公式情報の利用例通りフラグとしての利用することで WAF を通過したアクセスと WAF を通過していないアクセスを、後段のアクセスログで判別することが可能になります。
カスタムレスポンス機能は開発環境、検証環境で WAF の有効性を確認するのに使えるのではないでしょうか。例えば WAF による 403 レスポンスなのか、そうでない箇所での 403 レスポンスなのかといった確認です。
7.おわりに
利用ケースが限定された機能かと思います。カスタムレスポンス機能は不特定多数からのアクセスが行われるサービス提供サイトでは、攻撃者に少なからず情報を与えるため推奨しません。開発環境等の限定されたアクセスが行われる環境では、カスタムレスポンスを付与することでWAF の後段にある Web サイトのアクセスログから WAF の状態がわかるので、利用を検討してみてもいいかもしれません。