[アップデート] AWS WAFのレートベースルールの集約キーにURIパスが利用できるようになりました

2023.07.21

初めに

本日のアップデートにてAWS WAFのレートベースルールの集約キーでURIパスが指定可能となりました。

レートベースルールは一定時間中(現仕様では5分固定)に指定したキー(集約キー)の値が同一となるアクセスが設定値を超えたかどうかを判定するルールとなります。

ドキュメントの日本語英語差分を見る限り本アップデート以前は以下のキーが指定可能であったようです。
クエリ文字列の方が先に実装されてるのか、とちょっと驚きました。

  • ラベル
  • HTTPヘッダ
  • Cookie
  • クエリ文字列のキー
  • クエリ文字列の値
  • HTTPメソッド
  • IPアドレス
  • HTTPヘッダのHTTPアドレス

本アップデート以前での対応

本アップデート以前は特定のページごとにカウントを取る為にはページ毎に別々にルールを定義する必要があり管理が非常に手間でした。

例えば集約キーにSource IP Adressを指定し検査条件で/order/*というURIパスを指定したレートベースルールを作成しx.x.x.xというIPアドレスから/order/confirm/order/completeに対してアクセスした場合、共通で2カウント扱いとなるため2つのページで別々に集計をしたい場合は分けて2つのルールを作成する必要がありました。

今後は集約キーに対してSource IP Address AND URI pathを指定し検査条件で/order/*を指定するだけで、1ルール内で上記2つのパスがが個別にカウントできるようになります。

個別のページ単位ではなく特定のページ配下で共通のカウントとしたい場合は、引き続き集約キーに対してURI pathを指定しない形になりますのでご注意ください。

試してみる

実際に確認してみましょう。

設定

URI pathを集約キーに設定します。今回は自分だけしかアクセスしない環境のためIPアドレスの制限は特にかけていません。

検査条件は設定していないので全てのページが対象となります。

Web ACLにはこの条件でブロックするルールのみを設定し、わかりやすいようにAccess overというテキストを返すようなルールとしています。

アクセス

WAFは以前執筆のために作ったCloudFront + S3で作ったコンテンツが残っているのでそちらに割り当ててます。

通常は以下のようなページが表示されます。
faviconはコンテンツが存在しないことによる403なので別起因です。

設定可能な最小アクセスが100req/5minのためcurlをループして100回ほどTOPページをたたいておきます。

for ((i=0; i < 100; i++)); do
    curl http://xxxxx.cloudfront.net/
done

上記実行後にアクセスすると設定したAccess overが表示されます。

実際にはアクセスと集計のタイミングの問題か実行直後に開いてもブロックされていなかったので追加で画面で何回かアクセスを行っています。

この状態で別のパスを開いても特にブロックはされずURIパス単位でルールが適用されていることが確認できます。

検査条件の設定同様にURIパス単位での制御となるため、デフォルトオブジェクトに/index.htmlを設定しており/でブロックが発生する状態で/index.htmlにアクセスをしてもブロックは発生しません。

終わりに

さて今回のアップデートでページ単位のレート制限をよりシンプルに実装できるようになりました。

1つのシステムで個別にレート制限をかけたい時もそうですが、1つのドメイン配下にパスを区切り様々なお客さんにクローンしたシステムを提供するようなシステムでも1つのルールでまとめて管理可能というような使い方も思い浮かび今回のアップデートは非常に大きなものと感じます。

前述させていただきました通り集約キーにURI pathを指定するとそのルールは個別のパス単位での制御となる為、特定のページ群でまとめてカウントを取る必要がある場合は既存通りの設定を使い続ける必要がある点はご注意ください。