ホスト名毎に異なるIP制限を行うWeb ACL のルールを作成したい
困っていた内容
一つの WebACL に二つの CloudFront ディストリビューションを関連づけており、各ホストごとに異なる IP 制限を行いたいと考えています。
Web ACL には以下のルールを追加しました。
- ルール1: IP Set 1 に登録した IP 以外からのウェブサイト A (例: a.example.com) へのリクエストを Block
- ルール2: IP Set 2 に登録した IP 以外からのウェブサイト B (例: b.example.com) へのリクエストを Block
※ Web ACL のデフォルトアクションは Allow となっています。
ルール 1 で Block 扱いとなっても、ルール 2 で Block 扱いとならないリクエストについてはアクセスを許可したいのですが、想定通りの挙動となりません。
どのようなルール設定で実現できますか。
どう対応すればいいの?
ルールアクション Block は終了アクションであり、該当するリクエストがあった場合は、後続のルールは評価しません。
複数のルールを評価し、最終的なアクションを決定したい場合、非終了アクションである Count を使用する方法があります。
また、Count は後続のルールの処理を継続し、また、他の後続ルール内での判定で使用可能なラベルを追加することができます。
そのため、以下のように、ルール 1、2 のアクションを Count に変更しラベルを定義、ルール 3 を追加しでラベルの有無によって最終的なアクションを決定することで対応可能です。
- ルール1: IP Set 1 に登録した IP からの ウェブサイト A への リクエストにラベルを追加
- ルール2: IP Set 2 に登録した IP からの ウェブサイト B への リクエストにラベルを追加
- ルール3: ラベルがないリクエストをブロック
各ルールについては以下の通り設定し、検証を行っています。
ルール 1
If a request
- 「maches all the statements (AND)」
Statement 1:
- Inspect: 「Originates from an IP address in」
- IP set: 事前に作成した サイト A へのアクセスを許可する IP セットを指定 (例: 「ipset1」)
- IP address to use as the originating address: 「Source IP address」
Statement 2:
- Inspect: 「Single header」
- Header field name: 「host」
- Match type: 「Exactly maches string」
- String to match: サイト A のホスト名 (例: 「a.example.com」)
Action:
- Action: 「Count」
- Label: ラベル名を入力 (例: 「allowedrequest」)
ルール 2
ルール 1 と同様(IPセット、ホスト名はサイト B 用のものに要変更)
ルール 3
If a request
- 「doesn't match the statement (NOT)」
Statement:
- Inspect: 「Has a label」
- Match scope: 「Label」
- Match key: ルール 1、2 で指定したラベル名を入力 (例: 「allowedrequest」)
Action:
- Action: 「Block」