授權原則

Istio 授權原則啟用網格中工作負載的存取控制。

授權原則支援 CUSTOM、DENY 和 ALLOW 動作以進行存取控制。當 CUSTOM、DENY 和 ALLOW 動作同時用於一個工作負載時,會先評估 CUSTOM 動作,然後評估 DENY 動作,最後評估 ALLOW 動作。評估由以下規則決定

  1. 如果存在任何符合請求的 CUSTOM 原則,則評估並在評估結果為拒絕時拒絕該請求。
  2. 如果存在任何符合請求的 DENY 原則,則拒絕該請求。
  3. 如果工作負載沒有 ALLOW 原則,則允許該請求。
  4. 如果有任何符合請求的 ALLOW 原則,則允許該請求。
  5. 拒絕該請求。

Istio 授權原則也支援 AUDIT 動作,以決定是否記錄請求。AUDIT 原則不影響是否允許或拒絕工作負載的請求。請求將完全根據 CUSTOM、DENY 和 ALLOW 動作來允許或拒絕。

如果工作負載上有符合請求的 AUDIT 原則,則會在內部將請求標記為應進行稽核。必須設定並啟用單獨的外掛程式,才能實際履行稽核決策並完成稽核行為。如果沒有啟用此類支援外掛程式,則不會稽核請求。

以下是 Istio 授權原則的範例

它將 action 設定為 ALLOW,以建立允許原則。預設的 action 是 ALLOW,但在原則中明確指定會很有幫助。

它允許來自以下來源的請求:

  • 服務帳戶 cluster.local/ns/default/sa/sleep
  • 命名空間 test

來存取具有以下條件的工作負載:

  • 在路徑前綴為 /info 的情況下,使用 GET 方法,或
  • 在路徑為 /data 的情況下,使用 POST 方法。

當請求具有由 https://# 發行的有效 JWT 權杖時。

任何其他請求都將被拒絕。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: ALLOW
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/sleep"]
    - source:
        namespaces: ["test"]
    to:
    - operation:
        methods: ["GET"]
        paths: ["/info*"]
    - operation:
        methods: ["POST"]
        paths: ["/data"]
    when:
    - key: request.auth.claims[iss]
      values: ["https://#"]

以下是另一個範例,將 action 設定為 DENY,以建立拒絕原則。它拒絕來自 dev 命名空間對 foo 命名空間中所有工作負載的 POST 方法的請求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: DENY
  rules:
  - from:
    - source:
        namespaces: ["dev"]
    to:
    - operation:
        methods: ["POST"]

以下是另一個範例,將 action 設定為 DENY,以建立拒絕原則。它拒絕所有對 foo 命名空間中所有工作負載的 8080 連接埠使用 POST 方法的請求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: DENY
  rules:
  - to:
    - operation:
        methods: ["POST"]
        ports: ["8080"]

當此規則應用於 TCP 流量時,method 欄位(以及所有基於 HTTP 的屬性)無法處理。對於 DENY 規則,遺失的屬性會被視為符合。這表示在上述範例中,所有在 8080 連接埠上的 TCP 流量都會被拒絕。如果我們移除 ports 匹配,則所有 TCP 流量都會被拒絕。因此,建議始終將 DENY 原則的範圍設定為特定連接埠,尤其是在使用 HTTP 屬性時 TCP 連接埠的授權原則

以下授權原則將 action 設定為 AUDIT。它將稽核任何對路徑前綴為 /user/profileGET 請求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  namespace: ns1
  name: anyname
spec:
  selector:
    matchLabels:
      app: myapi
  action: AUDIT
  rules:
  - to:
    - operation:
        methods: ["GET"]
        paths: ["/user/profile/*"]

授權原則的範圍(目標)由「metadata/namespace」和可選的 selector 決定。

  • 「metadata/namespace」指示原則適用於哪個命名空間。如果設定為根命名空間,則該原則適用於網格中的所有命名空間。
  • 工作負載 selector 可以用來進一步限制原則的適用範圍。

例如,以下授權原則適用於命名空間 foo 中的所有工作負載。它不允許任何請求,實際上拒絕所有對命名空間 foo 中工作負載的請求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-nothing
 namespace: foo
spec:
  {}

以下授權原則允許所有對命名空間 foo 中工作負載的請求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-all
 namespace: foo
spec:
 rules:
 - {}

以下授權原則適用於命名空間 bar 中包含標籤 app: httpbin 的工作負載。它不允許任何請求,實際上拒絕所有對選定工作負載的請求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: allow-nothing
  namespace: bar
spec:
  selector:
    matchLabels:
      app: httpbin

以下授權原則適用於網格中所有命名空間中包含標籤 version: v1 的工作負載。(假設根命名空間配置為 istio-system)。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-nothing
 namespace: istio-system
spec:
 selector:
   matchLabels:
     version: v1

以下範例說明如何使用 實驗性註解 istio.io/dry-run 設定授權原則,以在不實際強制執行的情況下試執行該原則。

試執行註解可讓您在將授權原則應用於生產流量之前,更好地了解其影響。這有助於降低因不正確的授權原則而導致生產流量中斷的風險。如需更多資訊,請參閱試執行任務

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: dry-run-example
  annotations:
    "istio.io/dry-run": "true"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

AuthorizationPolicy

AuthorizationPolicy 可啟用對工作負載的存取控制。

欄位類型描述必要
selectorWorkloadSelector

選用。選擇器決定授權原則的應用位置。選擇器將與授權原則所在的相同命名空間中的工作負載匹配。如果授權原則位於根命名空間中,則選擇器還將與所有命名空間中的工作負載匹配。

如果未設定選擇器和 targetRef,則選擇器將匹配所有工作負載。

對於給定的原則,最多可以設定 selectortargetRefs 中的一個。

targetRefsPolicyTargetReference[]

選用。targetRefs 指定應將原則應用於的資源清單。指定的目標資源將決定原則適用於哪些工作負載。

目前,支援以下資源附加類型

  • kind: Gateway,其 group: gateway.networking.k8s.io 在同一命名空間中。
  • kind: Service,其 group: ""group: "core" 在同一命名空間中。此類型僅支援航點。

如果未設定,則會依照選擇器的定義應用原則。最多可以設定選擇器和 targetRefs 中的一個。

注意:如果您在 Istio 1.22 之前的版本的多版本環境中使用 targetRefs 欄位,強烈建議您透過 istio.io/rev 標籤將原則釘選到執行 1.22+ 的修訂版本。這是為了防止連線到較舊控制平面的代理程式(不知道 targetRefs 欄位)在升級過程中將原則誤解為整個命名空間範圍。

注意:航點代理程式需要使用此欄位才能應用原則;selector 原則將被忽略。

rulesRule[]

選用。用於比對請求的規則清單。當至少有一個規則與請求匹配時,就會發生匹配。

如果未設定,則永遠不會發生匹配。如果 action 為 ALLOW,則相當於為目標工作負載設定預設拒絕。

actionAction

選用。如果請求與規則匹配,則要採取的動作。如果未指定,預設為 ALLOW。

providerExtensionProvider (oneof)

指定 CUSTOM 動作的詳細配置。必須僅與 CUSTOM 動作搭配使用。

規則

規則會比對來自來源清單的請求,這些來源會根據條件清單執行操作。當至少一個來源、一個操作和所有條件與請求匹配時,就會發生匹配。空規則始終會匹配。

規則中的任何字串欄位都支援完全比對、前綴比對、後綴比對和存在比對

  • 完全比對:abc 將比對值 abc
  • 前綴比對:abc* 將比對值 abcabcd
  • 後綴比對:*abc 將比對值 abcxabc
  • 存在比對:當值不為空時,* 將會比對。
欄位類型描述必要
fromFrom[]

選用。from 指定請求的來源。

如果未設定,則允許任何來源。

toTo[]

選用。to 指定請求的操作。

如果未設定,則允許任何操作。

whenCondition[]

選用。when 指定請求的其他條件清單。

如果未設定,則允許任何條件。

來源

來源指定請求的來源身分。來源中的欄位會以 AND 運算結合。

例如,如果主體是 admindev,且命名空間是 prodtest,且 IP 不是 203.0.113.4,則以下來源會匹配。

principals: ["admin", "dev"]
namespaces: ["prod", "test"]
notIpBlocks: ["203.0.113.4"]
欄位類型描述必要
principalsstring[]

選用。從同層憑證衍生的同層身分清單。同層身分的格式為 "<TRUST_DOMAIN>/ns/<NAMESPACE>/sa/<SERVICE_ACCOUNT>",例如,"cluster.local/ns/default/sa/productpage"。此欄位需要啟用 mTLS,且與 source.principal 屬性相同。

如果未設定,則允許任何主體。

notPrincipalsstring[]

選用。同層身分的負面比對清單。

requestPrincipalsstring[]

選用。從 JWT 衍生的請求身分清單。請求身分的格式為 "<ISS>/<SUB>",例如,"example.com/sub-1"。此欄位需要啟用請求驗證,且與 request.auth.principal 屬性相同。

如果未設定,則允許任何請求主體。

notRequestPrincipalsstring[]

選用。請求身分的負面比對清單。

namespacesstring[]

選用。從同層憑證衍生的命名空間清單。此欄位需要啟用 mTLS,且與 source.namespace 屬性相同。

如果未設定,則允許任何命名空間。

notNamespacesstring[]

選用。命名空間的負面比對清單。

ipBlocksstring[]

選用。從 IP 封包的來源位址填入的 IP 區塊清單。支援單一 IP(例如 203.0.113.4)和 CIDR(例如 203.0.113.0/24)。這與 source.ip 屬性相同。

如果未設定,則允許任何 IP。

notIpBlocksstring[]

選用。IP 區塊的負面比對清單。

remoteIpBlocksstring[]

選用。從 X-Forwarded-For 標頭或 Proxy Protocol 填入的 IP 區塊清單。若要使用此欄位,您必須在安裝 Istio 時,或在入口閘道上使用註解,設定 meshConfig 底下的 gatewayTopologynumTrustedProxies 欄位。請參閱此處的文件:設定閘道網路拓撲。支援單一 IP(例如 203.0.113.4)和 CIDR(例如 203.0.113.0/24)。這與 remote.ip 屬性相同。

如果未設定,則允許任何 IP。

notRemoteIpBlocksstring[]

選用。遠端 IP 區塊的負面比對清單。

操作

操作指定請求的操作。操作中的欄位會以 AND 運算結合。

例如,如果主機具有後綴 .example.com,且方法為 GETHEAD,且路徑沒有前綴 /admin,則以下操作會匹配。

hosts: ["*.example.com"]
methods: ["GET", "HEAD"]
notPaths: ["/admin*"]
欄位類型描述必要
hostsstring[]

選用。HTTP 請求中指定的主機清單。比對不區分大小寫。請參閱安全最佳實務,以了解此欄位的建議用法。

如果未設定,則允許任何主機。必須僅與 HTTP 一起使用。

notHostsstring[]

選用。HTTP 請求中指定的主機的負面比對清單。比對不區分大小寫。

portsstring[]

選用。連線中指定的連接埠清單。

如果未設定,則允許任何連接埠。

notPortsstring[]

選用。連線中指定的連接埠的負面比對清單。

methodsstring[]

選用。HTTP 請求中指定的方法清單。對於 gRPC 服務,這將始終是 POST

如果未設定,則允許任何方法。必須僅與 HTTP 一起使用。

notMethodsstring[]

選用。HTTP 請求中指定的方法的負面比對清單。

pathsstring[]

選用。HTTP 請求中指定的路徑清單。請參閱授權原則正規化以了解路徑正規化的詳細資訊。對於 gRPC 服務,這將是 /package.service/method 形式的完整名稱。

如果清單中的路徑包含 {*}{**} 路徑範本運算子,則會將其解譯為 Envoy Uri 範本。若要成為有效的路徑範本,路徑不得在受支援的運算子之外包含 *{}。路徑範本運算子的路徑區段中不允許使用其他字元。

  • {*} 比對無法延伸超過路徑區段的單一 glob。
  • {**} 比對零個或多個 glob。如果路徑包含 {**},則它必須是最後一個運算子。

範例

  • /foo/{*} 比對 /foo/bar,但不比對 /foo/bar/baz
  • /foo/{**}/ 比對 /foo/bar//foo/bar/baz.txt/foo//,但不比對 /foo/bar
  • /foo/{*}/bar/{**} 比對 /foo/buzz/bar//foo/buzz/bar/baz
  • /*/baz/{*} 不是有效的路徑範本,因為它在受支援的運算子之外包含 *
  • /**/baz/{*} 不是有效的路徑範本,因為它在受支援的運算子之外包含 **
  • /{**}/foo/{*} 不是有效的路徑範本,因為 {**} 不是最後一個運算子
  • /foo/{*}.txt 無效,因為路徑區段中有 {*} 以外的字元

如果未設定,則允許任何路徑。必須僅與 HTTP 一起使用。

notPathsstring[]

選用。路徑的負面比對清單。

條件

條件指定其他必要的屬性。

欄位類型描述必要
keystring

Istio 屬性的名稱。請參閱支援的完整屬性清單

valuesstring[]

選填。屬性允許值的列表。注意:必須設定 valuesnotValues 其中至少一個。

notValuesstring[]

選填。屬性的負向比對值列表。注意:必須設定 valuesnotValues 其中至少一個。

AuthorizationPolicy.ExtensionProvider

欄位類型描述必要
namestring

指定擴展提供者的名稱。可用提供者的列表在 MeshConfig 中定義。注意,目前每個工作負載最多允許 1 個擴展提供者。不同的工作負載可以使用不同的擴展提供者。

Rule.From

From 包含來源列表。

欄位類型描述必要
source來源

Source 指定請求的來源。

Rule.To

To 包含操作列表。

欄位類型描述必要
operation操作

Operation 指定請求的操作。

AuthorizationPolicy.Action

Action 指定要執行的操作。

Name描述
ALLOW

僅在符合規則時允許請求。這是預設類型。

DENY

如果請求符合任何規則,則拒絕該請求。

AUDIT

如果請求符合任何規則,則稽核該請求。

CUSTOM

如果符合的規則評估為 true,則 CUSTOM 動作允許擴展處理使用者請求。擴展會獨立且在原生 ALLOW 和 DENY 動作之前評估。當一起使用時,只有在所有動作都回傳允許時,才允許請求,換句話說,擴展不能繞過 ALLOW 和 DENY 動作做出的授權決定。擴展的行為由 MeshConfig 中宣告的具名提供者定義。授權策略透過指定提供者的名稱來引用擴展。擴展的一個範例用途是與自訂的外部授權系統整合,將授權決定委派給它。

以下授權策略適用於入口閘道,如果請求路徑具有前綴 /admin/,則將授權檢查委派給名為 my-custom-authz 的擴展。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: ext-authz
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: istio-ingressgateway
  action: CUSTOM
  provider:
    name: "my-custom-authz"
  rules:
  - to:
    - operation:
        paths: ["/admin/*"]
這個資訊對您有幫助嗎?
您是否有任何改進建議?

感謝您的回饋!