保護叢集中繼資料

Google Kubernetes Engine (GKE) 會使用執行個體中繼資料設定節點虛擬機器 (VM),但部分中繼資料可能具有機密性,應避免在叢集上執行的工作負載存取。

事前準備

開始之前,請確認您已執行下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

設定節點服務帳戶

每個節點的服務帳戶憑證仍會向工作負載公開。根據預設,節點會使用 Compute Engine 預設服務帳戶。建議您為節點設定權限最小的服務帳戶,而非使用 Compute Engine 預設服務帳戶。接著,將這個服務帳戶附加至節點,這樣攻擊者就無法使用 Compute Engine API 直接存取基礎 VM 執行個體,規避 GKE 中繼資料保護措施。

詳情請參閱「使用最小權限節點服務帳戶」。

如要建立僅具備必要權限的節點服務帳戶,請按照下列步驟操作:

  1. 建立新的 Identity and Access Management (IAM) 服務帳戶,並將電子郵件地址儲存在環境變數中:

    gcloud iam service-accounts create NODE_SA_NAME \
        --display-name="DISPLAY_NAME"
    export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \
        --filter='displayName:DISPLAY_NAME')
    

    更改下列內容:

    • NODE_SA_NAME:新節點服務帳戶的名稱。
    • DISPLAY_NAME:新服務帳戶的顯示名稱。

    節點服務帳戶電子郵件地址的格式為 NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com。

  2. 為服務帳戶設定執行 GKE 節點所需的最低角色和權限:

    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
    

    將 PROJECT_ID 替換為 Google Cloud 專案 ID。

    此外,如果叢集從 Artifact Registry 提取私人映像檔,請新增 roles/artifactregistry.reader 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$NODE_SA_EMAIL \
        --role=roles/artifactregistry.reader
    

中繼資料隱藏功能

GKE 中繼資料隱藏功能可防止使用者 Pod 存取 kube-env (包含 kubelet 憑證) 和 VM 的執行個體身分權杖。

中繼資料隱藏功能會對從使用者 Pod (非在 HostNetwork 上執行的 Pod) 傳送至叢集中繼資料伺服器的流量設定防火牆,僅允許安全查詢。防火牆會防止使用者 Pod 使用 kubelet 憑證進行權限提升攻擊,或使用 VM 身分進行執行個體提升攻擊。

Workload Identity Federation for GKE 可取代中繼資料隱藏功能,並擴充中繼資料隱藏功能提供的保護措施。在任何情況下,您都應使用 Workload Identity Federation for GKE,而非中繼資料隱藏功能。詳情請參閱「關於 Workload Identity Federation for GKE」。

如要啟用中繼資料隱藏功能,請在 gcloud beta container clusters create 指令或 gcloud beta container node-pools create 指令中使用已淘汰的 --workload-metadata=SECURE 選項。

限制

中繼資料隱藏功能有下列限制:

  • 中繼資料隱藏功能只會保護 kube-env 的存取權和節點的執行個體身分權杖。
  • 中繼資料隱藏功能無法限制對於節點服務帳戶的存取權。
  • 中繼資料隱藏功能無法限制對於其他相關執行個體中繼資料的存取權。
  • 中繼資料隱藏功能無法限制對於其他舊版中繼資料 API 的存取權。
  • 中繼資料隱藏功能不會限制在主機網路 (Pod 規格中的 hostNetwork: true) 上執行的 Pod 流量。

停用舊版中繼資料 API 並改用新版

v0.1 和 v1beta1 Compute Engine 中繼資料伺服器端點已於 2020 年 9 月 30 日淘汰並關閉。

如要瞭解停用時程,請參閱「v0.1 和 v1beta1 中繼資料伺服器端點淘汰」。

後續步驟