設定檔適用性:等級 1
建立並使用最低權限的服務帳戶來運行 GKE 叢集節點,而不是使用 Compute Engine 的預設服務帳戶。在節點遭到入侵的情況下,不必要的權限可能會被濫用。
GCP 服務帳戶(不同於 Kubernetes ServiceAccount)是一個身份,實例或應用程式可以用來執行 GCP API 請求。此身份用於識別虛擬機器實例與其他
Google Cloud Platform 服務。預設情況下,Kubernetes Engine 節點使用 Compute Engine 的預設服務帳戶。
此帳戶預設具有廣泛的存取權限,這是由存取範圍定義的,使其對虛擬機器上的各種應用程式都很有用,但它擁有的權限超過運行您的 Kubernetes 引擎叢集所需的權限。
應建立並使用權限最小化的服務帳戶來運行 Kubernetes Engine 叢集,而不是使用 Compute Engine 的預設服務帳戶,並為每個 Kubernetes
工作負載建立獨立的服務帳戶(請參見建議 5.2.2)。
Kubernetes 引擎至少需要節點服務帳戶擁有
monitoring.viewer、monitoring.metricWriter 和 logging.logWriter 角色。可能需要為節點添加其他角色以從 GCR 拉取映像。
注意預設情況下,當您建立新叢集時,節點會使用 Compute Engine 的預設服務帳戶。
|
影響
實例會自動授予cloud-platform scope平台範圍,以允許完全訪問所有Google Cloud APIs。這樣一來,實例的IAM權限就完全由服務帳戶的IAM角色決定。
因此,如果 Kubernetes 工作負載使用叢集存取範圍來透過 Google API 執行操作,若未獲得服務帳戶權限的允許,可能將無法再執行。要解決此問題,請遵循建議
5.2.2。此處列出的服務帳戶角色是運行叢集所需的最低要求。
可能需要額外的角色才能從 Google Container Registry (GCR) 的私人實例中提取。
稽核
使用 Google Cloud 主控台:
- 前往 Google Cloud Console Kubernetes Engine 頁面 以訪問 Kubernetes Engine
- 選擇正在測試的叢集,然後點擊每個節點池以顯示節點池詳細資訊頁面。
確保在安全性標題下,每個節點池的服務帳戶未設為預設值。檢查分配給服務帳戶的權限是否為叢集運行所需的最低限度:
- 前往 Google Cloud Console IAM 頁面
- 從服務帳戶列表中,確保每個叢集服務帳戶僅具有以下角色:
- 日誌寫入器
- 監控指標寫入器
- 監控檢視器
使用命令行:
若要檢查現有的叢集,首先定義節點池、叢集名稱、位置資訊和專案的4個變數,然後執行以下命令:
gcloud container node-pools describe $NODE_POOL --cluster $CLUSTER_NAME -- location $LOCATION --project $PROJECT_ID --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 Cloud 主控台:
建立最低權限的服務帳戶:
- 前往服務帳戶,請造訪:Google Cloud Console 服務帳戶頁面。
- 點擊建立服務帳戶。
- 輸入服務帳戶詳細資訊。
- 點擊建立並繼續。
- 在服務帳戶權限中添加以下角色:
日誌撰寫器監控指標寫入器監控檢視器
- 點擊繼續。
- 授予使用者存取此服務帳戶的權限,並根據需要建立金鑰。
- 點擊完成。
要建立節點池以使用服務帳戶:
- 前往 Kubernetes Engine,請造訪:Google Cloud Console Kubernetes Engine 頁面。
- 點擊要啟動節點池的叢集名稱。
- 點擊新增節點池。
- 在節點池詳細資訊中,選擇安全性子標題,然後在身分識別預設值下,從服務帳戶下拉選單中選擇最低權限的服務帳戶。
- 點擊建立以啟動節點池。

注意
工作負載需要遷移到新的節點池,並刪除使用預設服務帳戶的舊節點池,以完成修復。
使用命令列:
建立最低權限的服務帳戶
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>
注意工作負載需要遷移到新的節點池,並刪除使用預設服務帳戶的舊節點池,以完成修復。
|
