檢視次數:
設定檔適用性:級別 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.viewermonitoring.metricWriterlogging.logWriter 角色。可能需要為節點添加其他角色以從 GCR 拉取映像。
注意
注意
預設情況下,當您建立新的叢集時,節點會使用 Compute Engine 預設服務帳戶。

影響

實例會自動授予範圍以允許完全訪問所有 Google 雲端 API。這樣一來,實例的 IAM 權限完全由服務帳戶的 IAM 角色決定。因此,如果 Kubernetes 工作負載使用叢集訪問範圍來執行使用 Google API 的操作,則可能無法再執行,除非服務帳戶的權限允許。要修正此問題,請遵循建議 5.2.2。
此處列出的服務帳戶角色是運行叢集所需的最低要求。從 Google Container Registry (GCR) 的私人實例中提取可能需要額外的角色。

稽核

使用 Google 雲端主控台:
  1. 前往Kubernetes Engine 網站
  2. 選擇正在測試的叢集,然後點擊每個節點池以打開節點池詳細資訊頁面。確保在每個節點池的安全性標題下,服務帳戶未設為預設。
檢查分配給服務帳戶的權限是否為叢集運行所需的最低限度:
  1. 前往IAM 網站
  2. 從服務帳戶列表中,確保每個叢集服務帳戶僅具有以下角色:
    • 日誌撰寫器
    • 監控指標寫入器
    • 監控檢視器
使用命令列:
要檢查現有叢集設定的服務帳戶,請執行以下命令:
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.logWriter
  • roles/monitoring.metricWriter
  • roles/monitoring.viewer

補救

使用 Google 雲端主控台:
要建立最低權限的服務帳戶:
  1. 前往服務帳戶網站
  2. 點擊CREATE SERVICE ACCOUNT
  3. 輸入服務帳戶詳細資訊。
  4. 點擊建立並繼續
  5. 在服務帳戶權限中添加以下角色:
    • 日誌寫入器
    • 監控指標寫入器
    • 監控檢視器
  6. 點擊繼續。
  7. 授予使用者存取此服務帳戶的權限,並根據需要建立金鑰。
  8. 點擊完成。
要建立節點池以使用服務帳戶:
  1. 前往Kubernetes Engine 網站
  2. 點擊要啟動節點池的叢集名稱。
  3. 點擊新增節點池
  4. 在節點池詳細資訊中,選擇安全性子標題,然後在`身份預設值`下,從服務帳戶下拉選單中選擇最低權限的服務帳戶。
  5. 點擊 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>
注意
注意
工作負載需要遷移到新的節點池,並刪除使用預設服務帳戶的舊節點池以完成修復。