237. GCP IAM綁GKE的RBAC
WHY
要弄個小程式定時撈secret的資料出來,
但叢集是舊的沒有開啟workload Identity,
也只能掛IAM的service account了。
只給予Kubernetes Engine Viewer
的權限,
但要撈secret時,會通知缺乏container.secrets.get
的權限。
Solution
- 檢查Kubernetes Engine Viewer有哪些權限
另一種透過指令的方式,參考上圖中的role將值帶入到下面指令。
gcloud iam roles describe roles/container.viewer
(我很想吐槽,我怎麼知道這個名稱要用哪個role去查啊,還不是要去網頁看)
ref. 查看 IAM 角色授予的權限
查完的結果是真的缺乏 container.secrets.get
的權限。
那現在的問題是,要怎麼加權限?
- 釐清認證方式
Google 文件說明
您可以使用 IAM 和 Kubernetes RBAC 來控制對 GKE 叢集的存取權:
-
IAM 並非特定於 Kubernetes;它為多種 Google Cloud 產品提供身份管理,並且主要在 Google Cloud 項目級層運行。
-
Kubernetes RBAC 是 Kubernetes 的核心組成部分,可讓您針對叢集內的任何對象或對象類型建立和授予角色(一組權限)。
-
為了授權操作,GKE 首先會檢查是否存在 RBAC 政策。如果不存在 RBAC 政策,GKE 會檢查 IAM 權限。
在 GKE 中,IAM 和 Kubernetes RBAC 整合在一起,您可以通過任一工具向使用者授權,使其有足夠的權限執行操作。這對於 GKE 叢集的引導過程至關重要,因為默認情況下,Google Cloud 使用者不具有任何 Kubernetes RBAC RoleBindings。
所以說預設的角色權限就是那些,要針對角色加權限的話只能自己新增了。
- 新增RBAC權限
ClusterRoleBinding 使用 kind: user,綁定IAM的帳號。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: secret-reader-binding
subjects:
- kind: User # 或者 ServiceAccount 根據具體的需求
name: get-api@project.iam.gserviceaccount.com # 替換成具體的使用者或服務帳號名稱
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
- 驗證方式
綁完後,可使用指令看看能不能正常讀取。
kc auth can-i get secret iplc-test-com-tls \
-o=jsonpath='{.data.tls\.crt}' \
--as get-api@project.iam.gserviceaccount.com
可讀取會顯示 Yes,否則就是 No
ref. Checking API access