AccessControl 政策运行时错误问题排查

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

IPDeniedAccess

错误代码

accesscontrol.IPDeniedAccess

错误响应正文

{
    "fault": {
        "faultstring": "Access Denied for client ip : client_IP",
        "detail": {
            "errorcode": "accesscontrol.IPDeniedAccess"
        }
    }
}

错误消息示例

{
    "fault": {
        "faultstring": "Access Denied for client ip : 104.132.196.83",
        "detail": {
            "errorcode": "accesscontrol.IPDeniedAccess"
        }
    }
}

原因

如果客户端 IP 地址或 API 请求中传递的任何 IP 地址与在访问权限控制政策的 <MatchRule> 元素内的 <SourceAddress> 元素中指定的 IP 地址相匹配,并且 <MatchRule> 元素的 action 属性设置为 DENY,则会发生此错误。

例如,假设 <SourceAddress> 定义如下:

<SourceAddress mask="32">104.132.196.83</SourceAddress>

如果上述 IP 地址与客户端系统的 IP 地址(由变量 proxy.client.ip 指示)或与 API 请求中传递的任何 IP 地址相匹配,则会发生该错误。

诊断

  1. 确定针对特定 API 请求拒绝访问的 IP 地址。您可以在错误响应的 faultstring 元素中找到此信息。

    例如,在下面 faultstring 中,IP 地址为 104.132.196.83:

    "faultstring": "Access Denied for client ip : 104.132.196.83"
    
  2. 检查失败的 API 代理中的所有访问权限控制政策,并确定在 <SourceAddress> 元素中指定的 IP 地址与在 faultstring 中识别的 IP 地址(上述第 1 步)相匹配的特定政策。

    例如,以下政策将 <SourceAddress> IP 地址定义为 104.132.196.83,,它与 faultstring 中的 IP 地址相匹配:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control">
        <DisplayName>Access-Control</DisplayName>
        <Properties/>
        <IPRules noRuleMatchAction="ALLOW">
            <MatchRule action="DENY">
                <SourceAddress mask="32">104.132.196.83</SourceAddress>
            </MatchRule>
        </IPRules>
        </AccessControl>
    
  3. 确定发出 API 请求的 IP 地址。此操作可以通过多种方式完成:

    1. 使用界面跟踪记录

      1. 捕获失败的 API 请求的跟踪记录。
      2. 从右侧面板中选择失败的特定访问权限控制政策。
      3. 阶段详细信息窗格中,检查变量 proxy.client.ip 的值,如以下示例跟踪记录屏幕截图所示。

        显示发出 API 请求的 IP 地址的“阶段详细信息”窗格。

      4. 如果未列出 proxy.client.ip,请检查 X-Forwarded-For 或 True-Client-IP 消息标头的值。

    2. 使用自定义报告

      您可以创建自定义报告,以确定在 API 代理中执行访问权限控制政策期间是否抛出了 403 状态代码,同时确定客户端 IP 地址。如果过去曾发生过该问题或者该问题间歇性发生,并且您无法在界面中捕获跟踪记录,则此功能特别有用。

      请参阅创建和管理自定义报告,了解如何创建自定义报告。在自定义报告中,选择:

      1. 流量总和作为“指标”,以及

      2. 代理响应状态代码代理客户端 IPX-Forwarded-For-IP 作为“维度”。

      这应可帮助您确定导致错误的一个或多个传递的客户端 IP 地址。

  4. 如果客户端 IP 地址(由变量 proxy.client.ip 指示)或在 API 请求中传递的任何 IP 地址与在访问权限控制政策(其中 action 属性设为 DENY<MatchRule> 元素内的 <SourceAddress> 元素中指定的 IP 地址相匹配,则这是导致错误的原因。

    在上面所示的示例中,在引用变量 proxy.client.ip 中设置的值(如在上面的跟踪记录的屏幕截图所示)与在访问权限控制政策的 <SourceAddress> 元素中定义的 IP 地址相匹配,从而触发错误响应:

    "faultstring": "Access Denied for client ip : 104.132.196.83"
    
    

解决方法

如果访问控制政策要拒绝访问来自 faultstring 中列出的特定 IP 地址的 API 请求,则应该显示错误消息。在这种情况下,您不需要执行任何其他操作。

但是,如果您确定可允许特定 IP 地址访问特定 API 代理的 API 请求,则修改访问控制政策以允许访问这些 IP 地址。或者,如果您不想拒绝对对任何 IP 地址的访问,则可以从 API 代理中移除访问权限控制政策。

以下示例显示了如何仅允许访问特定 IP 地址 104.132.196.83 并拒绝访问其余的 IP 地址:

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "DENY">
    <MatchRule action = "ALLOW">
      <SourceAddress mask="32">104.132.196.83</SourceAddress>
    </MatchRule>
  </IPRules>
</AccessControl>