加密 etcd 和控制層開機磁碟


聯絡。

本頁面說明如何使用您在 Cloud Key Management Service (Cloud KMS) 中管理的金鑰,加密儲存在 Google Kubernetes Engine (GKE) 控制層中的資料。您應已熟悉 etcdGKE 叢集架構Cloud KMS 等概念。

本頁說明 GKE 中一組選用控制層功能,可讓您執行驗證控制層安全狀態等工作,或使用您管理的金鑰在控制層中設定加密和憑證簽署。詳情請參閱「關於 GKE 控制層授權」。

根據預設, Google Cloud 會對受管理控制層套用各種安全措施。 本頁說明選用功能,可協助您進一步瞭解或控管 GKE 控制層。

關於控制層開機磁碟和 etcd 加密

根據預設,GKE 會使用其管理的加密金鑰,加密控制平面節點的開機磁碟、儲存 etcd 資料的磁碟,以及 etcd 的 Google Cloud 內部 Google Cloud作業備份。如要進一步瞭解這項預設加密功能,請參閱預設靜態資料加密。您可以選擇使用您透過 Cloud KMS 管理的加密金鑰,加密這些資源。如要瞭解詳情,請參閱「控制層開機磁碟和 etcd 加密」。

您可以在 Cloud KMS 中建立金鑰,供 GKE 用於加密控制平面資源。建立這些資源時,請注意下列事項:

  • 您可以為叢集中的所有金鑰使用一個金鑰環,不論每個金鑰的用途為何。如果您有用於其他用途的現有金鑰環,例如設定自己的憑證授權單位,則可將該金鑰環用於本指南。
  • 建議您在與叢集相同的 Google Cloud 位置建立金鑰,以獲得更佳的延遲時間。
  • 在大多數情況下,您可以使用「軟體」Cloud KMS 金鑰防護等級。您也可以搭配 Cloud HSM 使用硬體金鑰。
  • 您必須指定 --purpose 標記和 encryption 值,因為這些金鑰用於對稱式加密。
  • 請勿修改金鑰刪除的預設時間長度

搭配其他 GKE 控制層授權功能使用

GKE 控制層授權提供下列與自管金鑰相關的功能,您必須在建立叢集時一併啟用:

您只能在建立新的 GKE 叢集時啟用這些功能。您無法更新現有叢集來使用這些功能。如要在同一個叢集中使用這兩項功能,請按照這兩份指南中的所有程序,設定金鑰和 CA,然後執行叢集建立指令,啟用這兩組功能,如「建立叢集」一節所述。

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。
  • 請確認金鑰專案中,有叢集的 Cloud KMS 金鑰環。您可以使用叢集位置中的任何現有金鑰環。如要建立新金鑰環,請參閱「建立金鑰環」。
  • Enable the Cloud Key Management Service API.

    Enable the API

識別專案

建議您使用個別的 Google Cloud 專案,如下所示:

  • 金鑰專案:包含所有金鑰。
  • 叢集專案:內含 GKE 叢集。

您可以選擇使用同一個專案來管理金鑰和 GKE 叢集,但建議您使用不同的專案,讓管理金鑰和加密作業的團隊與管理叢集的團隊分開。

必要角色和權限

如要取得執行自有加密金鑰所需的權限,請管理員授予下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

需求條件

叢集必須執行 GKE 1.31.1-gke.1846000 以上版本。

限制

  • 您只能在建立叢集時設定開機磁碟和 etcd 加密金鑰。
  • 如果是地區 Standard 模式叢集和 Autopilot 叢集,您建立叢集的區域必須有容量,才能在該區域的至少三個區域中,使用 Hyperdisk Balanced 的機密模式。

    如果是可用區 Standard 模式叢集,叢集可用區必須具備 Hyperdisk Balanced 容量。如需容量方面的協助,請與 Cloud Customer Care 團隊聯絡。

  • GKE 僅支援 Cloud KMS 金鑰。您無法使用其他 Kubernetes KMS 提供者或其他加密提供者。

  • 系統不支援 Cloud External Key Manager (Cloud EKM) 金鑰。

  • 您無法存取或操作 etcd 的 Google Cloud 內部 作業備份,這些備份僅供災難復原使用。

  • 系統不支援多區域金鑰環。您必須使用區域金鑰環。

  • 您可使用 GKE 控制層授權的區域和可用區,取決於是否要使用特定功能,如下所示:

    • 如要使用客戶管理的加密金鑰加密控制層開機磁碟,叢集必須位於下列其中一個區域:
      • asia-east1
      • asia-northeast1
      • asia-southeast1
      • europe-west1
      • europe-west4
      • us-central1
      • us-east1
      • us-east4
      • us-east5
      • us-south1
      • us-west1
      • us-west3
      • us-west4
    • 如要搭配使用機密 GKE 節點和 GKE 控制層授權,叢集必須位於支援 Hyperdisk Balanced 機密模式的區域

    如果您未使用這些功能,則可以在任何 Google Cloud 位置使用 GKE 控制層授權。

建立金鑰

在本節中,您將為控制層中的開機磁碟和 etcd 磁碟建立加密金鑰,並為 etcd 的內部作業備份建立獨立的加密金鑰。 Google Cloud您可以使用一個金鑰環來保存所有這些金鑰,以及叢集的任何其他金鑰。

  1. 為控制層開機磁碟和 etcd 磁碟建立加密金鑰:

    gcloud kms keys create KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • KCP_DISK_KEY_NAME:控制平面啟動磁碟和 etcd 磁碟的加密金鑰名稱。
    • KEYRING_NAME:用於保存叢集加密金鑰的金鑰環名稱。
    • LOCATION:金鑰環的位置。 Google Cloud 這必須與叢集位置相同。如要查看地區清單,請在 Cloud KMS 位置表格中篩選「地區」。
    • PROTECTION_LEVEL:金鑰的防護等級,例如 softwarehsm
    • KEY_PROJECT_ID金鑰專案的專案 ID。
  2. 建立 etcd 內部備份加密金鑰:

    gcloud kms keys create ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --purpose="encryption" \
        --protection-level=PROTECTION_LEVEL \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME 替換為 etcd 內部備份加密金鑰的名稱。

將 IAM 角色授予 GKE 服務代理

在本節中,您會將所建立金鑰的 IAM 角色授予叢集專案中的 GKE 服務代理程式。GKE 服務代理程式需要這些角色,才能使用這些金鑰加密對應的控制層資源。

  1. 找出叢集專案編號:

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    

    CLUSTER_PROJECT_ID 替換為 GKE 叢集專案的專案 ID。

    輸出結果會與下列內容相似:

    1234567890
    
  2. 將啟動磁碟和 etcd 磁碟的加密金鑰的「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS 加密編譯金鑰加密者/解密者) (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色授予叢集專案中的 GKE 服務代理人:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
        --project=KEY_PROJECT_ID
    

    更改下列內容:

    • KCP_DISK_KEY_NAME:磁碟加密金鑰的名稱。
    • LOCATION:金鑰的 Google Cloud 位置。
    • KEYRING_NAME:包含加密金鑰的金鑰環名稱。
    • CLUSTER_PROJECT_NUMBER:叢集專案的數值專案編號,您在上一個步驟中已找到該編號。
    • KEY_PROJECT_ID金鑰專案的專案 ID。
  3. 在叢集專案中,將啟動磁碟和 etcd 磁碟的加密金鑰 Cloud KMS CryptoKey Encrypter/Decrypter Via Delegation (roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation) 角色授予 GKE 服務代理人:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypterViaDelegation \
        --project=KEY_PROJECT_ID
    
  4. 在叢集專案中,將開機磁碟和 etcd 磁碟的加密金鑰的「Cloud KMS 金鑰使用者」角色授予 GKE 服務代理程式,以進行金鑰輪替:

    gcloud kms keys add-iam-policy-binding KCP_DISK_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/container.cloudKmsKeyUser \
        --project=KEY_PROJECT_ID
    
  5. 在叢集專案中,將 etcd 內部備份加密金鑰的 Cloud KMS CryptoKey 加密者 (roles/cloudkms.cryptoKeyEncrypter) 角色授予 GKE 服務代理人:

    gcloud kms keys add-iam-policy-binding ETCD_BACKUP_KEY_NAME \
        --location=LOCATION \
        --keyring=KEYRING_NAME \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/cloudkms.cryptoKeyEncrypter \
        --project=KEY_PROJECT_ID
    

    ETCD_BACKUP_KEY_NAME 替換為 etcd 作業備份加密金鑰的名稱。

    授予 roles/cloudkms.cryptoKeyEncrypter 角色後,GKE 就無法代表您執行資料庫還原作業,而且發生資料庫問題時,還原功能所需的時間會大幅增加。如要允許 GKE 為您執行還原作業,請改為授予 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色。

在叢集中使用加密金鑰

本節說明如何找出加密金鑰的路徑。

  1. 找出磁碟加密金鑰的路徑:

    gcloud kms keys describe KCP_DISK_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    更改下列內容:

    • KCP_DISK_KEY_NAME:控制平面開機磁碟和 etcd 磁碟的加密金鑰名稱。
    • KEYRING_NAME:包含金鑰的金鑰環名稱。
    • LOCATION:金鑰的 Google Cloud 位置。
    • KEY_PROJECT_ID金鑰專案的專案 ID。

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/disk-encryption-key
    
  2. 找出 etcd 內部備份加密金鑰的路徑:

    gcloud kms keys describe ETCD_BACKUP_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=LOCATION \
        --project=KEY_PROJECT_ID \
        --format="value(name)"
    

    ETCD_BACKUP_KEY_NAME 替換為 etcd 作業備份加密金鑰的名稱。

    輸出結果會與下列內容相似:

    projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/etcd-backup-encryption-key
    

建立叢集

在本節中,您將建立叢集,並根據要設定的 GKE 控制層授權功能,指定不同選項。您只能在建立叢集時,為叢集設定這些功能。下列指令會建立 Autopilot 模式叢集。如要改為建立標準模式叢集,請使用相同的旗標搭配 gcloud container clusters create 指令。

  • 如要建立叢集,設定磁碟加密並執行您自己的 CA 和服務帳戶簽署金鑰,請按照下列步驟操作:

    1. 請按照「執行自己的憑證授權單位和金鑰」一文中的指示,完成所有金鑰和 CA 設定步驟。
    2. 按照「在新叢集上設定 CA 和金鑰」一文中的說明,找出各個服務帳戶金鑰和 CA 的路徑。
    3. 建立叢集:

      gcloud container clusters create-auto CLUSTER_NAME \
          --location=LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
          --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY \
          --service-account-signing-keys=PATH_TO_SIGNING_KEY_VERSION \
          --service-account-verification-keys=PATH_TO_VERIFICATION_KEY_VERSION \
          --cluster-ca=PATH_TO_CLUSTER_CA \
          --etcd-peer-ca=PATH_TO_ETCD_PEER_CA \
          --etcd-api-ca=PATH_TO_ETCD_API_CA \
          --aggregation-ca=PATH_TO_AGGREGATION_CA
      

      更改下列內容:

      • CLUSTER_NAME:新叢集的名稱。
      • LOCATION:新叢集的位置。
      • CLUSTER_PROJECT_ID叢集專案的專案 ID。
      • PATH_TO_DISK_KEY:磁碟加密金鑰的路徑,如本頁面先前的步驟所述。
      • PATH_TO_ETCD_BACKUP_KEY:etcd 內部備份加密金鑰的路徑,來自本頁面先前的步驟。
      • PATH_TO_SIGNING_KEY_VERSION:Cloud KMS 中 Kubernetes ServiceAccount 簽署金鑰版本的路徑。
      • PATH_TO_VERIFICATION_KEY_VERSION:Kubernetes ServiceAccount 驗證金鑰版本在 Cloud KMS 中的路徑。
      • PATH_TO_CLUSTER_CA:叢集 CA 集區的路徑。
      • PATH_TO_ETCD_PEER_CA:etcd 對等互連 CA 集區的路徑。
      • PATH_TO_ETCD_API_CA:etcd API CA 集區的路徑。
      • PATH_TO_AGGREGATION_CA:匯總 CA 集區的路徑。
  • 如要建立叢集,並只使用本指南中建立的金鑰設定磁碟加密,請執行下列指令:

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
        --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
    

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • LOCATION:新叢集的位置。
    • CLUSTER_PROJECT_ID叢集專案的專案 ID。
    • PATH_TO_DISK_KEY:先前步驟中的磁碟加密金鑰路徑。
    • PATH_TO_ETCD_BACKUP_KEY:先前步驟中 etcd 內部備份加密金鑰的路徑。

您也可以在建立新的標準模式叢集時,指定所有這些標記。

驗證加密金鑰狀態

本節說明如何驗證叢集建立期間使用的加密金鑰。您可以使用 Cloud Logging 或 Google Cloud CLI 執行這項驗證。

使用 Logging 驗證金鑰

如要使用 Logging 驗證金鑰,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Logs Explorer」頁面:

    前往「Logs Explorer」頁面

  2. 指定下列查詢,取得叢集建立記錄:

    resource.type="gke_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.location="CLUSTER_LOCATION"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster"
    protoPayload.request.cluster.userManagedKeysConfig:*
    
  3. 點選「執行查詢」

在輸出內容中,確認叢集建立參數包含的金鑰路徑對應至您在 Cloud KMS 中設定的金鑰,如下列範例所示:

# lines omitted for clarity
userManagedKeysConfig: {
  controlPlaneDiskEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/KCP_DISK_KEY_NAME"
  gkeopsEtcdBackupEncryptionKey: "projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_NAME/cryptoKeys/ETCD_BACKUP_KEY_NAME"
}

使用 gcloud CLI 驗證金鑰

如要使用 gcloud CLI 驗證加密金鑰,請執行下列操作:

  1. 如要取得磁碟加密金鑰,請執行下列指令:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.controlPlaneDiskEncryptionKey)"
    
  2. 如要取得 etcd 內部備份加密金鑰,請執行下列指令:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="value(userManagedKeysConfig.gkeopsEtcdBackupEncryptionKey)"
    

後續步驟