AccessControl 政策

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

結果

存取權控管政策可讓您依據特定 IP 允許或拒絕對 API 的存取權 讓我們看看 DNS 解析 進一步探索內部和外部位址

影片:觀看這部短片,進一步瞭解如何允許或拒絕 就能依特定 IP 位址存取您的 API

雖然您可以在 API Proxy 流程的任何位置附加這項政策,不過建議您還是建議您 在流程一開始時檢查 IP 位址 ( 要求 / ProxyEndpoint / PreFlow), 以及驗證或配額檢查

範例

下列 IPv4 範例中的遮罩值可識別八種 (8、16、24、32) 中的 位元) 允許或拒絕存取時,才會考慮比對規則。預設值為 32。詳情請參閱 元素參考資料中的 mask 屬性瞭解詳情 可能不準確或不適當

拒絕 198.51.100.1

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

拒絕所有來自用戶端位址的要求:198.51.100.1

允許來自其他用戶端位址的要求。

使用變數拒絕

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "DENY">
      <SourceAddress mask="{kvm.mask.value}">{kvm.ip.value}</SourceAddress>
    </MatchRule>
    </IPRules>
</AccessControl>

假設您使用鍵/值對應 (KVM) 儲存遮蓋和 IP 的值, 這是在執行階段期間變更 IP 和遮蓋的便利方法,無需更新 並重新部署 API Proxy您可以使用 KeyValueMapOperations 政策進行擷取 包含 kvm.mask.valuekvm.ip.value (假設這就是您在 KVM 政策中將變數命名為變數) ,其中包含 KVM 的遮罩值和 IP 值)。 如果您擷取的值是 24 的遮罩,且 198.51.100.1 值 對於 IP 位址,AccessControl 政策會拒絕來自 198.51.100 的所有要求。*

允許所有其他用戶端位址。

拒絕 198.51.100。*

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

拒絕所有來自用戶端位址的要求:198.51.100。*

允許來自其他用戶端位址的要求。

198.51.*。

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

拒絕來自用戶端位址的所有要求:198.51.*。*

允許來自其他用戶端位址的要求。

拒絕 198.51.100.*,允許 192.0.2.1

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

拒絕所有來自用戶端位址的要求:198.51.100.*,但允許 192.0.2.1。

允許來自其他用戶端位址的要求。

允許 198.51.*。*

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

允許所有來自以下地址的要求:198.51.*。*

拒絕來自其他用戶端位址的要求。

允許多個 IP

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "DENY">
    <MatchRule action = "ALLOW">
      <SourceAddress mask="24">198.51.100.1</SourceAddress>
      <SourceAddress mask="24">192.0.2.1</SourceAddress>
      <SourceAddress mask="24">203.0.113.1</SourceAddress>
     </MatchRule>
  </IPRules>
</AccessControl>

允許來自用戶端位址的要求:198.51.100。*192.0.2.*203.0.113。*

拒絕所有其他地址。

拒絕多個 IP

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "DENY">
      <SourceAddress mask="24">198.51.100.1</SourceAddress>
      <SourceAddress mask="24">192.0.2.1</SourceAddress>
      <SourceAddress mask="24">203.0.113.1</SourceAddress>
    </MatchRule>
  </IPRules>
</AccessControl>

拒絕來自用戶端位址的要求:198.51.100。*192.0.2.*203.0.113。*

允許使用其他所有地址。

允許多個 IP,拒絕多個 IP

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "DENY">
    <MatchRule action = "DENY">
      <SourceAddress mask="24">198.51.100.1</SourceAddress>
      <SourceAddress mask="24">192.0.2.1</SourceAddress>
      <SourceAddress mask="24">203.0.113.1</SourceAddress>
    </MatchRule>
    <MatchRule action = "ALLOW">
      <SourceAddress mask="16">198.51.100.1</SourceAddress>
      <SourceAddress mask="16">192.0.2.1</SourceAddress>
      <SourceAddress mask="16">203.0.113.1</SourceAddress>
    </MatchRule>
  </IPRules>
</AccessControl>

允許:198.51.*。*192.0.*。*203.0.*。*

拒絕許可清單中的子集:198.51.100。*192.0.2.*203.0.113。*


使用須知

除了保護 API 不受惡意 IP 侵擾,存取權控管政策也 可讓您掌控合法的 IP 存取權舉例來說,如果您只想在 讓企業能存取測試環境中公開的 API。您可以 您內部網路的 IP 位址範圍在家工作的開發人員 存取這些 API

存取權控管政策的設定與執行涉及下列事項:

  • 定義一組比對規則,其中包含一組相關聯的兩項動作 (ALLOW 或 DENY) 各自的經驗值
  • 為每項比對規則指定 IP 位址 (SourceAddress 元素)。
  • 指定規則的測試順序。
  • 所有比對規則都會按照指定順序執行。規則相符時, 便會執行對應的動作,並略過下列比對規則。
    • 如果同一項規則同時設定了「ALLOW」和「DENY」動作,則 就會觸發後續規則 (與其他動作一起) 略過。

政策如何選擇要評估的 IP 位址

要求中的 IP 位址可能來自多個來源。舉例來說, True-Client-IP 郵件標頭可能含有 IP 位址,而 X-Forwarded-For 標頭可能包含一或多個 IP 位址。這個區段 說明如何設定 AccessControl 政策以評估您指定的 IP 位址

AccessControl 政策會依據以下邏輯決定要使用哪個 IP 位址 請評估:

1. True-Client-IP 標頭

這項政策會先檢查 True-Client-IP 標頭中的 IP 位址。如果 標頭包含有效的 IP 位址,政策會評估該位址。

2. X-Forwarded-For 標頭

如果沒有 True-Client-IP 標頭,或已設定 &lt;IgnoreTrueClientIPHeader&gt; 元素 是,這項政策會評估 X-Forwarded-For 標頭中的 IP 位址。

邊緣會自動填入 X-Forwarded-For 標頭 以及從上次外部 TCP 握手接收的 IP 位址 (例如用戶端 IP 或 或 Cloud Router 路由器如果標頭中有多個 IP 位址, 可能是處理要求的伺服器鏈。不過,位址清單 也可能包含假冒的 IP 位址那麼,政策如何判斷要把 要評估?

貴機構的設定和政策設定會決定 政策評估的 X-Forwarded-For 個位址。

首先,請檢查 feature.enableMultipleXForwardCheckForACL 屬性是否含有 是在貴機構中設定。您可以使用 取得機構 API 進行確認。然後執行下列步驟:

  • 如果 feature.enableMultipleXForwardCheckForACL 組織的屬性清單,代表該屬性已設為 false (預設值)。將這個屬性設為 false 之後,政策會評估 最後一個地址 (顯示於 追蹤工具),也就是 IP 位址 從上次外部 TCP 交握所接收的邊緣。
  • 如果貴機構的feature.enableMultipleXForwardCheckForACL 設為 true,請設定 &lt;ValidateBasedOn&gt; 元素,判斷政策要評估的 IP 位址。

變更 feature.enableMultipleXForwardCheckForACL 屬性

Edge 機構管理員可以使用 更新機構屬性 API 即可設定 feature.enableMultipleXForwardCheckForACL 屬性。

以下 API 範例會在 Private Cloud 設定 Edge 中的屬性。 如果貴機構已設定其他屬性,請務必一併加入這些資源。 否則就會遭到移除

curl -u email:password -X POST -H "Content-type:application/xml" http://host:8080/v1/o/myorg -d \
"<Organization type="trial" name="MyOrganization">
    <DisplayName>MyOrganization</DisplayName>
    <Properties>
        <Property name="feature.enableMultipleXForwardCheckForACL">true</Property>
        <!-- Include other existing properties as well. -->
    </Properties>
</Organization>"

在 Edge for Private Cloud 中 feature.enableMultipleXForwardCheckForACL 資源, 您必須重新啟動訊息處理工具,如 啟動/停止/重新啟動個別元件

X-Forwarded-For Apigee 數據分析中的維度

邊緣 Analytics 會將 X-Forwarded-For 標頭的值寫入 x_forwarded_for_ip維度。目的是找出產生的用戶端 IP 傳送要求給 Edge,請使用 ax_true_client_ip 中的值,或 ax_resolved_client_ip 個維度。詳情請見 Analytics 指標、維度 和篩選器參考資料

關於以 CIDR 標記法遮蓋的 IP

CIDR 標記法 (無類別跨網域路由) 是一種指出 IP 位址範圍的方式 例如遮蓋功能、安全雜湊、權杖化IPv4 和 IPv6 皆適用。以下說明運作方式我們將使用 IPv4 來簡化範例

IP 位址是一組以半形句號分隔的數字群組,以二進位表示,每個群組都是 特定位元數 (IPv4 為 8,IPv6 為 16)。IPv4 位址 198.51.100.1 看起來像這樣 以二進位表示:

11000110.00110011.01100100.00000001

亦即 4 個 8 位元群組 (總共 32 位元)。在 CIDR 中,您可以新增 /number (1-32) 附加至 IP 位址,如下所示:

198.51.100.1/24

在此範例中,24 是 mask 屬性要使用的數字 政策值。

此標記意指「完全保持前 24 位元,剩餘位元可以 0 到 255 之間的任何值。」例如:

保持原樣 最後一個群組可能的值
198.51.100。 0 至 255 人

請注意,遮蓋會在群組 3 的結尾發生。這樣一來,整體設計也變得美觀 就是建立遮罩的本質:198.51.100.*在大多數情況下,使用 8 的倍數 (IPv4) 和 16 (IPv6) 可讓您的遮罩層級:

IPv4:8、16、24、32

IPv6:16、32、48、64、80、96、112、128

不過,您可以提供其他號碼,以便進行更精細的控管,而這牽涉到一些二進位檔 計算。以下是使用 30 的遮罩範例,如 198.51.100.1/30,最後 1 是 00000001,以二進位表示:

保持原樣 可能的值
11000110.00110011.01100100.000000 (前 30 位元) 00000000、00000001、00000010 或 00000011
198.51.100。 0、1、2 或 3

在此範例中,設定為 <SourceAddress mask="30">198.51.100.1</SourceAddress> 時,將允許下列 IP (或 視您的規則而定):

  • 198.51.100.0
  • 198.51.100.1
  • 198.51.100.2
  • 198.51.100.3

元素參照

元素參照會說明存取權控管政策的元素和屬性。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
    <DisplayName>Access Control 1</DisplayName>
    <IPRules noRuleMatchAction = "ALLOW">
        <MatchRule action = "ALLOW">
            <SourceAddress mask="32">198.51.100.1</SourceAddress>
        </MatchRule>
        <MatchRule action = "DENY">
            <SourceAddress mask="24">198.51.100.1</SourceAddress>
        </MatchRule>
    </IPRules>
    <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn>
</AccessControl>

&lt;AccessControl&gt;屬性

<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1"> 

下表說明所有政策父項元素的共同屬性:

屬性 說明 預設 存在必要性
name

政策的內部名稱。name 屬性的值可以 包含英文字母、數字、空格、連字號、底線和半形句號。此值不能 超過 255 個半形字元

視需要使用 <DisplayName> 元素,為政策加上標籤: 管理使用者介面 Proxy 編輯器,使用不同的自然語言名稱。

不適用 必填
continueOnError

如果設為「false」,系統會在政策失敗時傳回錯誤。這是可預期的情況 大多數政策的行為

如果設為 true,即使政策已發生,流程執行作業仍會繼續執行 失敗。

false 選用
enabled

如要強制執行政策,請設為 true

設為 false 即可停用政策。這項政策不會 仍會強制執行 政策。

true 選用
async

此屬性已淘汰。

false 已淘汰

&lt;DisplayName&gt;元素

name 屬性外,一併使用 管理 UI Proxy 編輯器,使用不同的自然語言名稱。

<DisplayName>Policy Display Name</DisplayName>
預設

不適用

如果省略這個元素,政策的 name 屬性值會是

存在必要性 選用
類型 字串

&lt;IgnoreTrueClientIPHeader&gt;元素

如果設為 True,這項政策會忽略 True-Client-IP 標頭。 並評估 X-Forwarded-For 標頭中的 IP 位址,按照以下指示 您設定的 X-Forwarded-For 評估行為


<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
    <DisplayName>Access Control-1</DisplayName>
    <IgnoreTrueClientIPHeader>true</IgnoreTrueClientIPHeader>
    ...
</AccessControl>

預設 false
存在必要性 選用
類型 布林值

&lt;IPRules&gt;元素

父項元素,其中包含允許或拒絕 IP 位址的規則。 noRuleMatchAction 屬性可讓您定義如何處理 或是不在比對規則的涵蓋範圍內

<IPRules noRuleMatchAction = "ALLOW">
預設 不適用
存在必要性 選用
類型 不適用

屬性

屬性 說明 類型 預設 存在必要性
noRuleMatchAction
指定的比對規則未解決時,要採取的動作 (允許或拒絕存取) (不相符)。
有效值:ALLOW 或 DENY
字串 允許 必填

&lt;IPRules&gt;/&lt;MatchRule&gt;元素

如果 IP 位址與您的 SourceAddress 相符,要採取的動作 (允許或拒絕存取) 定義。

<IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "ALLOW">
        <SourceAddress mask="32">198.51.100.1</SourceAddress>
    </MatchRule>
    <MatchRule action = "DENY">
        <SourceAddress mask="24">198.51.100.1</SourceAddress>
    </MatchRule>
</IPRules>
預設 不適用
存在必要性 選用
類型 不適用

屬性

屬性 說明 類型 預設 存在必要性
動作

指定的比對規則未解決時,要採取的動作 (允許或拒絕存取) (不相符)。

有效值:ALLOW 或 DENY

字串 允許 必填

&lt;IPRules&gt;/&lt;MatchRule&gt;/&lt;SourceAddress&gt;元素

用戶端的 IP 位址範圍。

有效值:有效的 IP 位址 (點號十進位標記法)。如需萬用字元行為,請使用 mask 屬性。

<IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "ALLOW">
        <SourceAddress mask="{variable}">198.51.100.1</SourceAddress>
    </MatchRule>
    <MatchRule action = "DENY">
        <SourceAddress mask="24">{variable}</SourceAddress>
    </MatchRule>
</IPRules>

如上一個範例所示,SourceAddress 元素也支援 郵件範本 mask 屬性或 IP 位址 因此您可以使用 API Proxy 流程。

舉例來說,您可以將 IP 位址儲存在鍵/值對應 (KVM) 中,並使用 KeyValueMapOperations 政策:擷取 IP 位址並指派給變數 (例如 kvm.ip.value)。接下來,您可以將該變數用於 IP 位址:

<SourceAddress mask="24">{kvm.ip.value}</SourceAddress>

透過變數設定遮罩和/或 IP 位址,可讓您靈活地變更 不必修改並重新部署 API Proxy。

預設 不適用
存在必要性 選用
類型 字串 (僅限單一 IP 位址)

屬性

屬性 說明 類型 預設 存在必要性
掩蓋

mask 屬性可協助您指定要向哪些 IP 位址範圍 允許或拒絕遮罩相當於使用 CIDR 標記法 (無類別跨網域路由)。例如:

<SourceAddress mask="24">198.51.100.1</SourceAddress>

等於下列 CIDR 標記法:

198.51.100.1/24

有效值:

IPv4:1 至 32

IPv6:1-128

如果值為 0,僅對 IP 0.0.0.0 有效,因此不切實際。

使用變數設定遮罩

mask 屬性也支援 「訊息範本」 這表示您可以使用目前 API Proxy 流程。舉例來說,您可以將遮罩值儲存在 KVM 中,並使用 KeyValueMapOperations 政策:擷取遮罩並將其指派給變數。 如要使用變數設定 IP 遮罩,請使用下列格式: 假設變數命名為 kvm.mask.value

mask="{kvm.mask.value}"

整數 不適用 必填

&lt;ValidateBasedOn&gt;元素

X-Forwarded-For HTTP 標頭含有多個 IP 時 位址,請使用這個 ValidateBasedOn 元素控制 IP 位址 。

除非您確定 IP 位址有效性,否則使用這個方法才能評估 IP 位址 您要求評估的 IP 位址數量舉例來說,假設您選擇全面評估 使用 X-Forwarded-For 標頭中的 IP 位址,就必須能夠信任 以及/或是設定完整的 DENY 或 ALLOW 規則, IP 會呼叫您的 API Proxy。

標頭中最左側的 IP 位址屬於用戶端,最右側的 IP 位址為伺服器。 將要求轉送至目前服務。最右側的或最後一個 IP 位址 是指上次外部 TCP 交握所接收的位址邊緣。

您只要在這個元素中輸入值,就可以決定是否要檢查 Google 日曆中的所有 IP 位址 標頭 (預設)、僅限第一個 IP 位址或最後一個 IP 位址。

<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
    <DisplayName>Access Control 1</DisplayName>
    <IPRules noRuleMatchAction = "ALLOW">
        <MatchRule action = "DENY">
            <SourceAddress mask="32">198.51.100.1</SourceAddress>
        </MatchRule>
    </IPRules>
    <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn>
</AccessControl>
預設 X_FORWARDED_FOR_ALL_IP
存在必要性 選用
有效值

X_FORWARDED_FOR_ALL_IP (預設)

X_FORWARDED_FOR_FIRST_IP

X_FORWARDED_FOR_LAST_IP

結構定義

每種政策類型都是由 XML 架構 (.xsd) 定義。僅供參考 您可以在 GitHub 找到政策結構定義

錯誤參考資料

本節說明在這項政策觸發錯誤時,所傳回的錯誤代碼和錯誤訊息,以及 Edge 所設定的錯誤變數。 請務必瞭解這份資訊,以便瞭解您是否要擬定錯誤規則, 處理錯誤詳情請參閱這篇文章 瞭解政策錯誤處理方式 發生錯誤

執行階段錯誤

執行政策時,可能會發生這些錯誤。

錯誤程式碼 HTTP 狀態 原因 修正
accesscontrol.IPDeniedAccess 403 用戶端 IP 位址或已傳入的 IP 位址 在 API 要求中,與以下位置的 <SourceAddress> 元素中指定的 IP 位址相符: 存取權控管政策的 <MatchRule> 元素,以及action <MatchRule> 元素已設為 DENY

錯誤變數

系統會在發生執行階段錯誤時設定這些變數。詳情請參閱「政策錯誤專用變數」。

變數 地點 範例
fault.name="fault_name" fault_name 是錯誤的名稱,如上方「執行階段錯誤」表格所列。錯誤名稱是錯誤程式碼的最後部分。 fault.name Matches "IPDeniedAccess"
acl.policy_name.failed policy_name 是使用者指定錯誤的政策名稱。 acl.AC-AllowAccess.failed = true

錯誤回應範例

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

錯誤規則範例

<FaultRule name="IPDeniedAccess">
    <Step>
        <Name>AM-IPDeniedAccess</Name>
        <Condition>(fault.name Matches "IPDeniedAccess") </Condition>
    </Step>
    <Condition>(acl.failed = true) </Condition>
</FaultRule>