Azure API 管理在 API 终结点级别限制多个调用方 IP 地址 API

Posted

技术标签:

【中文标题】Azure API 管理在 API 终结点级别限制多个调用方 IP 地址 API【英文标题】:Azure API Management Restrict multiple caller IP Address API in API endpoint level 【发布时间】:2019-04-26 06:28:57 【问题描述】:

我想在 Azure APIM 策略级别限制一些 IP。

我浏览了以下链接; https://docs.microsoft.com/en-us/azure/api-management/api-management-access-restriction-policies#RestrictCallerIPs

Azure API Management Restrict multiple caller IP Address

但不确定如何使用policy scope 对 API 端点级别执行此操作

我在 policy.xml 中有以下代码:

<policies>
    <inbound>
        <base />
        <!-- statements to be applied to the request go here -->
        <authentication-certificate thumbprint="@((string)context.Variables[&quot;ClientCertificateThumbprint&quot;])" />
        <rate-limit-by-key calls="100" renewal-period="60" counter-key="@(context.Request.Headers.GetValueOrDefault(&quot;Ocp-Apim-Subscription-Key&quot;))" />        
        <cors>
            <allowed-origins>
                <origin>*</origin>
            </allowed-origins>
            <allowed-methods preflight-result-max-age="600">
                <method>*</method>
            </allowed-methods>
            <allowed-headers>
                <header>*</header>
            </allowed-headers>
            <expose-headers>
                <header>*</header>
            </expose-headers>
        </cors>
        <ip-filter action="allow">
          <address>55.11.187.20</address>
          <address-range from="186.168.95.0" to="186.168.95.20" />
        </ip-filter>
    </inbound>
    <backend>
        <base />

        <!-- statements to be applied before the request is forwarded to 
         the backend service go here -->
    </backend>
    <outbound>
        <base />

        <!-- statements to be applied to the response go here -->
    </outbound>
    <on-error>
        <base />
        <!-- statements to be applied if there is an error condition go here -->
    </on-error>
</policies

>

【问题讨论】:

【参考方案1】:

使用高级策略中的控制流,您可以将范围更改为 API 端点级别(操作)以限制 IP 地址,如下所示

<choose>
      <when condition="@(context.Operation.Id.Equals(&quot;StatusGet&quot;))">
        <ip-filter action="allow">
          <address>55.11.187.20</address>
           <address-range from="186.168.95.0" to="186.168.95.20" />
        </ip-filter>
      </when>
    </choose>
</inbound>

参考:https://docs.microsoft.com/en-us/azure/api-management/api-management-advanced-policies

【讨论】:

啊。因此,您希望在使用非操作范围时将 IP 过滤器应用于单个操作。这是正确的答案。【参考方案2】:
    导航到 Azure 门户、您的 APIM 服务、API。 点击要应用 IP 过滤器的 API 在“入站处理”部分单击“添加策略”并选择 IP 过滤器。

【讨论】:

在我的情况下,我们无法直接编辑APIM policy,因此必须通过VSTS 进行部署。在代码中,我们有policy.xml,我们可以在其中编辑和部署。但是通过当前的策略文件,它在 API 级别而不是端点级别更新 Inbound processing。但我也可以在端点级别看到Inbound processing。有没有办法在端点级别做到这一点? 当然。此策略可以在任何范围内应用,但也将仅在该范围内强制执行。如果你把它放在全局范围内——每次调用——无论是什么 API——都将受到限制。如果您将其添加到 API 范围 - 只有对该 API 的调用才会是 e.t.c. 我明白了,但问题是如何对 policy.xml 文件进行编码以仅限制 API 端点级别。我已经更新了当前更新全局级别的问题中的完整 policy.xml 文件。

以上是关于Azure API 管理在 API 终结点级别限制多个调用方 IP 地址 API的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过 Azure API 管理中的订阅来改变速率限制的值

Azure 应用服务>网络>访问限制和处理来自 API 管理的 308 重定向

如何在订阅级别获取不同资源类型的 Azure 资源计数限制和配额?

当有文件存储在 Azure Blob 存储中时触发 API 终结点

Azure API 管理 - 当 APM 落后于 WAF 时如何获取原始 IP

Azure API 管理 - 仅在设置标记时应用策略