Azure Application Gateway で IPアドレス制限する際の WAF ポリシー上限について

# はじめに
AKS 上で稼働しているアプリケーションに外部からアクセスできるよう、Azure Application Gateway（以降、APGW）を Ingress として利用しています。最近、この APGW に WAF ポリシーをアタッチし、クライアントの送信元 IP アドレスを制限する設定をお手伝いしました。

:::note info 
AKS + Application Gateway の構成で、WAFポリシーを適用する際の仕様や方法は以下の記事をとても参考にさせていただきました🙏 感謝です！
https://qiita.com/thanai/items/fe09d22049a6bf60332f

記事内でも紹介されていますが、Application Gateway で WAF を使用するには以下2つの方法があります。
- APGWの組み込みWAFルールを使用する
- WAFポリシーを作成し、APGWにアタッチする

WAF で IP アドレス制限をする場合、後者の WAF ポリシーを作ってアタッチする必要がありますが、WAFポリシーは **WAF V2 SKU** でしか利用できないので注意です。

:::

上記で設定はできることはわかったのですが、

- WAF ポリシーやカスタムルールの上限ってどれくらいなのか？
- IPアドレスは何個まで設定できるのか？

といった、拡張性に関する疑問が出てきたので、ひと通り調べてみることにしました。
せっかくなので、今回はその結果を備忘録としてまとめておこうと思います。

# 各種リソースの上限値について

## Application Gateway WAFポリシー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/0ebdea67-b762-72dd-ab1c-20db627ae473.png)


以下の公式ドキュメントを確認した限り、制限はないようです。
（サブスクリプション単位でのデフォルト上限とかありそうなので要確認）

https://learn.microsoft.com/ja-jp/azure/web-application-firewall/ag/policy-overview

> 作成できるポリシーの数に制限はありません。 ポリシーを作成した場合は、アプリケーション ゲートウェイに関連付けて有効にする必要があります。



## カスタムルール

1 つの WAF ポリシーあたり**最大 100 個**のカスタムルールを定義できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/cb35f477-8bc5-6d75-033b-8f62f495b263.png)




https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/azure-subscription-service-limits#application-gateway-limits


Azure ポータル画面だと、以下がカスタムルールの設定箇所になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/d465bdf3-4137-57db-b673-dbf7fcef8619.png)

### （補足）WAF ポリシーのアタッチ先について
WAF ポリシーのアタッチ先やアタッチ時の制約・仕様が分かりづらかったので、このセクションにまとめておきます。

まず、WAF ポリシーは Application Gatewayの以下３つのレイヤーに対してアタッチすることができます。
- **Application Gateway**
    - APGW 全体に対してグローバルにポリシーを適用したい場合
- **HTTP リスナー**
    - 特定のリスナー (ドメインやポート等) に対してのみ適用したい場合
- **ルートパス**
    - 特定のパス（URL パスベースルーティングなど）に対してのみ適用したい場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/f0e374a9-4c19-d5d5-ee4c-f179fba60d20.png)


なお、異なるWAF ポリシーを以下のように入れ子構造で適用することができます。
この場合、最もレイヤーの低い WAF ポリシー（カスタムルール）が優先されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/7be06abe-7b61-9dc4-54d7-9ebce36a3978.png)



ちなみに、以下のように複数の異なる WAF ポリシーを 同一ターゲットにアタッチすることはできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/ee2e7386-29a2-abfc-de4d-6eee9c0b6228.png)


### （補足）100 個の上限とアタッチ先を考慮した設計が必要
WAF ポリシー導入時の設計ポイントとして、**カスタムルールが最大 100 個まで** という上限と、**WAF ポリシーをアタッチするレイヤー構造を意識する** ことが肝になると思います。

特に、将来的な拡張性を考慮しておかないと、後々、大きな設定変更が必要になる可能性があるので注意です。
例えば、現状はテナント数が少ないという理由で「APGW のグローバルに 1 テナント 1 ルールで適用！ 」のような構成にしていると、
将来的にシステムがスケールして大規模なマルチテナント構成になった場合など、あっという間にルール数が枯渇してしまう可能性があります。

なので、最初からスケールを想定したルール設計を行うのが吉だと考えます。例えば、以下が思いつきます。
- WAF ポリシーをレイヤー別に分割する
    - 全体に共通するアクセス制御（たとえば全テナント共通で許可・拒否したい IP アドレス）は APGW のグローバル ポリシーにまとめて、それ以外のテナント固有の制御は HTTP リスナーやルートパスにアタッチする等。こうすれば、「テナント数×ポリシー数」が増えても、1 つの WAF ポリシーに作成するルール数が分散されるので、1 ポリシーあたり 100 個の制限を超えにくくなるはず
- カスタムルールの『条件』を足して複数条件を組み合わせる
    - カスタムルールでは「OR 条件」を使って複数 IP アドレスを 1 ルールとしてまとめることが可能なので、これを有効活用する
- IPアドレスは可能な限りCIDR 記法でまとめる

## カスタムルール内の『条件』の数
Azure ポータルの画面では、カスタムルールの設定画面は以下のようになっており、『条件』の中に送信元 IP アドレスを設定する形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/117f5a1d-cc80-9404-4118-23a2a762cb91.png)

なお、『条件』は画面下部に「新しい条件を追加する」という項目があるように、『条件』を複数個追加することができるようになっています。

では、この『条件』の上限値はあるのでしょうか？
探してみたのですが、どうやらこの上限値は公開されていない？ようで見つけることができませんでした。

気になったので Microsoft に問い合わせしたところ、明確な上限値はなく、**無制限**との回答を得ることができました。


## 『条件』内の『IPv4 アドレスまたは範囲』の数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/720cdd73-fbd7-e44f-0197-5ee9e27f4c05.png)

実際に送信元IP アドレス（またはIP アドレス範囲）を設定する箇所です。
こちらの上限値は公開されており、以下のようになっています。

- CRS 3.2の場合
    - 600
- それ以外
    - 540

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/azure-subscription-service-limits#application-gateway-limits


:::note info 
CRS（Core Rule Set）は、Application Gateway WAF に組み込まれている基本的なセキュリティルールのセットです。なお、Application Gateway WAF のデフォルトは CRS 3.2 になります。
https://learn.microsoft.com/ja-jp/azure/web-application-firewall/ag/application-gateway-crs-rulegroups-rules?tabs=drs21#core-rule-sets

:::

# 参考
https://www.softbank.jp/biz/blog/cloud-technology/articles/202108/azure-waf-policy/