このエントリは2019/10/17現在の情報に基づいています。将来の機能追加・変更にともない、記載内容との乖離が発生する可能性があります(2021/10/09 Key Vaultについて記載を追加)。
Azure API Management (以後APIM)をはじめとするAPI管理製品やサービスでは、Gateway内で様々なポリシーが提供されている(カスタムでポリシーを作成することも可能なサービスや製品もある)。
Azure API Management のポリシー / Policies in Azure API Management
https://docs.microsoft.com/azure/api-management/api-management-howto-policies
今回は呼び出し元のIPアドレスを使ってアクセス制限する場合にどのようなポリシーが利用できるかを確認した。ターゲットになるのは、ip-filterポリシーとchooseポリシー。およそ以下のような棲み分けになるはず。本来、IPによるアクセス制限はFirewallでやるべきではあるが、さらに細かく制限したい場合にどうすればよいか、という話。
ip-filterポリシー | chooseポリシー | |
---|---|---|
1) 単一IPからのアクセスを制限 | ○ | ○ |
2) 単一IPからのアクセスのみ許可 | ○ | ○ |
3) 連続したIPからのアクセスを制限 | ○ | |
4) 連続したいIPからのアクセスのみ許可 | ○ | |
5) 離散した複数のIPからのアクセスを制限 | ○ | ○ |
6) 離散した複数のIPからのアクセスのみ許可 | ○ | ○ |
1) 2) 単一IPからのアクセスを制限・許可
3) 4) 連続したIPからのアクセスを制限・許可
これは素直にip-filter ポリシーを使ったほうが簡単。
呼び出し元 IP を制限する / Restrict caller IPs
https://docs.microsoft.com/azure/api-management/api-management-access-restriction-policies#RestrictCallerIPs
<ip-filter action="allow">
<address>13.66.201.169</address>
<address-range from="13.66.140.128" to="13.66.140.143" />
</ip-filter>
chooseポリシーでも対応できるが、コンテキスト変数に含まれるIPは文字列なので、特に範囲での制限、許可を実現するのはちょいと面倒。
5) 6) 離散した複数のIPからのアクセスを制限・許可
これはip-filterポリシーでもできるが、chooseポリシーも利用できる。名前付き値(Named value)を使えば、ポリシーにIPを直書きする必要がないので、変更も簡単。
Azure API Management ポリシーでの名前付きの値の使用方法 / How to use Named Values in Azure API Management policies
https://docs.microsoft.com/azure/api-management/api-management-howto-properties
例えば、名前付き値を以下のように作成したとする(値はカンマ区切りで指定)。

chooseポリシーを使って、上記の値からのアクセスのみを許可する場合、以下のような仕組みで実現可能。該当IPだけ制限するなら、If文を変更すればOK。
<choose>
<when condition="@{
if ("{{permitted-ip2}}".Contains(context.Request.IpAddress))
{
return true; // OK
}
return false; // return 403
}" />
<otherwise>
<return-response>
<set-status code="403" reason="Forbidden" />
</return-response>
</otherwise>
</choose>
この名前付き値はKey Vaultに格納できるので、ブロック対象のIPアドレスの管理は別担当が実施するのであればKey Vaultに格納する、なんてこともできる。Key Vaultとの連携は以下のドキュメントを参照。
Azure API Management ポリシーで名前付きの値を使用する / Use named values in Azure API Management policies
https://docs.microsoft.com/azure/api-management/api-management-howto-properties