AWS WAFで特定のリクエストヘッダーのみを許可するアクセス制限を試してみた
AWS WAFを使用したアクセス制限では以下のようなIPによる制限がよく使われるのですが、IPが固定ではない環境からアクセス制限をかけたい、というケースを想定して「リクエストヘッダーに特定の値が含まれていれば許可する」というパターンでアクセス制限を試してみました。
イメージは独自のリクエストヘッダーをあらかじめ付与した状態でアクセスすると、CloudFrontにアクセスでき、それ以外の人はWAFでブロックされるという感じです。
やってみる
S3をオリジンとしたCloudFrontが構築積みの前提で進めます。S3にはテスト用のHTMLファイルを格納してあります。制限していない状態でCloudFrontへアクセスすると以下のようなテストページが表示されるようになっています。
Web ACL作成
AWSコンソールから WAF &Shield
> Web ACLs
> Create web ACL
にアクセスしてWeb ACLを作成します。今回はCloudFront用なので、 Resource Type
をCloudFrontに指定して、Add AWS resourcesから構築済のディストリビューション追加します。
このWeb ACLでブロックするためのルールを作成します。
条件は matches the statement
として、以下のように設定していきます。 Header field name
と String to match
には許可したいヘッダー名と値を設定しましょう。今回はヘッダー名をcf-access、値をsample-keyとしました。ここの値は検証なのでシンプルにしておりますが、実際に利用する際には複雑な文字列にすることをお勧めします。ヘッダー名についても既存のヘッダーとの衝突を回避できる値を設定しましょう。
Action
はAllowとしてAdd ruleからルールを追加しましょう。
Web ACLの設定画面に戻りますので、 Default Actuon
をBlockに設定して作成します。
その他はデフォルトのまま進めて作成します。
作成が完了したので、CloudFrontにアクセスしてみるとヘッダーに指定されたものが存在しないためブロックされていることを確認できます。
リクエストヘッダーを追加してアクセスする
ブラウザから独自のヘッダー追加してアクセスしてみます。今回はブラウザから確認したいので、ヘッダーを追加できるModHeaderというChromeの拡張機能を利用しています。
ModHeaderのプライバシーポリシーについては以下を参照して下さい。
https://bewisse.com/modheader/privacy/
ModHeader will only operate on the HTTP request / response within the browser itself, and will not save or share them with anyone.
一応利用するにあたり、リクエストやレスポンスが保存されないことを明記していることは確認しています。
この拡張機能を開き、Request headersに以下のように設定を追加しました。
これで停止ボタンを押さない限りリクエストのヘッダーに設定した値が付与された状態でアクセスできるようになります。あたらめて CloudFrontへアクセスしてみると、問題なくテストページを表示することができました。
まとめ
AWS WAFによるアクセス制限方法の1例として紹介しました。IPによる制限が制約によりできない際は、このような拡張機能を利用したリクエストヘッダーの追加による制限を試してみてはいかがでしょうか。 あくまでIP制限ができない場合の対応なので、少数の端末で実施することをお勧めします。