こんばんは。小寺です。
AWS WAFでレートベースルールの集約キーでURIパスがサポートされるようになりました。

https://aws.amazon.com/about-aws/whats-new/2023/07/aws-waf-uri-path-aggregation-key-rate-based-rules/

何ができるようになったのか?少し概要を確認していきたいと思います。

レートベースのルールとは

レートベースのルールについては、以下の通りです。

レートベースのルール は、送信元 IP アドレスごとにリクエストのレートを追跡し、レートが制限を超える IP に対してルールアクションをトリガーします。制限は、5 分あたりのリクエスト数として設定します。
このタイプのルールを使用すると、過剰なリクエストを送信している IP アドレスからのリクエストを一時的にブロックできます。
レート制限により現在ブロックされている IP アドレスのリストを取得できます。 詳細については、レートベースのルールごとにブロックされている IP アドレスの一覧表示 を参照してください。
AWS WAF のレートベースのルールには、次の注意事項があります。

・設定できる最小レートは 100 です.
・AWS WAF は最大 10,000 個の IP アドレスをブロックできます。10,000 を超える IP アドレスが同時に高い割合のリクエストを送信した場合、AWS WAF はそのうち 10,000 個のみブロックします。

https://catalog.workshops.aws/edge-services-immersionday/ja-JP/aws-waf-foundation-i/003-rate-based-rules

つまり、5分ごとにWAFで受信リクエストをカウントし、指定したキーの値と同じになるとアクセスが制限値を超えたかどうか判定することができます。
さらに、大量アクセスのあるIPアドレスのブロックも可能です。

レートベースのルールを作成するには

(1)AWS WAFコンソールからWeb ACLsから該当のルールを選び、「Add rules」から「Add my own rules and user groups」を選びます。

(2) Rule Type画面から「Rule builder」を選び、Rule builder画面で「Rate-based rule」を選びます。

(3) ここでは、1 つのソースIPアドレスがログインページに接続するのを 5 分間に100回程度に制御するように設定します。
Rate-limiting criteria画面で「Rate limit」に100を入力し、Request aggregationは「Source IP address」を指定します。

(4)Action画面では「Block」を設定して、「Add rule」をクリックします。

こんな感じでレートベースのルールが作成できます。

アップデート内容

レートベースのルールの集約がより簡単になっています。
アップデート前はレートを制限したいURIの指定が必要でした。単一のルールで複数のURIパスをプロテクトしたいニーズにはマッチしていない状況でした。

本アップデートにより、追加でスコープ ダウン ステートメントを必要とせずに、任意のURIパスのリクエスト レートをモニタリングきるようになりました。
たとえば、WebサイトのURIパスに対して過剰なアクセスをブロックするルール作成が簡単になっています。今後は集約キーに対してSource IP AddressとURI pathを指定し検査条件の指定が可能です。

ためしてみる

先ほどのレートベースのルール作成でURIパスを集約キーに設定します。
Rate limitで「Custome keys」を設定し、Request aggregation keyで「URI path」を「None」に設定します。

Scope of inspection and rate limitingでは、全てのリクエストを対象として、アクションはキャプチャにします。

レートベースルールのテストとして、以下を実行します。

curl -I "${JUICESHOP_URL}/login"

100回実行して、CAPTCHA機能が実行されることが確認できます。

まとめ

本アップデートでページ単位のレート制限が簡単に実装できるようになりました。
本機能自体は、特にコストがかからず、AWS GovCloud (US)、チューリッヒ (Europe)、スペイン (Europe)、ハイデラバード (Asia Pacific)、メルボルン (Australia)以外の全てのリージョンで利用可能です。