將 pre-Istio 1.4 Alpha 安全策略遷移至目前的 API

本教學課程旨在協助客戶將已棄用的 v1alpha1 安全策略遷移至受支援的 v1beta1 版本。

2021 年 3 月 3 日 | 作者:Yangmin Zhu - Google、Craig Box - Google

在 Istio 1.4 之前的版本中,安全策略是使用 v1alpha1 API(MeshPolicyPolicyClusterRbacConfigServiceRoleServiceRoleBinding)進行設定。在諮詢過我們的早期採用者後,我們對策略系統進行了重大改進,並隨 Istio 1.4 發布了 v1beta1 API。這些更新後的 API(PeerAuthenticationRequestAuthenticationAuthorizationPolicy)有助於標準化我們在 Istio 中定義策略目標的方式,協助使用者了解策略的應用位置,並減少所需的設定物件數量。

舊的 API 在 Istio 1.4 中被棄用。在引入 v1beta1 API 的兩個版本後,Istio 1.6 取消了對 v1alpha1 API 的支援。

如果您使用的是 1.6 之前的 Istio 版本,並且想要升級,則必須將您的 alpha 安全策略物件遷移至 beta API。本教學課程將協助您完成遷移。

概述

您的控制平面必須先升級到支援 v1beta1 安全策略的版本。

建議先升級到 Istio 1.5 作為過渡版本,因為它是唯一同時支援 v1alpha1v1beta1 安全策略的版本。您將在 Istio 1.5 中完成安全策略遷移,移除 v1alpha1 安全策略,然後繼續升級到較新的 Istio 版本。對於給定的工作負載,v1beta1 版本將優先於 v1alpha1 版本。

或者,如果您想直接從 Istio 1.4 跳級升級到 1.6 或更新版本,您應該使用金絲雀升級方法,將新的 Istio 版本安裝為單獨的控制平面,並逐步將您的工作負載遷移到新的控制平面,同時完成安全策略遷移。

無論如何,建議使用命名空間粒度進行遷移:對於每個命名空間,找出所有對該命名空間中的工作負載產生影響的 v1alpha1 策略,並同時將所有策略遷移到 v1beta1。這可以實現更安全的遷移,因為您可以確保一切都按預期工作,然後再繼續處理下一個命名空間。

主要差異

在開始遷移之前,請閱讀 v1beta1身份驗證授權文件,以了解 v1beta1 策略。

您應該檢查所有現有的 v1alpha1 安全策略,找出使用了哪些欄位以及哪些策略需要遷移,將結果與下面列出的主要差異進行比較,並確認沒有任何阻礙問題(例如,使用 beta 版本中不再支援的 alpha 功能)

主要差異v1alpha1v1beta1
API 穩定性不向後相容向後相容
mTLSMeshPolicyPolicyPeerAuthentication
JWTMeshPolicyPolicyRequestAuthentication
授權ClusterRbacConfigServiceRoleServiceRoleBindingAuthorizationPolicy
策略目標基於服務名稱基於工作負載選擇器
連接埠號碼服務連接埠工作負載連接埠

雖然 v1beta1 安全策略中的 RequestAuthenticationv1alpha1 JWT 策略類似,但語義發生了顯著變化。v1alpha1 JWT 策略需要遷移到兩個 v1beta1 資源:RequestAuthenticationAuthorizationPolicy。由於使用 AuthorizationPolicy,這將更改 JWT 拒絕訊息。在 alpha 版本中,會傳回 HTTP 程式碼 401,並帶有訊息本文 Origin authentication failed。在 beta 版本中,會傳回 HTTP 程式碼 403,並帶有訊息本文 RBAC: access denied

v1alpha1 JWT 策略的 triggerRule 欄位AuthorizationPolicy 取代,但 regex 欄位不再受支援。

遷移流程

本節詳細說明如何遷移 v1alpha1 安全策略。

對於每個命名空間,尋找所有對該命名空間中的工作負載產生影響的 v1alpha1 安全策略。結果可能包括

步驟 2:將服務名稱轉換為工作負載選擇器

v1alpha1 策略使用服務名稱選擇目標。您應該參考相應的服務定義,以確定應該在 v1beta1 策略中使用的工作負載選擇器。

單一 v1alpha1 策略可能包含多個服務。它需要遷移到多個 v1beta1 策略,因為 v1beta1 策略目前每個策略最多僅支援一個工作負載選擇器。

另請注意,v1alpha1 策略使用服務連接埠,而 v1beta1 策略使用工作負載連接埠。這表示遷移的 v1beta1 策略中的連接埠號碼可能不同。

步驟 3:遷移身份驗證策略

對於每個 v1alpha1 身份驗證策略,請按照下列規則進行遷移

  1. 如果整個命名空間都啟用 mTLS 或 JWT,請建立沒有工作負載選擇器的 PeerAuthenticationRequestAuthenticationAuthorizationPolicy,以適用於整個命名空間。根據命名空間的相應 MeshPolicyPolicy 的語義填寫策略。

  2. 如果工作負載啟用 mTLS 或 JWT,請建立具有對應工作負載選擇器的 PeerAuthenticationRequestAuthenticationAuthorizationPolicy,以適用於該工作負載。根據工作負載的相應 MeshPolicyPolicy 的語義填寫策略。

  3. 對於 mTLS 相關設定,如果 alpha 策略使用 STRICT,則使用 STRICT 模式,否則在所有其他情況下都使用 PERMISSIVE

  4. 對於 JWT 相關設定,請參閱最終使用者身份驗證文件,以了解如何遷移到 RequestAuthenticationAuthorizationPolicy

提供了一個安全策略遷移工具,可自動遷移身份驗證策略。請參閱該工具的 README 以了解其使用方式。

步驟 4:遷移 RBAC 策略

對於每個 v1alpha1 RBAC 策略,請按照下列規則進行遷移

  1. 如果整個命名空間都啟用 RBAC,請建立一個沒有工作負載選擇器的 AuthorizationPolicy,以適用於整個命名空間。新增一個空規則,使其預設會拒絕所有對命名空間的請求。

  2. 如果工作負載啟用 RBAC,請建立一個具有對應工作負載選擇器的 AuthorizationPolicy,以適用於該工作負載。根據工作負載的相應 ServiceRoleServiceRoleBinding 的語義新增規則。

步驟 5:驗證遷移後的策略

  1. 仔細檢查遷移後的 v1beta1 策略:確保沒有重複名稱的策略,正確指定命名空間,並且已遷移給定命名空間的所有 v1alpha1 策略。

  2. 使用命令 kubectl apply --dry-run=server -f beta-policy.yaml 試執行 v1beta1 策略,以確保其有效。

  3. v1beta1 策略套用至給定的命名空間,並密切監控其效果。如果使用 JWT 或授權,請務必測試允許和拒絕情境。

  4. 遷移下一個命名空間。僅在成功完成所有命名空間的遷移後才移除 v1alpha1 策略。

範例

v1alpha1 策略

本節提供一個完整範例,展示如何遷移命名空間 foo。假設命名空間 foo 具有以下會影響其中工作負載的 v1alpha1 策略

# A MeshPolicy that enables mTLS globally, including the whole foo namespace
apiVersion: "authentication.istio.io/v1alpha1"
kind: "MeshPolicy"
metadata:
  name: "default"
spec:
  peers:
  - mtls: {}
---
# A Policy that enables mTLS permissive mode and enables JWT for the httpbin service on port 8000
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
  name: httpbin
  namespace: foo
spec:
  targets:
  - name: httpbin
    ports:
    - number: 8000
  peers:
  - mtls:
      mode: PERMISSIVE
  origins:
  - jwt:
      issuer: testing@example.com
      jwksUri: https://www.example.com/jwks.json
      triggerRules:
      - includedPaths:
        - prefix: /admin/
        excludedPaths:
        - exact: /admin/status
  principalBinding: USE_ORIGIN
---
# A ClusterRbacConfig that enables RBAC globally, including the foo namespace
apiVersion: "rbac.istio.io/v1alpha1"
kind: ClusterRbacConfig
metadata:
  name: default
spec:
  mode: 'ON'
---
# A ServiceRole that enables RBAC for the httpbin service
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: httpbin
  namespace: foo
spec:
  rules:
  - services: ["httpbin.foo.svc.cluster.local"]
    methods: ["GET"]
---
# A ServiceRoleBinding for the above ServiceRole
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: httpbin
  namespace: foo
spec:
  subjects:
  - user: cluster.local/ns/foo/sa/sleep
    roleRef:
      kind: ServiceRole
      name: httpbin

httpbin 服務

httpbin 服務具有以下定義

apiVersion: v1
kind: Service
metadata:
  name: httpbin
  namespace: foo
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin

這表示服務名稱 httpbin 應替換為工作負載選擇器 app: httpbin,而服務埠 8000 應替換為工作負載埠 80。

v1beta1 驗證策略

以下列出在 foo 命名空間中,已遷移的 v1beta1 策略,對應於 v1alpha1 驗證策略。

# A PeerAuthentication that enables mTLS for the foo namespace, migrated from the MeshPolicy
# Alternatively the MeshPolicy could also be migrated to a PeerAuthentication at mesh level
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: foo
spec:
  mtls:
    mode: STRICT
---
# A PeerAuthentication that enables mTLS for the httpbin workload, migrated from the Policy
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  # port level mtls set for the workload port 80 corresponding to the service port 8000
  portLevelMtls:
    80:
      mode: PERMISSIVE
--
# A RequestAuthentication that enables JWT for the httpbin workload, migrated from the Policy
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
  jwtRules:
  - issuer: testing@example.com
    jwksUri: https://www.example.com/jwks.json
---
# An AuthorizationPolicy that enforces to require JWT validation for the httpbin workload, migrated from the Policy
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: httpbin-jwt
  namespace: foo
spec:
  # Use DENY action to explicitly deny requests without JWT token
  action: DENY
  selector:
    matchLabels:
      app: httpbin
  rules:
  - from:
    - source:
        # This makes sure requests without JWT token will be denied
        notRequestPrincipals: ["*"]
    to:
    - operation:
        # This should be the workload port 80, not the service port 8000
        ports: ["80"]
        # The path and notPath is converted from the trigger rule in the Policy
        paths: ["/admin/*"]
        notPaths: ["/admin/status"]

v1beta1 授權策略

以下列出在 foo 命名空間中,已遷移的 v1beta1 策略,對應於 v1alpha1 RBAC 策略。

# An AuthorizationPolicy that denies by default, migrated from the ClusterRbacConfig
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: default
  namespace: foo
spec:
  # An empty rule that allows nothing
  {}
---
# An AuthorizationPolicy that enforces to authorization for the httpbin workload, migrated from the ServiceRole and ServiceRoleBinding
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    matchLabels:
      app: httpbin
      version: v1
  action: ALLOW
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/foo/sa/sleep"]
    to:
    - operation:
        methods: ["GET"]

完成升級

恭喜!到這裡,您應該只剩下 v1beta1 策略物件,並且可以繼續將 Istio 升級到 1.6 或更高版本。

分享此貼文