やりたいこと

リクエストのパスに特定の文字が含まれていた場合に、アクセスできるIPアドレスを制限したい

ソースIP パス 期待値
IPアドレスA /test/を含むパス 接続可能
IPアドレスA /test/を含まないパス 接続可能
IPアドレスB /test/を含むパス 接続不可
IPアドレスB /test/を含まないパス 接続可能

example.com/test/hoge/index.html → Aのみ接続可能
example.com/hoge/test/index.html → Aのみ接続可能
example.com/hoge/hoge/index.html → A,Bともに接続可能

やり方

AWS WAFの機能で実装
/tes/を含むパスかつ特定のIP以外のアクセスを拒否するrule groupを作成する
webACLをデフォルトアクションを許可で作成し、作成したルールグループを適用

検証

許可IPでないと/test/を含むパスにアクセスできないように設定してみる

1.apacheサーバーにテストページを3つ作成

[ec2-user@ip-172-31-46-226 hoge]$ ls -1 "$(pwd)"/*
/var/www/html/test/hoge/index.html

[ec2-user@ip-172-31-46-226 test]$ ls -1 "$(pwd)"/*
/var/www/html/hoge/test/index.html

[ec2-user@ip-172-31-46-226 hoge]$ ls -1 "$(pwd)"/*
/var/www/html/hoge/hoge/index.html

2.許可IPと許可無しのIP両方から、3つのテストページにアクセスできることを確認

EC2とALBとroute53を紐づける

許可IPからアクセス確認

許可無しのIPからアクセス確認

3.webACLの作成

許可IPを含めたIPセットを作成

/test/を含むパスかつ特定のIP以外のアクセスを拒否するrule groupを作成

statement1

nagate statement results inspect Match type string to match
チェック入れない URL path contains string test

statement2

nagate statement results inspect IP set
チェック入れる originates from an IP address in y-ishikawa-bpn-ipset

actionはbrockに設定

webACLを作成
webACLをデフォルトアクションを許可で作成し、作成したルールグループを適用し、albにアタッチする

4.許可IPから3つのテストページ全てにアクセスできることを確認

5.許可なしIPから、/test/を含むパスにアクセスできないことを確認

6.許可なしIPから、/test/を含まないパスにアクセスできることを確認

最後に

参考になれば幸いです!!