AWS WAF で特定のCookieの値で制限するレートベースルールを作成する
アノテーション株式会社のあのふじたです。
最近AWS WAFに特定のCookieの値で制限するレートベースルールを構成する機会があったのでブログ化してみます。
AWS WAF でレートベースルール を構成すると
AWS WAF でレートベースルールを構成し特定の宛先からの一定期間で連続したリクエストを受信すると、その宛先をブロックすることが出来ます。
レートベースのルールといえばIPアドレスが一般的ですが、AWS WAFは様々なアップデートがされており、様々な条件で制限することができるようになっています。
ここ最近のアップデートです。
- [アップデート] AWS WAF のレートベースルールで設定出来る閾値が 10 から設定出来るようになりました
- [アップデート] AWS WAF で IP アドレス以外を条件にレートベースルールを設定出来るようになりました
- [アップデート] AWS WAFのレートベースルールの集約キーにURIパスが利用できるようになりました
- [アップデート] AWS WAF のレートベースルールの期間を選択出来るようになったので、5 分から 1 分に変更してリミット到達前後の挙動を観察してみた
やってみる
今回設定するルール
Cookieの特定のKeyのアクセスでレートリミットに達した後にブロックするルールを作成する
事前に ALB-EC2(nginx) の環境を作成し、通常のアクセスであれば 200 の応答が返ってくるように設定しておきます
$ curl -I waf-test-alb-xxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
HTTP/1.1 200 OK
Date: Thu, 39 Sep 2024 23:59:59 GMT
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
Server: nginx/1.22.1
Last-Modified: Fri, 39 Sep 2024 23:59:59 GMT
ETag: "652947a3-267"
Accept-Ranges: bytes
Cf-Team: 22aa42e6b30000e07e11190400000001
ルール設定
今回は Web ACLs (Asia Pacific(Tokyo)) に直接ルールを追加する手順とします。
- Create web ACL をクリック
- Describe web ACL and associate it to AWS resources
- Web ACL details
- Regional resources(今回はALBなので)
- Region: Asia Pacific(Tokyo)
- Name: 任意の名前(test-cookie-ratebase-acl)
- Associated AWS resources
- 任意のAWSリソースを選択(今回はALB)
- Next
- Web ACL details
- Add my own rules and rule group をクリック
- Rule builder
- Rule
- Name: 任意の名前(test-cookie-ratebase-rule)
- Type: Rate-based rule
- Rate-limiting criteria
- Rate limit: 今回は50
- Evaluation window: 1, 2, 5, 10min のどれかを選択(今回は1min)
- Request aggregation: Custom keys
- Request aggregation key
- Cookie
- Cookie name: チェックしたいCookieのKEY名: (test_token)
- Text transformation: None
- Scope of inspection and rate limiting
- Consider all requests
- Then
- Action: 任意のアクションを選択(今回は Block)
- Add rule をクリック
- Rule
- Add rules and rule group で Next をクリック
- Set rule priority 一つしかルールがないので Next クリック
- Configure metrics 今回は変更せずに Next クリック
- Review and create web ACL 全体を確認後に Create web ACL をクリック
実際にアクセスし検証する
特定のCookieの Key 及び Value(test_token=hogehoge) アクセス でレートリミット(50/1min)に達した後にブロックされることを確認します
0.5 秒ごとにCookieの Key 及び Value(test_token=hogehoge) で100回アクセスしてみます。
$ for i in {1..100}; do echo -n "$(date '+%Y/%m/%d %H:%M:%S') ${i}回目:"; curl -s -b "test_token=hogehoge" "http://waf-test-alb-xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com" -o /dev/null -w "%{http_code}\n"; sleep 0.5;done
2024/xx/xx 16:27:22 1回目:200
2024/xx/xx 16:27:23 2回目:200
...
...
2024/xx/xx 16:27:52 49回目:200
2024/xx/xx 16:27:53 50回目:200
2024/xx/xx 16:27:53 51回目:200
2024/xx/xx 16:27:54 52回目:200
2024/xx/xx 16:27:55 53回目:200
2024/xx/xx 16:27:55 54回目:200
2024/xx/xx 16:27:56 55回目:200
2024/xx/xx 16:27:56 56回目:200
2024/xx/xx 16:27:57 57回目:200
2024/xx/xx 16:27:58 58回目:200
2024/xx/xx 16:27:58 59回目:200
2024/xx/xx 16:27:59 60回目:200
2024/xx/xx 16:27:59 61回目:200
2024/xx/xx 16:28:00 62回目:200
2024/xx/xx 16:28:01 63回目:200
2024/xx/xx 16:28:01 64回目:200
2024/xx/xx 16:28:02 65回目:200
2024/xx/xx 16:28:03 66回目:200
2024/xx/xx 16:28:03 67回目:200
2024/xx/xx 16:28:04 68回目:200
2024/xx/xx 16:28:04 69回目:200
2024/xx/xx 16:28:05 70回目:200
2024/xx/xx 16:28:06 71回目:200
2024/xx/xx 16:28:06 72回目:200
2024/xx/xx 16:28:07 73回目:200
2024/xx/xx 16:28:07 74回目:200
2024/xx/xx 16:28:08 75回目:403
2024/xx/xx 16:28:09 76回目:403
...
...
2024/xx/xx 16:28:22 99回目:403
2024/xx/xx 16:28:23 100回目:403
75回目でブロックされました
レートベースルール制限事項
- 制限と完全に一致するとは限らない(近い値にはなる)
- 評価には 30 秒未満の遅延が発生する
に該当する遅延なので問題ないかとは思います。
別の Value(test_token=hugehuge) でアクセスしてみます。
$ for i in {1..100}; do echo -n "$(date '+%Y/%m/%d %H:%M:%S') ${i}回目:"; curl -s -b "test_token=hugahuga" "http://waf-test-alb-xxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com" -o /dev/null -w "%{http_code}\n"; sleep 0.5;done
2024/xx/xx 16:30:26 1回目:200
2024/xx/xx 16:30:27 2回目:200
...
...
2024/xx/xx 16:30:57 49回目:200
2024/xx/xx 16:30:57 50回目:200
2024/xx/xx 16:30:58 51回目:200
2024/xx/xx 16:30:59 52回目:200
2024/xx/xx 16:30:59 53回目:200
2024/xx/xx 16:31:00 54回目:200
2024/xx/xx 16:31:00 55回目:200
2024/xx/xx 16:31:01 56回目:200
2024/xx/xx 16:31:02 57回目:200
2024/xx/xx 16:31:02 58回目:200
2024/xx/xx 16:31:03 59回目:200
2024/xx/xx 16:31:04 60回目:200
2024/xx/xx 16:31:04 61回目:200
2024/xx/xx 16:31:05 62回目:200
2024/xx/xx 16:31:05 63回目:200
2024/xx/xx 16:31:06 64回目:200
2024/xx/xx 16:31:07 65回目:200
2024/xx/xx 16:31:07 66回目:200
2024/xx/xx 16:31:08 67回目:200
2024/xx/xx 16:31:09 68回目:200
2024/xx/xx 16:31:09 69回目:200
2024/xx/xx 16:31:10 70回目:200
2024/xx/xx 16:31:10 71回目:200
2024/xx/xx 16:31:11 72回目:200
2024/xx/xx 16:31:12 73回目:200
2024/xx/xx 16:31:12 74回目:200
2024/xx/xx 16:31:13 75回目:403
2024/xx/xx 16:31:13 76回目:403
2024/xx/xx 16:31:14 77回目:403
...
...
2024/xx/xx 16:31:28 99回目:403
2024/xx/xx 16:31:29 100回目:403
こちらも75回目でブロックされました
最初の test_token=hogehoge がブロックされて既に1分経っているので解除されていることも確認します。
for i in {1..10}; do echo -n "$(date '+%Y/%m/%d %H:%M:%S') ${i}回目:"; curl -s -b "test_token=hogehoge" "http://waf-test-alb-1801132515.ap-northeast-1.elb.amazonaws.com" -o /dev/null -w "%{http_code}\n"; sleep 0.5;done
2024/xx/xx 16:33:46 1回目:200
2024/xx/xx 16:33:47 2回目:200
2024/xx/xx 16:33:47 3回目:200
2024/xx/xx 16:33:48 4回目:200
2024/xx/xx 16:33:49 5回目:200
2024/xx/xx 16:33:49 6回目:200
2024/xx/xx 16:33:50 7回目:200
2024/xx/xx 16:33:50 8回目:200
2024/xx/xx 16:33:51 9回目:200
2024/xx/xx 16:33:52 10回目:200
解除されているようです。
まとめ
以下のドキュメントにあるようにCookieに特定のKeyが含まれる場合、Value単位でのブロックされるレートベースルールを作成しました。
Cookie – 名前付き Cookie を集約キーとして使用します。Cookie 内の個別の値はそれぞれ、集約インスタンスに影響します。
分散された複数のIPアドレスで連続アクセスしてくるBot等、IPではブロックできない場合で利用できそうですね。
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。