排解 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 Proxy 中的所有存取控管政策,並判斷特定政策中 <SourceAddress> 元素指定的 IP 位址是否與 faultstring 中指定的 IP 位址相符 (請參閱上述步驟 1)。

    舉例來說,下列政策將 <SourceAddress> IP 定義為 104.132.196.83,,與 faultstring 中的內容相符:

    <?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. 使用 UI 追蹤

      1. 擷取失敗的 API 要求追蹤記錄。
      2. 從右側面板選取失敗的特定存取權控管政策。
      3. 在「Phase Details」窗格中,檢查變數 proxy.client.ip 的值,如以下範例追蹤記錄的螢幕截圖所示。

        「Phase Details」(階段詳細資料) 窗格顯示 API 要求的 IP 位址。

      4. 如果沒有列出 proxy.client.ip,請檢查 X-Forwarded-For 或 True-Client-IP 訊息標頭的值。

    2. 使用自訂報表

      您可以建立自訂報表,判斷在執行 API 代理程式中的存取權控管政策時,是否會擲回 403 狀態碼,並判斷用戶端 IP 位址。如果問題曾經發生,或是問題是間歇性的,而您無法在 UI 中擷取追蹤記錄,這項功能就特別實用。

      如要瞭解如何建立自訂報表,請參閱「建立及管理自訂報表」。在自訂報表中選擇:

      1. 流量總和做為指標,以及

      2. ProxyResponse Status CodeProxy Client IPX-Forwarded-For-IP 做為維度。

      這應該有助於您判斷傳遞的用戶端 IP 或 IP 位址導致錯誤。

  4. 如果用戶端 IP 位址 (由變數 proxy.client.ip 表示) 或任何在 API 要求中傳遞的 IP 位址,與存取控制政策 <MatchRule> 元素中 <SourceAddress> 元素中指定的 IP 位址相符,且 action 屬性設為 DENY,則表示發生錯誤。

    在上述範例中,參照變數 proxy.client.ip 中設定的值 (如上方追蹤畫面擷圖所示) 與存取控制政策 <SourceAddress> 元素中定義的 IP 位址相符,因此會觸發錯誤回應:

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

解決方法

如果存取控制政策旨在拒絕來自 faultstring 中列出的特定 IP 位址的 API 要求,則會顯示錯誤訊息。在這種情況下,您不需要採取其他行動。

不過,如果您認為特定 IP 位址可存取特定 API Proxy 的 API 要求,請修改存取控管政策,允許存取這些 IP 位址。如果不想拒絕任何 IP 位址的存取權,您也可以從 API Proxy 中移除存取控制政策。

以下範例說明如何只允許存取特定 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>