使用 CMEK 保护您的数据

您可以使用 Cloud Key Management Service 客户管理的加密密钥 (CMEK) 来保护 Cloud Functions 和相关静态数据。此类密钥通过 Cloud KMS 创建和管理,并作为软件密钥存储在 HSM 集群中或存储在外部

部署具有 CMEK 的函数后,您可以使用完全由您控制的加密密钥保护与其关联的数据。这种类型的加密使您能够满足某些行业(例如金融服务)的合规性要求。由于密钥由您自己拥有,并且不受 Google 控制,因此在停用或销毁密钥时,没有人(包括您)可以访问受这些加密密钥保护的数据。

在使用 CMEK 时,将会加密以下类型的 Cloud Functions 数据:

  • 上传用于部署且由 Google 存储在 Cloud Storage 中的函数源代码,这些源代码将用于构建过程。
  • 函数构建过程的结果,包括:
    • 通过函数源代码构建的容器映像。
    • 已部署的函数的每个实例。
  • 内部事件传输渠道的静态数据(仅限第 1 代)。

函数构建过程本身是由一个针对每个构建唯一生成的临时密钥来保护的。如需了解详情,请参阅 Cloud Build 中的 CMEK 合规性。此外,请注意以下事项:

  • 文件元数据(例如文件系统路径或修改时间戳)未加密。

  • 如果密钥已停用,则无法部署容器映像,并且新实例将无法启动。

  • Cloud Functions CMEK 保护仅适用于 Google 管理的 Cloud Functions 资源;您需要负责保护由您管理的数据和资源,例如源代码库、位于客户项目中的事件渠道(仅限第 2 代)或函数使用的任何服务。

为 Cloud Functions 设置 CMEK 需要执行以下操作:

  • 授予必要的服务账号对密钥的访问权限:

    • 对于所有函数,您需要授予 Cloud Functions、Artifact Registry 和 Cloud Storage 服务账号对密钥的访问权限。

    • 仅对于事件驱动型 Cloud Functions (第 2 代),您还需要完成 Cloud RunEventarc 的 CMEK 设置。

  • 创建受 CMEK 保护的 Artifact Registry 代码库以存储您的函数映像。

  • 为您的函数启用 CMEK。

  • (可选)启用 CMEK 组织政策,以强制所有新函数符合 CMEK。

下面将详细介绍这些步骤。

准备工作

  1. 创建用于加密函数的单区域密钥。如需了解如何创建密钥,请参阅创建对称加密密钥

  2. 创建 Artifact Registry 代码库,并启用 CMEK。对于 Artifact Registry 代码库,必须使用与为函数启用 CMEK 时相同的密钥。

  3. 对于事件驱动型第 2 代函数,请按照为 Google 渠道启用 CMEK 中所述的其他设置步骤执行操作。

向服务账号授予对密钥的访问权限

对于所有函数,您必须授予以下服务账号对密钥的访问权限:

  • Cloud Functions 服务代理 (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)

  • Artifact Registry 服务代理 (service-PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com)

  • Cloud Storage 服务代理 (service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com)

仅对于第 2 代,您还必须授予以下服务账号对密钥的访问权限:

  • Cloud Run 服务代理 (service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com)

  • Eventarc 服务代理 (service-PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com)

要向这些服务账号授予密钥的访问权限,请将每个服务账号添加为密钥的主账号,然后向服务账号授予 Cloud KMS CryptoKey Encrypter/Decrypter 角色:

控制台

  1. 转到 Google Cloud 控制台中的 Cloud Key Management Service 页面:
    转到 Cloud KMS 页面

  2. 点击包含所需密钥的密钥环的名称。

  3. 点击密钥的名称以查看密钥详细信息。

  4. 权限标签页中,点击授予访问权限

  5. 新主账号字段中,输入所有三个服务账号的电子邮件地址,以便一次为三个账号分配权限。

  6. 选择角色下拉列表中,选择 Cloud KMS CryptoKey Encrypter/Decrypter

  7. 点击保存

gcloud

对于上述每个服务账号,请运行以下命令:

gcloud kms keys add-iam-policy-binding KEY \
--keyring KEY_RING \
--location LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter

替换以下内容:

  • KEY:密钥的名称。例如 my-key

  • KEY_RING:密钥环的名称。例如 my-keyring

  • LOCATION:密钥的位置。例如 us-central1

  • SERVICE_AGENT_EMAIL:服务账号的电子邮件地址。

为函数启用 CMEK

设置启用了 CMEK 的 Artifact Registry 代码库并授予 Cloud Functions 对您的密钥的访问权限后,您就可以为函数启用 CMEK 了。

如需为函数启用 CMEK,请执行以下操作:

控制台

  1. 转到 Google Cloud 控制台中的 Cloud Functions 页面:
    转到 Cloud Functions 页面

  2. 点击要启用 CMEK 的函数的名称。

  3. 点击修改

  4. 点击运行时、构建...以展开高级配置选项。

  5. 选择安全和映像代码库标签页。

  6. 加密部分中,选择客户管理的加密密钥 (CMEK)

  7. 从下拉列表中选择您选择的密钥。

  8. 容器位置下,选择客户管理的 Artifact Registry

  9. Artifact Registry 下拉列表中,选择受 CMEK 保护的代码库。

  10. 点击下一步

  11. 点击部署

gcloud

运行以下命令:

gcloud functions deploy FUNCTION \
[--gen2] \
--kms-key=KEY \
--docker-repository=REPOSITORY \
--source=YOUR_SOURCE_LOCATION
FLAGS...

请替换以下内容:

  • FUNCTION:要启用 CMEK 的函数的名称。例如 cmek-function

  • KEY:完全限定的密钥名称,格式如下:projects/PROJECT_NAME/locations/LOCATION/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME

  • REPOSITORY:完全限定的 Artifact Registry 代码库名称,格式如下:projects/PROJECT_NAME/locations/LOCATION/repositories/REPOSITORY

  • YOUR_SOURCE_LOCATION:为已存在的函数启用 CMEK 时,请确保明确指定此参数,以重新部署预期的源代码。

  • FLAGS...:部署函数时(尤其是创建部署时)可能需要的其他标志。如需了解详情,请参阅部署 Cloud Functions 函数

已为该函数启用 CMEK。

请注意,Cloud Functions 始终使用密钥的主要版本来实现 CMEK 保护。为函数启用 CMEK 时,您无法指定要使用的特定密钥版本。

如果密钥被销毁停用,或者其必需的权限被撤消,则受该密钥保护的函数的有效实例不会关停。正在进行的函数执行将继续运行,但只要 Cloud Functions 无权访问该密钥,新的执行就会失败。

测试 CMEK 保护

如需验证 CMEK 保护是否正常工作,您可以停用用于为函数启用 CMEK 的密钥,然后尝试触发您的函数:

  1. 停用用于保护函数的密钥

  2. 尝试查看与此函数关联的源代码。尝试应该会失败。

  3. 尝试触发受 CMEK 保护的函数。 尝试应该会失败。

  4. 验证 CMEK 保护能够正常工作之后,启用密钥

现已确认该函数的 CMEK 保护。

后续步骤