Azure API Managementで呼び出し元のIPでアクセス制限する

このエントリは2019/10/17現在の情報に基づいています。将来の機能追加・変更にともない、記載内容との乖離が発生する可能性があります。

Azure API Management (以後APIM)をはじめとするAPI管理製品やサービスでは、Gateway内で様々なポリシーが提供されている(カスタムでポリシーを作成することも可能なサービスや製品もある)。

Azure API Management のポリシー
https://docs.microsoft.com/ja-jp/azure/api-management/api-management-howto-policies
Policies in Azure API Management
https://docs.microsoft.com/en-us/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 を制限する
https://docs.microsoft.com/ja-jp/azure/api-management/api-management-access-restriction-policies#RestrictCallerIPs
Restrict caller IPs
https://docs.microsoft.com/en-us/azure/api-management/api-management-access-restriction-policies#RestrictCallerIPs

chooseポリシーでも対応できるが、コンテキスト変数に含まれるIPは文字列なので、特に範囲での制限、許可を実現するのはちょいと面倒。

5) 6) 離散した複数のIPからのアクセスを制限・許可

これはip-filterポリシーではうまくいかないので、chooseポリシーを利用する。名前付き値(Named value)を使えば、ポリシーにIPを直書きする必要がないので、変更も簡単。

Azure API Management ポリシーでの名前付きの値の使用方法
https://docs.microsoft.com/ja-jp/azure/api-management/api-management-howto-properties
How to use Named Values in Azure API Management policies
https://docs.microsoft.com/en-us/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>

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中