このエントリは2019/10/17現在の情報に基づいています。将来の機能追加・変更にともない、記載内容との乖離が発生する可能性があります。
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ポリシー | |
---|---|---|
単一IPからのアクセスを制限 | ○ | ○ |
単一IPからのアクセスのみ許可 | ○ | ○ |
連続したIPからのアクセスを制限 | ○ | △ |
連続したいIPからのアクセスのみ許可 | ○ | △ |
離散した複数のIPからのアクセスを制限 | ○ | |
離散した複数の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
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>