將 pre-Istio 1.4 Alpha 安全策略遷移至目前的 API
本教學課程旨在協助客戶將已棄用的 v1alpha1 安全策略遷移至受支援的 v1beta1 版本。
在 Istio 1.4 之前的版本中,安全策略是使用 v1alpha1
API(MeshPolicy
、Policy
、ClusterRbacConfig
、ServiceRole
和 ServiceRoleBinding
)進行設定。在諮詢過我們的早期採用者後,我們對策略系統進行了重大改進,並隨 Istio 1.4 發布了 v1beta1
API。這些更新後的 API(PeerAuthentication
、RequestAuthentication
和 AuthorizationPolicy
)有助於標準化我們在 Istio 中定義策略目標的方式,協助使用者了解策略的應用位置,並減少所需的設定物件數量。
舊的 API 在 Istio 1.4 中被棄用。在引入 v1beta1
API 的兩個版本後,Istio 1.6 取消了對 v1alpha1
API 的支援。
如果您使用的是 1.6 之前的 Istio 版本,並且想要升級,則必須將您的 alpha 安全策略物件遷移至 beta API。本教學課程將協助您完成遷移。
概述
您的控制平面必須先升級到支援 v1beta1
安全策略的版本。
建議先升級到 Istio 1.5 作為過渡版本,因為它是唯一同時支援 v1alpha1
和 v1beta1
安全策略的版本。您將在 Istio 1.5 中完成安全策略遷移,移除 v1alpha1
安全策略,然後繼續升級到較新的 Istio 版本。對於給定的工作負載,v1beta1
版本將優先於 v1alpha1
版本。
或者,如果您想直接從 Istio 1.4 跳級升級到 1.6 或更新版本,您應該使用金絲雀升級方法,將新的 Istio 版本安裝為單獨的控制平面,並逐步將您的工作負載遷移到新的控制平面,同時完成安全策略遷移。
無論如何,建議使用命名空間粒度進行遷移:對於每個命名空間,找出所有對該命名空間中的工作負載產生影響的 v1alpha1
策略,並同時將所有策略遷移到 v1beta1
。這可以實現更安全的遷移,因為您可以確保一切都按預期工作,然後再繼續處理下一個命名空間。
主要差異
在開始遷移之前,請閱讀 v1beta1
的身份驗證和授權文件,以了解 v1beta1
策略。
您應該檢查所有現有的 v1alpha1
安全策略,找出使用了哪些欄位以及哪些策略需要遷移,將結果與下面列出的主要差異進行比較,並確認沒有任何阻礙問題(例如,使用 beta 版本中不再支援的 alpha 功能)
主要差異 | v1alpha1 | v1beta1 |
---|---|---|
API 穩定性 | 不向後相容 | 向後相容 |
mTLS | MeshPolicy 和 Policy | PeerAuthentication |
JWT | MeshPolicy 和 Policy | RequestAuthentication |
授權 | ClusterRbacConfig 、ServiceRole 和 ServiceRoleBinding | AuthorizationPolicy |
策略目標 | 基於服務名稱 | 基於工作負載選擇器 |
連接埠號碼 | 服務連接埠 | 工作負載連接埠 |
雖然 v1beta1
安全策略中的 RequestAuthentication
與 v1alpha1
JWT 策略類似,但語義發生了顯著變化。v1alpha1
JWT 策略需要遷移到兩個 v1beta1
資源:RequestAuthentication
和 AuthorizationPolicy
。由於使用 AuthorizationPolicy
,這將更改 JWT 拒絕訊息。在 alpha 版本中,會傳回 HTTP 程式碼 401,並帶有訊息本文 Origin authentication failed
。在 beta 版本中,會傳回 HTTP 程式碼 403,並帶有訊息本文 RBAC: access denied
。
v1alpha1
JWT 策略的 triggerRule
欄位由 AuthorizationPolicy
取代,但 regex
欄位不再受支援。
遷移流程
本節詳細說明如何遷移 v1alpha1
安全策略。
步驟 1:尋找相關策略
對於每個命名空間,尋找所有對該命名空間中的工作負載產生影響的 v1alpha1
安全策略。結果可能包括
- 一個適用於網格中所有服務的單一
MeshPolicy
; - 一個適用於命名空間中所有工作負載的單一命名空間級別
Policy
; - 多個適用於命名空間中選定服務的服務級別
Policy
物件; - 一個在整個命名空間或命名空間中的某些服務上啟用 RBAC 的單一
ClusterRbacConfig
; - 多個適用於命名空間中所有服務的命名空間級別
ServiceRole
和ServiceRoleBinding
物件; - 多個適用於命名空間中選定服務的服務級別
ServiceRole
和ServiceRoleBinding
物件;
步驟 2:將服務名稱轉換為工作負載選擇器
v1alpha1
策略使用服務名稱選擇目標。您應該參考相應的服務定義,以確定應該在 v1beta1
策略中使用的工作負載選擇器。
單一 v1alpha1
策略可能包含多個服務。它需要遷移到多個 v1beta1
策略,因為 v1beta1
策略目前每個策略最多僅支援一個工作負載選擇器。
另請注意,v1alpha1
策略使用服務連接埠,而 v1beta1
策略使用工作負載連接埠。這表示遷移的 v1beta1
策略中的連接埠號碼可能不同。
步驟 3:遷移身份驗證策略
對於每個 v1alpha1
身份驗證策略,請按照下列規則進行遷移
如果整個命名空間都啟用 mTLS 或 JWT,請建立沒有工作負載選擇器的
PeerAuthentication
、RequestAuthentication
和AuthorizationPolicy
,以適用於整個命名空間。根據命名空間的相應MeshPolicy
或Policy
的語義填寫策略。如果工作負載啟用 mTLS 或 JWT,請建立具有對應工作負載選擇器的
PeerAuthentication
、RequestAuthentication
和AuthorizationPolicy
,以適用於該工作負載。根據工作負載的相應MeshPolicy
或Policy
的語義填寫策略。對於 mTLS 相關設定,如果 alpha 策略使用
STRICT
,則使用STRICT
模式,否則在所有其他情況下都使用PERMISSIVE
。對於 JWT 相關設定,請參閱
最終使用者身份驗證
文件,以了解如何遷移到RequestAuthentication
和AuthorizationPolicy
。
提供了一個安全策略遷移工具,可自動遷移身份驗證策略。請參閱該工具的 README 以了解其使用方式。
步驟 4:遷移 RBAC 策略
對於每個 v1alpha1
RBAC 策略,請按照下列規則進行遷移
如果整個命名空間都啟用 RBAC,請建立一個沒有工作負載選擇器的
AuthorizationPolicy
,以適用於整個命名空間。新增一個空規則,使其預設會拒絕所有對命名空間的請求。如果工作負載啟用 RBAC,請建立一個具有對應工作負載選擇器的
AuthorizationPolicy
,以適用於該工作負載。根據工作負載的相應ServiceRole
和ServiceRoleBinding
的語義新增規則。
步驟 5:驗證遷移後的策略
仔細檢查遷移後的
v1beta1
策略:確保沒有重複名稱的策略,正確指定命名空間,並且已遷移給定命名空間的所有v1alpha1
策略。使用命令
kubectl apply --dry-run=server -f beta-policy.yaml
試執行v1beta1
策略,以確保其有效。將
v1beta1
策略套用至給定的命名空間,並密切監控其效果。如果使用 JWT 或授權,請務必測試允許和拒絕情境。遷移下一個命名空間。僅在成功完成所有命名空間的遷移後才移除
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 或更高版本。