使用客户管理的加密密钥

默认情况下,Cloud Tasks 会对静态存储的数据进行加密。Google Cloud 会为您管理此默认加密,您无需执行任何额外操作。

如果您对保护数据的密钥有特定的合规性或监管要求,可以为 Cloud Tasks 使用客户管理的加密密钥 (CMEK)。您的任务和相关数据(正文和标头)的静态数据受只有您可以访问的加密密钥保护,而且您可以使用 Cloud Key Management Service (Cloud KMS) 控制和管理该密钥。

受 CMEK 保护的内容

在 Cloud Tasks 中启用 CMEK 时,可以为区域启用 CMEK。启用后,在该区域中创建的任务的正文和标头在静态时受密钥保护。如果任务是在启用 CMEK 时创建的,并且后来使密钥变为非活动状态(通过停用或删除密钥,或者通过停用 CMEK),则该任务会使用您的密钥进行加密,但无法执行。

在以下情况下,任务不会使用 CMEK 进行保护:

  • 任务是在启用 CMEK 之前创建的
  • 任务不在启用了 CMEK 的区域
  • 任务受兼容性限制的影响

兼容性限制

Cloud Tasks 与 CMEK 的集成不支持以下各项:

  • google-gax4.0.0 以下版本:适用于 Node.js 的 NPM 软件包 google-gax4.0.0 以下的版本中提供有限支持。对于这些版本,只有 us-central1 区域支持 CMEK。即使您在该区域中只有任务,也建议您升级到 4.0.0 或更高版本。

  • App Engine 内置任务队列服务:使用 App Engine 内置任务队列服务创建的任务不受 CMEK 保护,即使这些任务位于启用了 CMEK 的区域也是如此。启用 CMEK 并不会阻止创建或操作(例如,执行或删除)这些任务。

  • 拉取队列:如果启用 CMEK,您可以在拉取队列上创建和执行任务,但这些任务不受 CMEK 的保护。拉取队列并不常见。 如需检查您的队列是否为拉取队列,请在终端中运行以下 gcloud CLI 命令:

    gcloud tasks queues describe QUEUE_NAME
    

    QUEUE_NAME 替换为您的队列名称。

    如果列出的 typepull,则您的队列是拉取队列。如果列出的 typepush,则此限制不会影响队列中的任务。

  • 队列级路由:启用 CMEK 后,您无法应用队列级路由。如果启用了队列级路由,则无法启用 CMEK。如需检查是否启用了队列级别路由,请执行以下操作:

    1. 在终端中运行以下 gcloud CLI 命令:

      gcloud tasks queues describe QUEUE_NAME
      QUEUE_NAME 替换为您的队列名称。

    2. 在输出中,查找字段 httpTarget 并检查是否已设置 uriOverride。如果指定了 host,则队列已启用队列级路由,且与 CMEK 不兼容。如需移除队列级路由,请参阅更新或移除队列级路由。如果输出未显示已指定 hosturiOverride,则表示您的队列不使用队列级路由。

  • 任务 TTL:启用 CMEK 后,您无法将 task_ttl 设置为大于 60 天。如果您将 task_ttl 设置为超过 60 天,则无法启用 CMEK。

准备工作

在 Cloud Tasks 中使用 CMEK 之前,请完成以下步骤:

  1. 启用 API。

    控制台

    1. 启用 Cloud KMS and Cloud Tasks API。

      启用 API

    gcloud

    1. 在 Google Cloud 控制台中,激活 Cloud Shell。

      激活 Cloud Shell

      Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

    2. 设置默认项目。该项目应该包含您要使用 CMEK 保护的 Cloud Tasks 资源。如果您需要在其他项目(例如包含 Cloud KMS 资源的项目)中运行命令,此页面将在 gcloud CLI 命令中添加 --project 标志并告知您要指定哪个项目。

      gcloud config set project PROJECT_ID
      

      PROJECT_ID 替换为包含 Cloud Tasks 资源的项目的 ID。

    3. 更新 gcloud 组件。

      gcloud components update
      

    4. 为存储加密密钥的项目启用 Cloud KMS 和 Cloud Tasks API。

      gcloud services enable cloudkms.googleapis.com cloudtasks.googleapis.com 
      --project=PROJECT_ID

      PROJECT_ID 替换为将存储加密密钥的项目的 ID。该项目可以是与您的 Cloud Tasks 资源相同的项目,但要限制对 Cloud KMS 密钥的访问,请考虑在单独的项目中设置 Cloud KMS

  2. 在 Cloud Tasks 资源启用、停用密钥或使用密钥加密和解密数据时,Cloud KMS 会生成 Cloud Audit Logs。请确保为项目中的 Cloud KMS API 启用日志记录 ,并且您已确定适用于您的用例的日志记录专用权限和角色。如需了解详情,请参阅 Cloud KMS 审核日志记录信息

  3. 获取 Identity and Access Management 角色。

    如需获取将 CMEK 用于 Cloud Tasks 所需的权限,请让管理员授予您项目的以下 IAM 角色:

    • 启用或停用 CMEK: roles/cloudtasks.admin
    • 查看使用中的密钥: roles/cloudtasks.viewer

    如需详细了解如何授予角色,请参阅管理访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

创建 Cloud KMS 密钥环和密钥

如果您在 Cloud Tasks 资源所在的区域中已有密钥环,并且想要使用该密钥和密钥环,请跳过此部分。如果没有,请按照以下说明创建 Cloud KMS 密钥和密钥环。

  1. 创建密钥环

  2. 为指定的密钥环创建密钥

检索 Cloud KMS 密钥的 ID

为 Cloud Tasks 启用 CMEK 时,必须提供 Cloud KMS 密钥的资源 ID。

控制台

  1. 在 Google Cloud 控制台中,前往密钥管理页面,然后选择密钥库存标签页。

    前往“密钥目录”

  2. 找到要检索其资源 ID 的密钥,点击 操作

  3. 点击复制资源名称

    密钥的资源 ID 会复制到剪贴板。其格式类似于以下内容:

    projects/PROJECT_NAME/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
    

gcloud

  1. 列出一个给定密钥环的所有密钥:

    gcloud kms keys list --keyring=KEY_RING --location=LOCATION --project=PROJECT_ID
    

    替换以下内容:

    • KEY_RING:密钥环的名称
    • LOCATION:密钥环的区域
    • PROJECT_ID:包含密钥环的项目的 ID

    输出结果包含每个密钥的密钥 ID。例如:

    NAME: projects/PROJECT_NAME/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
    

向 Cloud Tasks 服务代理授予对密钥的访问权限

您必须向 Cloud Tasks 服务代理授予 Cloud KMS CryptoKey Encrypter/Decrypter Identity and Access Management (IAM) 角色,以便它可以访问 Cloud KMS 密钥:

控制台

  1. 在 Google Cloud 控制台中,前往“Identity and Access Management”页面。

    转到 IAM

  2. 选中包括 Google 提供的角色授权复选框。

  3. 通过在过滤条件中输入 cloudtasks.iam.gserviceaccount.com 来查找 Cloud Tasks 服务帐号。

    Cloud Tasks 服务帐号的格式为 service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com

  4. 点击修改主账号铅笔图标。

  5. 在打开的面板中,点击添加其他角色

  6. 搜索并选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。

  7. 点击保存

gcloud

gcloud kms keys add-iam-policy-binding KEY_ID \
    --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com \
    --role=roles/cloudkms.cryptoKeyEncrypterDecrypter

替换以下内容:

  • KEY_ID:密钥的完全限定资源 ID。如需了解如何找到此位置,请参阅检索 Cloud KMS 密钥的 ID。请勿包含密钥版本号。包含密钥版本号可能会导致此命令失败。
  • PROJECT_NUMBER:您的 Google Cloud 项目编号。您可以在 Google Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:

    PROJECT=$(gcloud info --format='value(config.project)')
    gcloud projects describe ${PROJECT} --format="value(projectNumber)"
    

只要服务代理具有 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色,启用了 CMEK 的区域中的任务就可以使用 CMEK 密钥加密和解密其数据。如果您撤消此角色,或者停用或销毁 CMEK 密钥,则无法访问该数据。在本文档中,请参阅停用 Cloud KMS

为 Cloud Tasks 启用 CMEK

您可以使用 API 或 gcloud CLI 启用 CMEK。对于 Cloud Tasks,请按区域启用 CMEK。而并非由单个任务启用。在 Cloud Tasks 中为指定区域启用 CMEK 后,该区域中的所有任务均受 CMEK 保护。

API

您可以通过调用 Update CMEK config 方法来启用 CMEK。Cloud Tasks API 在 REST API 和 RPC API 中都提供了 Update CMEK config 方法:

gcloud

如需使用 Google Cloud CLI 启用 CMEK,请使用以下命令:

gcloud tasks cmek-config update --location=LOCATION --kms-key-name=KEY_ID

替换以下内容:

  • LOCATION:您的 Cloud Tasks 资源所在的区域
  • KEY_ID:密钥的完全限定资源 ID。如需了解如何找到此位置,请参阅检索 Cloud KMS 密钥的 ID。请勿包含密钥版本号。包含密钥版本号可能会导致此命令失败。

如需验证是否已成功启用密钥,请按照识别使用中的密钥部分中的说明操作。

为现有任务启用

CMEK 不保护为 Cloud Tasks 启用 CMEK 之前创建的任务。如需使用 CMEK 保护现有任务,请执行以下操作:

  1. 启用 CMEK(请参阅启用 CMEK 部分)。
  2. 替换现有任务。方法主要有两种。最佳方式取决于对您而言比较重要的方面:

    • 持续执行:为了确保持续执行(“至少至少一次”交付),您可以先重新创建任务,然后在验证新任务按预期运行后删除现有任务。这可能会导致重复执行,因为旧任务和新任务都可能会在您删除旧任务之前执行。

    • 防止重复:为防止重复执行(最多一次”传送),您可以先删除旧任务,然后重新创建。这可能导致执行丢失,因为从删除旧任务到创建新任务之间经过了一段时间。

识别使用中的密钥

如需确定用于 Cloud Tasks 资源的 CMEK 密钥,请在终端中运行以下 gcloud CLI 命令:

gcloud tasks cmek-config describe --location=LOCATION

LOCATION 替换为您的 Cloud Tasks 资源所在的区域。

如果没有输出,则表示没有为指定的位置配置 CMEK。

为 Cloud Tasks 停用 CMEK

您可以使用 API 或 gcloud CLI 停用 CMEK。对于 Cloud Tasks,系统会按区域停用 CMEK。该功能并非被单个任务停用。在 Cloud Tasks 中为给定区域停用 CMEK 后,该区域中的任务不受 CMEK 的保护。

停用 CMEK 会影响将来创建的任务,但不会影响过去创建的任务:

  • 新任务:不受 CMEK 保护
  • 现有任务:只要 Cloud KMS 密钥保持活跃状态,在启用 CMEK 时创建的任务将保持加密状态并继续执行。

API

您可以停用 CMEK,方法是调用 Update CMEK config 方法并将其替换为空字符串以清除 Cloud KMS 密钥。Cloud Tasks API 在 REST API 和 RPC API 中都提供了 Update CMEK config 方法:

gcloud

如需使用 Google Cloud CLI 停用 CMEK,请使用以下命令:

gcloud tasks cmek-config update --location=LOCATION --clear-kms-key

替换以下内容:

  • LOCATION:您的 Cloud Tasks 资源所在的区域。

移除 Cloud KMS

如果要撤消对任务的数据访问权限,您可以移除 Cloud KMS。您可以采用以下三种方式:

  • 停用 CMEK。停用 CMEK 密钥会暂停对该密钥版本保护的所有数据的访问。您无法使用已停用的密钥访问或创建任务。如果尝试在密钥停用时执行受 CMEK 保护的任务,会导致 Cloud Logging 中出现 UNKNOWN 错误。如果需要,您可以稍后重新启用该密钥。停用客户管理的加密密钥后,更改最多可能需要 5 分钟才会生效。

  • 销毁 CMEK。销毁 CMEK 密钥会永久暂停对该密钥版本保护的所有数据的访问权限。您无法使用已销毁的密钥访问或创建任务。如果某个任务是在启用 CMEK 时创建的,然后密钥随后被销毁,则该任务会使用您的密钥进行加密,但无法执行。如果任务尝试执行,Cloud Logging 会记录 UNKNOWN 错误。销毁客户管理的加密密钥后,更改最多可能需要 5 分钟才会生效。

  • 从 Cloud Tasks 服务代理中撤消 cloudkms.cryptoKeyEncrypterDecrypterIAM 角色。这会影响 Google Cloud 项目中支持使用 CMEK 加密的所有任务。您无法创建新的 CMEK 集成任务,也无法查看任何 CMEK 加密的资源。

虽然这些操作都不能保证立即撤消访问权限,但 IAM 更改通常可以更快地生效。如需了解详情,请参阅 Cloud KMS 资源一致性访问权限变更传播

价格

除了密钥操作费用(会计入您的 Google Cloud 项目),此集成不会产生额外费用。如需了解当前价格信息,请参阅 Cloud KMS 价格