2023年11月8日に、Azure WAFのレートベースルールはPublic PreviewからGenerally Available(正式リリース)となりました。
General availability: Rate-limit rules for Application Gateway Web Application Firewall


【目次】

  1. 1. はじめに
  2. 2. Public Preview(プレビュー版)について
  3. 3. Azure WAFのレートベースルールについて
  4. 4. レートベースルールの設定方法
  5. 5. ユースケース
  6. 6. WafCharmとの併用
  7. 7. おわりに

1. はじめに

2023年8月22日にレートベースルールがプレビュー版としてリリースされたとAzureから発表がありました。

Public preview: Rate-limit rules for Application Gateway Web Application Firewall | Azure updates | Microsoft Azure

本ブログ記事では、プレビュー版レートベースルールの設定方法や、ユースケースをご紹介します。

2. Public Preview(プレビュー版)について

上記の通り、レートベースルールはGenerally Availableとなりましたため、プレビュー版の条件は適用されません。


Public Preview(プレビュー版)は、フィードバックや評価の目的でAzureのユーザーに提供される機能となります。


今後提供される可能性のある機能を試せる機会となりますが、一般提供されている他の機能とは異なりますので、リリースタイミングが確定していない点や、プレビュー版がそのままリリースされるとは限らない点に注意が必要です。


また、プレビューの追加使用条件が適用されます。
詳細については、Microsoft Azure プレビューの追加使用条件をご参考ください。

3. Azure WAFのレートベースルールについて

レートベースルールは、大量のトラフィックが発生した場合に送信元などの条件を用いてリクエストを検知するルールです。

Azure Web Application Firewall (WAF) レート制限 (プレビュー) | Microsoft Learn

Azure WAFのレートベースルールでは、レート制限を行うための閾値や時間のほかに、トラフィックのレート制限の基準となるグループや条件を指定する必要があります。

閾値は、デフォルトでは「100」が指定されていますが、100を下回る値も設定できるようでした。
公式ドキュメントには下限の記載はなく、「レート制限しきい値は必ずしも定義されているとおりに適用されるとは限らない」と記載があったため、あくまで目安として指定する必要がありそうです。

時間は選択式となっており、1分と5分から選べます。

閾値や時間を低く設定することで思わぬブロックが発生する可能性もありますので、最初はアクション(結果)に「トラフィックのみをログに記録する」を設定し、様子を見て調整するといった対応も良いかと思います。

トラフィックのレート制限の基準となるグループには3種類あり、それぞれ以下の通りとなっています。

  • ClientAddr – デフォルトの値です。同じIPアドレスからのトラフィックがグルーピングされ、追跡されます。
  • GeoLocation – クライアント IP アドレスの Geo-Match に基づいて、地理的にグループ化されます。 例えば、日本からのトラフィックといった形です。
  • なし – すべてのトラフィックがグループ化されます。IPアドレスや送信元の国等は影響しないため、複数のIPアドレスからのリクエストを追跡できますが、条件に一致するすべてのリクエストが追跡対象となります。

例えば、レートベースルールの条件がURI「/test」を含むとなっており、IPアドレスAがURI「/test」へ閾値を超えるリクエストを送信した場合、以下のような動作となります。

  • ClientAddr – IPアドレスAは「/test」へのアクセスをブロックされます。IPアドレスBは「/test」へアクセス可能です。
  • GeoLocation – IPアドレスAおよびIPアドレスBが日本のIPアドレス場合、IPアドレスAおよびBは「/test」へアクセスしてもブロックされます。米国のIPアドレスであれば、「/test」へアクセス可能です。
  • なし – 「/test」へはどのリクエスト元でもブロックされます。

条件は、通常のルールと同じように特定のIPアドレスやURI、ヘッダーに含まれる値などのマッチさせたい条件を指します。
グループで「なし」を選択する場合には、条件を用いてマッチさせたいリクエストをある程度制限する必要があります。

4. レートベースルールの設定方法

レートベースルールは、以下の手順で設定が可能です。

1. WAFポリシーを開きます。

2. カスタムルールをクリックします。

3. 「カスタム ルールの追加」をクリックします。

4. カスタム ルールの編集にある「ルールの種類」にて、「レート制限 (プレビュー)」を選択します。

5. ルールの条件を指定し、「追加」をクリックした後に「保存」をクリックします。
「保存」をクリックしない場合、変更が適用されませんのでご注意ください。

5. ユースケース

レートベースルールのユースケースと、それぞれで指定する値をいくつかご紹介します。

Azure WAFのカスタムルールで指定できる条件の詳細については、Application Gateway の Azure Web アプリケーション ファイアウォール (WAF) v2 カスタム規則をご確認ください。


例1:同一のIPアドレスから大量のリクエストがきた場合にブロックする

AWSなど他のプラットフォームでも類似の機能が提供されていることから、レートベースルールを設定する際に想像しやすいユースケースかと思います。

  • レート制限の期間:5分
  • レート制限のしきい値 (要求数):100回
  • トラフィックのレート制限の基準となるグループ:クライアント アドレス
  • 条件
    • 一致の種類:IPアドレス
    • 演算:次の値を含まない
    • IP アドレスまたは範囲:255.255.255.255/32
    • アクション(結果):トラフィックを拒否する

注意点としては、Azure WAFでは条件を削除することができないため、この例のように「同一のIPアドレスから大量のリクエストがきた場合にブロックする」といったルールを設定する場合には、上記のような条件の指定が必要となります。

条件が必須というのは想定していなかったため、少し戸惑ったポイントではありました。


例2:特定の国からのリクエスト数が閾値を超えた場合にブロックする

送信元のIPアドレス自体は異なるが、Geo-Matchで判定される国が同一の場合には、geo ロケーションでのグループが有用かと思います。
geo ロケーションが同じ正常なリクエストを意図せずブロックしてしまわないよう、ある程度絞れる条件を指定したほうが良いでしょう。

今回はUser-Agentを指定した例を記載します。

  • レート制限の期間:5分
  • レート制限のしきい値 (要求数):100回
  • トラフィックのレート制限の基準となるグループ:geo ロケーション
  • 条件
    • 一致の種類:文字列
    • ​​一致変数:RequestHeaders
    • ヘッダー名:User-Agent
    • 演算:次の値を含む
    • 一致する値:test
    • アクション(結果):トラフィックを拒否する


例3:特定のページへ大量のアクセスがあった場合にブロックする

お問い合せフォームなどに大量のリクエストがあった場合にリクエスト元を問わずブロックしたいといった場合には、グループの「なし」と条件の組み合わせを用いることで対応が可能です。

  • レート制限の期間:5分
  • レート制限のしきい値 (要求数):100回
  • トラフィックのレート制限の基準となるグループ:なし
  • 条件
    • 一致の種類:文字列
    • ​​一致変数:RequestUri
    • 演算:次の値で始まる
    • 一致する値:/contact
    • アクション(結果):トラフィックを拒否する

IPアドレスが変化する大量のリクエストを検知したい場合に、「なし」というグループは有用かと思います。

ただし、すべてのリクエストが対象となってしまうため、意図せず正常なリクエストをブロックしてしまうといったことも考えられますので、条件の設定には注意が必要です。

6. WafCharmとの併用

WafCharmをご利用のWAFポリシーにてプレビュー版のレートベースルールを適用されても問題ございません。

7. おわりに

Azure WAFのレートベースルールでは、閾値やリクエストをどのようにグルーピングするなど、かなり柔軟に設定ができるようです。
その反面、グループに「なし」を選択した場合など、多数のリクエストが追跡の対象となる設定もあるため、レートベースルールの条件は慎重に指定が必要かと思います。

また、現時点では条件の指定が必須となるため、単純に「同一IPアドレスから閾値を超えるリクエストがあった場合にブロックしたい」といった要件の場合には少し複雑な設定が必要となります。


現在はプレビュー版のため、仕様には変更があるかもしれませんので、利用される場合にはその点にも注意が必要そうです。