Application Gateway Web Application Firewall のレート制限を試す
はじめに
2023/11に Application Gateway 用の Web Application Firewall(WAF) のレート制限が GA しました[1]。Azure Load Testing と組み合わせて簡単にテストしてみようというモチベーションです。機能の概要としては公式ドキュメント[2]をご参照ください。
環境構築
環境
Application Gateway を一から作成するのが手間だったので、こちらの Bicep[3] にてデプロイされる環境を流用します。データベースなど余計なものも含まれていますが、一旦無視です。
ポリシーの作成
レート制限を構成するための WAF ポリシーを作成します。
カスタムルールの追加のメニューで、レート制限を選択します。ここでは、1 分あたり 5 回まで同一のクライアント IP アドレスからアクセスできるという制限をしています。条件としては、このルールが適用される対象の IP アドレスと、適用された場合のアクションを指定します。ここでは「トラフィックを拒否」する設定とします。ソースの IP として適当に RFC 1918 プライベートアドレス空間を含まないように指定してみました。
関連付け先の Application Gateway を選択します。Application Gateway が表示されない場合は SKU が WAF v2 になっていることをご確認ください。
Application Gateway の SKU はリソースの [構成] から実施可能です。
WAF ポリシーを防止モードに切り替えます。これによって、実際にトラフィックがブロックされるように構成されます。
レート制限を確認してみる
Application Gateway に利用している Public IP アドレスで DNS 名を構成し、手元の Windows クライアント上で、curl コマンドを 10 回叩いてみます。
for i in {0..10};
do
echo "reqest number: ${i}";
curl -I http://appgw-front-ratelimit.japaneast.cloudapp.azure.com;
done
出力は以下の通り。
reqest number: 7
HTTP/1.1 200 OK
Date: Thu, 30 Nov 2023 05:56:10 GMT
Content-Type: text/html
Content-Length: 10918
Connection: keep-alive
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Wed, 29 Nov 2023 15:25:41 GMT
ETag: "2aa6-60b4c25e82d35"
Accept-Ranges: bytes
Vary: Accept-Encoding
reqest number: 8
HTTP/1.1 403 Forbidden
Server: Microsoft-Azure-Application-Gateway/v2
Date: Thu, 30 Nov 2023 05:56:10 GMT
Content-Type: text/html
Content-Length: 179
Connection: keep-alive
reqest number: 9
HTTP/1.1 200 OK
Date: Thu, 30 Nov 2023 05:56:11 GMT
Content-Type: text/html
Content-Length: 10918
Connection: keep-alive
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Wed, 29 Nov 2023 15:25:41 GMT
ETag: "2aa6-60b4c25e82d35"
Accept-Ranges: bytes
Vary: Accept-Encoding
reqest number: 10
HTTP/1.1 403 Forbidden
Server: Microsoft-Azure-Application-Gateway/v2
Date: Thu, 30 Nov 2023 05:56:11 GMT
Content-Type: text/html
Content-Length: 179
Connection: keep-alive
8 回目と 10 回目に 403 エラーが返ってきました。レート制限の閾値を 5 回に設定しているので少し不思議といえば不思議な状態です。スライディングウィンドウで評価されるみたいなので、何かそのあたりが影響していそうです。
ちなみに、ドキュメント[4]には以下のような記載があります。レート制限の機能自体は、呼び出し回数ベースでに対して厳密にコントロールするためではなく、あくまで可用性の維持を目的としてるというところですね。
レート制限しきい値は必ずしも定義されているとおりに適用されるとは限らないので、アプリケーション トラフィックをきめ細かく制御するために使用しないでください。 代わりに、トラフィックの異常なレートを軽減し、アプリケーションの可用性を維持することをお勧めします。
Azure Load Testing で投げてみる
URL ベースのテストとして以下のような超小規模なテストを作って実行してみます。
結果を見てみると、403 エラーが出ていることが分かります。「成功した応答」のグラフを見ると、スライディングウィンドウの集計タイミングなのか、1 分間隔くらいでレート制限が解放されている傾向が分かりますね。大規模またある程度継続的なレート制限のテストを行いたい場合には Azure Load Testing と組み合わせるのがよさそうですね。
おわり
- Application Gateway のレート制限の機能を構成して試しました。
- 最初、何度リクエストしても 403 エラーが表示されず頭を悩ませたのですが、WAF ポリシーを「防止モード」にしていないという初歩的なミスをしていたというオチでした。
- Azure Load Testing も組み合わせて使うと大規模 or 継続的なテストをしたい場合に便利そうです。
-
https://azure.microsoft.com/ja-jp/updates/general-availability-ratelimit-rules-for-application-gateway-web-application-firewall/ ↩︎
-
https://learn.microsoft.com/ja-jp/azure/web-application-firewall/ag/rate-limiting-overview ↩︎
-
https://learn.microsoft.com/ja-jp/azure/web-application-firewall/ag/rate-limiting-overview#rate-limiting-details ↩︎
Discussion