本页面介绍了 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_wi
:如果您运行的是代理的预览版(运行 1.23 版或更低版本的 GKE 集群),则此服务账号必须获得对bplan_key
的访问权限。此服务账号的格式为PROJECT_ID.svc.id.goog[gkebackup/agent]
,其中PROJECT_ID
是您的 Google Cloud 项目的 ID。agent_robot
:如果您的 GKE 集群运行的是 1.24 版或更高版本,则此服务账号必须获得对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
下表汇总了各种场景中必须向哪些服务账号授予对哪些密钥的访问权限:
工件 | 服务账号 | 密钥 |
---|---|---|
配置备份,1.23- 集群 | agent_wi | bplan_key |
配置备份,1.24+ 集群 | 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 |
您可以选择在项目级层授予对密钥的访问权限(授予对项目下所有密钥的访问权限),或授予对单个密钥的访问权限。
授予项目级访问权限
您可以选择在项目级别授予对密钥的访问权限(授予对项目下所有密钥的访问权限)。
请按照以下说明在项目级别授予访问权限。
控制台
在 Google Cloud 控制台中,转到 IAM 页面。
点击授予访问权限。
在新主账号字段中,输入服务账号的电子邮件地址。
从选择角色列表中,选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
点击保存。
gcloud
在项目级别授予访问权限。
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
在项目级别授予访问权限。
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
:您要授予访问权限的项目的编号。
授予密钥级别访问权限
请按照以下说明在各个密钥级别授予访问权限。
控制台
在 Google Cloud 控制台中,进入密钥管理页面。
点击密钥环的名称。
点击密钥的名称。
点击权限标签页。
点击授予访问权限。
在新主账号字段中,输入服务账号的电子邮件地址。
从选择角色列表中,选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
点击保存。
gcloud
在单个密钥级别授予访问权限。
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
在单个密钥级别授予访问权限。
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
位于同一区域,以确保区域性服务中断不会移除对密钥的访问权限,同时备份仍可访问。但是,对于与加密卷共享的密钥,系统无法强制执行此限制条件。当涉及加密卷时,由于磁盘加密密钥可能未与备份存储在同一区域,因此即使备份可用,恢复也可能会失败。