使用 CMEK 保护您的数据

默认情况下,Cloud Run 函数会对静态客户内容进行加密。Cloud Run 函数会为您处理加密,您无需执行任何其他操作。此选项称为 Google 默认加密

如果您想要控制加密密钥,则可以将 Cloud KMS 中客户管理的加密密钥 (CMEK) 与集成 CMEK 的服务(包括 Cloud Run 函数)结合使用。使用 Cloud KMS 密钥时,您可以控制其保护级别、位置、轮替时间表、使用和访问权限以及加密边界。此外,您还可使用 Cloud KMS 查看审核日志并控制密钥生命周期。这样您就可以在 Cloud KMS 中控制和管理用于保护您数据的对称密钥加密密钥 (KEK),而不是由 Google 拥有和管理这些密钥。

使用 CMEK 设置资源后,访问 Cloud Run Functions 资源的体验与使用 Google 默认加密功能类似。如需详细了解加密选项,请参阅客户管理的加密密钥 (CMEK)

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

  • 上传用于部署且由 Google 存储在 Cloud Storage 中的函数源代码,这些源代码将用于构建过程。
  • 函数构建过程的结果,包括:
    • 通过函数源代码构建的容器映像。
    • 已部署的函数的每个实例。

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

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

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

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

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

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

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

    • 对于事件驱动型 Cloud Run 函数,您还需要完成 Cloud RunEventarc 的 CMEK 设置。

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

  • 为您的函数启用 CMEK。

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

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

准备工作

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

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

  3. 对于事件驱动型函数,请按照为 Google 渠道启用 CMEK 中列出的其他设置步骤操作。

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

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

  • Cloud Run 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)

您还必须向以下服务账号授予对密钥的访问权限:

  • 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 Run functions 对您的密钥的访问权限后,您就可以为函数启用 CMEK 了。

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

控制台

  1. 前往 Google Cloud 控制台中的 Cloud Run functions 页面:
    前往 Cloud Run 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 Run functions 函数

已为该函数启用 CMEK。

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

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

测试 CMEK 保护

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

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

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

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

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

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

后续步骤