關於 Backup for GKE 的 CMEK 加密


根據預設,Backup for GKE 會加密靜態的客戶內容。GKE 備份功能會為您處理加密作業,您不必採取任何其他動作。這項做法稱為「Google 預設加密」

如要控管加密金鑰,您可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),搭配 Backup for GKE 等整合 CMEK 的服務。使用 Cloud KMS 金鑰可讓您控管保護等級、位置、輪換時間表、使用權限和存取權,以及加密範圍。使用 Cloud KMS 也能查看稽核記錄,以及控管金鑰生命週期。您可以在 Cloud KMS 中控制及管理這些金鑰,而不是由 Google 擁有及管理用來保護您資料的對稱金鑰加密金鑰 (KEK)

使用 CMEK 設定資源後,存取 Backup for GKE 資源的體驗與使用 Google 預設加密類似。如要進一步瞭解加密選項,請參閱客戶管理的加密金鑰 (CMEK)

總覽

「GKE 備份」會產生並儲存兩種類型的使用者資料構件:

  • 設定備份:一組從備份叢集的 API 伺服器擷取的 Kubernetes 資源說明,可擷取叢集狀態。
  • 磁碟區備份:一組與設定備份中找到的 PersistentVolumeClaim 資源對應的磁碟區備份。

根據預設,Backup for GKE 產生的所有備份構件都會使用 Google 提供的金鑰加密。

不過,您可以選擇使用透過 Cloud Key Management Service 管理的客戶自行管理的加密金鑰 (CMEK),將這些構件加密。

啟用 CMEK 加密

啟用 CMEK 加密功能需要兩個步驟:

  • 指定用於加密 BackupPlan 備份的金鑰。

  • 透過適當的服務帳戶,將存取權授予適當的金鑰。

在任何特定備份情境中,可能涉及三種 CMEK 金鑰:

  • bplan_key:這是您在建立或更新 BackupPlan 時參考的鍵。如果可以,系統會使用這個金鑰加密所有備份構件。這個金鑰必須與 BackupPlan 位於相同區域 (請參閱「關於資源位置」)。

  • orig_disk_key:如果您使用 CMEK 金鑰加密永久磁碟區,即使向 BackupPlan 註冊了其他金鑰,Backup for GKE 為這些磁碟區產生的磁碟區備份也會使用這個金鑰加密。

  • new_disk_key:這是您要用於加密從備份還原磁碟區的 CMEK 金鑰。這是由還原目標叢集中的 StorageClass 參照。

有四個不同的服務帳戶可能需要存取 CMEK 金鑰:

  • agent_robot:必須授予這個服務帳戶 bplan_key 的存取權。 這個服務帳戶的格式如下: service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com, 其中 PROJECT_NUMBER 是 Google Cloud 專案的編號。

  • non_cmek_service_agent:備份非 CMEK 加密的磁碟區時,必須授予這個服務帳戶 bplan_key 的存取權。這個服務帳戶的格式如下: service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com, 其中 PROJECT_NUMBER 是您的 Google Cloud 專案編號。

  • cmek_service_agent:備份以 CMEK 加密的磁碟區時,必須授予這個服務帳戶 orig_disk_key 的存取權。這個服務帳戶的格式如下: service-TENANT_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com, 其中 TENANT_PROJECT_NUMBER 是指派給 BackupPlan 的租戶專案編號。

  • compute_service_agent:這個服務帳戶用於為叢集建立新的加密磁碟區,且必須獲得 new_disk_key 的存取權。這個服務帳戶的格式為:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com,其中 PROJECT_NUMBER 是您的 Google Cloud 專案編號。

如果已為磁碟設定 diskEncryptionKey.kmsKeyServiceAccount,您必須先執行下列步驟,才能建立備份:

  • 停用機構政策 iam.disableCrossProjectServiceAccountUsage,以啟用跨專案的服務帳戶模擬功能

      gcloud resource-manager org-policies disable-enforce \
          iam.disableCrossProjectServiceAccountUsage
          --project=PROJECT_ID
    
  • 授予 cmek_service_agentroles/iam.serviceAccountTokenCreator」角色,建立短期憑證

      gcloud iam service-accounts add-iam-policy-binding \
        # Replace the email with the value from
        # `diskEncryptionKey.kmsKeyServiceAccount`
        your-kms-key-service-acount@PROJECT_ID.iam.gserviceaccount.com \
        --member=service-TENANT_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    

如果您要執行跨專案備份或跨專案還原作業,必須列出下列三個專案名稱:

  • cluster_project:包含要備份叢集的專案。

  • backup_project:要儲存備份的專案。

  • restore_project:包含還原目標叢集的專案。

下表摘要說明在各種情況下,必須授予哪些服務帳戶哪些金鑰的存取權:

構件 服務帳戶 專案編號
設定備份叢集 agent_robot
  • cluster_project (備份期間)
  • restore_project (還原期間)
bplan_key
以 CMEK 加密的磁碟區備份 cmek_service_agent backup_project orig_disk_key
備份 Google 加密磁碟區 non_cmek_service_agent backup_project bplan_key
還原期間建立的新 CMEK 加密磁碟區 compute_service_agent restore_project new_disk_key

您可以選擇在專案層級授予金鑰存取權 (授予該專案中所有金鑰的存取權),或是授予個別金鑰的存取權。

授予專案層級存取權

您可以在專案層級授予金鑰存取權,這樣就能存取該專案中的所有金鑰。

請按照下列操作說明,在專案層級授予存取權。

控制台

  1. 前往 Google Cloud 控制台的「IAM」頁面。

    前往 IAM

  2. 按一下「授予存取權」

  3. 在「新增主體」欄位中,輸入服務帳戶的電子郵件地址。

  4. 從「Select a role」(選取角色) 清單中,選取「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS 加密編譯金鑰加密者/解密者) 角色。

  5. 按一下 [儲存]

gcloud

  1. 在專案層級授予存取權。

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    更改下列內容:

    • PROJECT_ID:您要授予存取權的專案 ID。
    • PROJECT_NUMBER:要授予存取權的專案編號。

Terraform

  1. 在專案層級授予存取權。

    resource "google_project_iam_member" "example_iam_member" {
    project = "PROJECT_ID"
    role    = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
    member  = "serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com"
    }
    

    更改下列內容:

    • PROJECT_ID:您要授予存取權的專案 ID。
    • PROJECT_NUMBER:要授予存取權的專案編號。

在金鑰層級授予存取權

請按照下列指示,在個別金鑰層級授予存取權。

控制台

  1. 前往 Google Cloud 控制台的「金鑰管理」頁面。

    前往「金鑰管理」

  2. 按一下金鑰環名稱。

  3. 按一下金鑰名稱。

  4. 按一下「Permissions」(權限) 分頁標籤。

  5. 按一下「授予存取權」

  6. 在「新增主體」欄位中,輸入服務帳戶的電子郵件地址。

  7. 從「Select a role」(選取角色) 清單中,選取「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud KMS 加密編譯金鑰加密者/解密者) 角色。

  8. 按一下 [儲存]

gcloud

  1. 在個別金鑰層級授予存取權。

    gcloud kms keys add-iam-policy-binding KEY_NAME \
    --keyring KEY_RING \
    --location LOCATION \
    --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com" \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    更改下列內容:

    • KEY_NAME:金鑰名稱。
    • KEY_RING:金鑰所屬金鑰環的名稱。
    • LOCATION:金鑰環的 Cloud KMS 位置。
    • PROJECT_NUMBER:要授予存取權的專案編號。

Terraform

  1. 在個別金鑰層級授予存取權。

    resource "google_kms_crypto_key_iam_member" "crypto_key_iam_member" {
    crypto_key_id = "projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME"
    role          = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
    member        = "serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkebackup.iam.gserviceaccount.com" 
    }
    

    更改下列內容:

    • PROJECT_ID:您要授予存取權的專案 ID。
    • LOCATION:金鑰環的 Cloud KMS 位置。
    • KEY_RING:金鑰所屬金鑰環的名稱。
    • KEY_NAME:金鑰名稱。
    • PROJECT_NUMBER:要授予存取權的專案編號。

使用注意事項和限制

  • 如要備份以 CMEK 加密的磁碟區,即使您未在 BackupPlan 中啟用 CMEK 加密,也必須授予該磁碟金鑰的存取權。

  • CMEK 金鑰必須與 BackupPlan 位於相同區域,確保區域性中斷不會在備份檔仍可存取時,移除金鑰存取權。不過,如果金鑰是與加密磁碟區共用,就無法強制執行這項限制。如果涉及加密磁碟區,即使有備份,還原作業仍可能失敗,因為磁碟加密金鑰可能未儲存在與備份相同的區域。

使用及管理外部金鑰

您可以使用 Cloud External Key Manager (Cloud EKM) 建立及管理外部金鑰。外部金鑰是指向 Google Cloud外部金鑰的指標。這些金鑰位於支援的外部金鑰管理合作夥伴。詳情請參閱 Cloud External Key Manager

使用 Cloud EKM 建立外部金鑰後,您可以在建立新的備份方案時提供該金鑰的 ID,將金鑰套用至新的備份方案。 這個程序與將 Cloud KMS 金鑰套用至新備份計畫的程序相同。

您可以將金鑰存取理由與 Cloud EKM 搭配使用。您可以使用 Key Access Justifications 查看每項 Cloud EKM 要求的原因。此外,您也可以根據提供的理由自動核准或拒絕要求。詳情請參閱總覽