Backup for GKE CMEK 加密简介


本页面介绍了 CMEK(客户管理的加密密钥)支持在 Backup for GKE 中的工作原理。

概览

有两种类型的用户数据工件通过 Backup for 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 密钥加密了永久性磁盘卷,则 Backup for GKE 为这些卷生成的卷备份会使用该密钥进行加密,即使您使用 BackupPlan 注册了其他密钥也是如此。

  • 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_agent 授予 roles/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
    

下表汇总了各种场景中必须向哪些服务账号授予对哪些密钥的访问权限:

工件 服务账号
配置备份集群 agent_robot bplan_key
CMEK 加密的卷备份 cmek_service_agent orig_disk_key
Google 加密的卷备份 non_cmek_service_agent bplan_key
在恢复期间创建的 CMEK 加密的新卷 compute_service_agent new_disk_key

您可以选择在项目级层授予对密钥的访问权限(授予对项目下所有密钥的访问权限),或授予对单个密钥的访问权限。

授予项目级访问权限

您可以选择在项目级别授予对密钥的访问权限(授予对项目下所有密钥的访问权限)。

请按照以下说明在项目级别授予访问权限。

控制台

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM

  2. 点击授予访问权限

  3. 新主账号字段中,输入服务账号的电子邮件地址。

  4. 选择角色列表中,选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。

  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. 点击权限标签页。

  5. 点击授予访问权限

  6. 新主账号字段中,输入服务账号的电子邮件地址。

  7. 选择角色列表中,选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。

  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 位于同一区域,以确保区域性服务中断不会移除对密钥的访问权限,同时备份仍可访问。但是,对于与加密卷共享的密钥,系统无法强制执行此限制条件。当涉及加密卷时,由于磁盘加密密钥可能未与备份存储在同一区域,因此即使备份可用,恢复也可能会失败。