設定檔適用性:等級 1
建立並使用最低權限的服務帳戶來運行 GKE 叢集節點,而不是使用 Compute Engine 的預設服務帳戶。在節點遭到入侵的情況下,不必要的權限可能會被濫用。
GCP 服務帳戶(不同於 Kubernetes ServiceAccount)是一種身份,實例或應用程式可以用來執行 GCP API 請求。此身份用於識別虛擬機器實例與其他
Google 雲端平台服務。預設情況下,Kubernetes 引擎節點使用 Compute Engine 預設服務帳戶。此帳戶預設具有廣泛的存取權限,這些權限由存取範圍定義,使其對
VM 上的各種應用程式都很有用,但它擁有的權限超過了運行您的 Kubernetes 引擎叢集所需的權限。
應建立並使用最低權限的服務帳戶來運行 Kubernetes 引擎叢集,而不是使用 Compute Engine 的預設服務帳戶,並為每個 Kubernetes 工作負載建立獨立的服務帳戶(請參閱建議
5.2.2)。
Kubernetes Engine 至少需要節點服務帳戶擁有
monitoring.viewer、monitoring.metricWriter 和 logging.logWriter 角色。可能需要為節點添加其他角色以從 GCR 拉取映像。
注意預設情況下,當您建立新叢集時,節點會使用 Compute Engine 的預設服務帳戶。
|
影響
實例會自動獲得範圍,以允許完全訪問所有 Google 雲端 API。這樣一來,實例的 IAM 權限就完全由服務帳戶的 IAM 角色決定。因此,如果 Kubernetes
工作負載使用叢集訪問範圍來執行使用 Google API 的操作,若未獲得服務帳戶的權限許可,可能將無法再執行。要解決此問題,請遵循建議 5.2.2。
此處列出的服務帳戶角色是運行叢集所需的最低要求。若要從 Google Container Registry (GCR) 的私人實例中提取,可能需要額外的角色。
稽核
使用 Google 雲端主控台:
- 前往Kubernetes Engine 網站。
- 選擇正在測試的叢集,並點擊每個節點池以顯示節點池詳細資訊頁面。確保在每個節點池的安全性標題下,服務帳戶未設為預設值。
要檢查分配給服務帳戶的權限是否為叢集運行所需的最低限度:
- 前往IAM 網站。
- 從服務帳戶列表中,確保每個叢集服務帳戶僅具有以下角色:
- 日誌撰寫器
- 監控指標寫入器
- 監控檢視器
使用命令列:
要檢查現有叢集設定的服務帳戶,請執行以下命令:
gcloud container node-pools describe $NODE_POOL --cluster $CLUSTER_NAME --zone $COMPUTE_ZONE --format json | jq '.config.serviceAccount'
如果使用預設服務帳戶進行專案存取,上述命令的輸出將返回預設值。
要檢查分配給服務帳戶的權限是否為叢集運作所需的最低限度:
gcloud projects get-iam-policy <project_id> \
--flatten="bindings[].members" \
--format='table(bindings.role)' \
--filter="bindings.members:<service_account>"
檢查輸出以確保服務帳戶僅具有運行叢集所需的角色:
roles/logging.logWriterroles/monitoring.metricWriterroles/monitoring.viewer
補救
使用 Google 雲端主控台:
建立最低權限的服務帳戶:
- 前往服務帳戶網站。
- 點擊
CREATE SERVICE ACCOUNT。 - 輸入服務帳戶詳細資訊。
- 點擊
CREATE AND CONTINUE。 - 在服務帳戶權限中新增以下角色:
Logs WriterMonitoring Metric WriterMonitoring Viewer
- 點擊繼續。
- 授予用戶訪問此服務帳戶的權限,並根據需要創建金鑰。
- 點擊完成。
要建立一個節點池以使用服務帳戶:
- 前往 Kubernetes Engine 網站。
- 點擊將啟動節點池的叢集名稱。
- 點擊
ADD NODE POOL。 - 在節點池詳細資訊中,選擇
Security子標題,然後在 `Identity defaults` 下,從服務帳戶下拉選單中選擇最低權限的服務帳戶。 - 點擊
CREATE以啟動節點池。
注意工作負載需要遷移到新的節點池,並刪除使用預設服務帳戶的舊節點池,以完成修復。
|
使用命令列:
建立最低權限的服務帳戶:
gcloud iam service-accounts create <node_sa_name> --display-name "GKE Node Service Account" export NODE_SA_EMAIL=gcloud iam service-accounts list --format='value(email)' --filter='displayName:GKE Node Service Account'
將以下角色授予服務帳戶:
export PROJECT_ID=gcloud config get-value project gcloud projects add-iam-policy-binding <project_id> --member serviceAccount:<node_sa_email> --role roles/monitoring.metricWriter gcloud projects add-iam-policy-binding <project_id> --member serviceAccount:<node_sa_email> --role roles/monitoring.viewer gcloud projects add-iam-policy-binding <project_id> --member serviceAccount:<node_sa_email> --role roles/logging.logWriter
要使用服務帳戶建立新的節點池,請執行以下命令:
gcloud container node-pools create <node_pool> --service- account=<sa_name>@<project_id>.iam.gserviceaccount.com-- cluster=<cluster_name> --zone <compute_zone>
注意工作負載需要遷移到新的節點池,並刪除使用預設服務帳戶的舊節點池,以完成修復。
|
