使用客户管理的加密密钥

默认情况下,Cloud Tasks 会对以静态方式存储的客户内容进行加密。Cloud Tasks 会为您处理加密,您无需执行任何其他操作。此选项称为 Google 默认加密

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

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

受 CMEK 保护的内容

在 Cloud Tasks 中启用 CMEK 时,您是在为某个区域启用 CMEK。启用此功能后,在该区域创建的任务正文和标题在处于休眠状态时会使用您的密钥进行保护。如果任务是在启用 CMEK 的情况下创建的,但密钥后来处于非活动状态(通过停用或删除密钥,或停用 CMEK),则该任务会使用您的密钥进行加密,但无法执行。

在以下情况下,任务不会受 CMEK 保护:

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

兼容性限制

Cloud Tasks 与 CMEK 的集成不支持以下操作:

  • 低于 4.0.0google-gax 版本:对于低于 4.0.0 的版本,Node.js 的 NPM 软件包 google-gax 仅受有限支持。对于这些版本,只有 us-central1 区域支持 CMEK。即使您只有该区域中的任务,也建议您升级到版本 4.0.0 或更高版本。

  • App Engine 内置 Taskqueue 服务:使用 App Engine 内置 Taskqueue 服务创建的任务不会受到 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. Enable the Cloud KMS and Cloud Tasks APIs.

      Enable the APIs

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    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 控制台中,前往 IAM(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。如需了解如何查找此 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 Tasks 停用 CMEK

为 Cloud Tasks 启用 CMEK

您可以使用 API 或 gcloud CLI 启用 CMEK。对于 Cloud Tasks,CEMK 按区域启用。此功能不会由各个任务启用。在 Cloud Tasks 中为指定区域启用 CMEK 后,该区域中的所有任务都将受 CMEK 保护。

gcloud

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

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

替换以下内容:

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

REST

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

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

为现有任务启用

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。

应用 CMEK 组织政策

Cloud Tasks 集成了两项组织政策限制条件,以帮助确保在整个组织范围内使用 CMEK:

  • constraints/gcp.restrictNonCmekServices 用于要求使用 CMEK 保护。
  • constraints/gcp.restrictCmekCryptoKeyProjects 用于限制哪些 Cloud KMS 密钥用于 CMEK 保护。

借助此集成,您可以为组织中的 Cloud Tasks 资源指定以下加密合规性要求:

应用组织政策时的注意事项

在应用任何 CMEK 组织政策之前,您应了解以下事项。

做好传播延迟的准备

设置或更新组织政策后,新政策最多可能需要 15 分钟才能生效。

考虑现有资源

现有资源不受新创建的组织政策约束。例如,组织政策不会追溯应用于现有任务。即使没有 CMEK,您仍然可以访问这些资源,并且这些资源仍会使用现有密钥进行加密(如果适用)。如果您想将该政策应用于现有任务,则必须为现有任务启用 CMEK

验证设置组织政策所需的权限

出于测试目的,可能难以获取设置或更新组织政策的权限。必须具有 Organization Policy Administrator 角色,该角色只能在组织级层(而不是项目或文件夹级层)授予。

虽然该角色必须在组织级层授予,但仍然可以指定仅应用于特定项目或文件夹的政策。

要求为所有新的 Cloud Tasks 资源使用 CMEK

您可以使用 constraints/gcp.restrictNonCmekServices 限制条件来要求使用 CMEK 来保护组织中的所有新 Cloud Tasks 资源。

如果设置,此组织政策会导致没有指定 Cloud KMS 密钥的所有资源创建请求失败。

设置此政策后,它仅适用于项目中的新资源。未应用 Cloud KMS 密钥的所有现有资源将继续存在,并且可以正常访问。

控制台

  1. 在 Google Cloud 控制台中,前往组织政策页面。

    转到“组织政策”

  2. 使用过滤条件搜索以下限制条件:

    constraints/gcp.restrictNonCmekServices
    
  3. 在“名称”列中,点击限制哪些服务可以在没有 CMEK 的情况下创建资源

  4. 点击 管理政策

  5. 修改政策页面上,选择“政策来源”下方的覆盖父级政策

  6. 规则下,点击添加规则

  7. 政策值列表中,选择自定义

  8. 政策类型列表中,选择拒绝

  9. 自定义值字段中,输入以下内容:

    is:cloudtasks.googleapis.com
    
  10. 点击完成,然后点击设置政策

gcloud

  1. 创建临时文件 /tmp/policy.yaml 以存储政策:

      name: projects/PROJECT_ID/policies/gcp.restrictNonCmekServices
      spec:
        rules:
        - values:
            deniedValues:
            - is:cloudtasks.googleapis.com

    PROJECT_ID 替换为您要应用此约束条件的项目的 ID。

  2. 运行 org-policies set-policy 命令:

    gcloud org-policies set-policy /tmp/policy.yaml

如需验证政策是否已成功应用,您可以尝试在项目中创建队列。除非您指定 Cloud KMS 密钥,否则该过程将失败。

限制 Cloud Tasks 项目的 Cloud KMS 密钥

您可以使用 constraints/gcp.restrictCmekCryptoKeyProjects 限制条件来限制可用于保护 Cloud Tasks 项目中的资源的 Cloud KMS 密钥。

例如,您可以指定类似以下的规则:“对于 projects/my-company-data-project 中的所有 Cloud Tasks 资源,此项目中使用的 Cloud KMS 密钥必须来自 projects/my-company-central-keysprojects/team-specific-keys”。

控制台

  1. 在 Google Cloud 控制台中,前往组织政策页面。

    转到“组织政策”

  2. 使用过滤条件搜索以下限制条件:

    constraints/gcp.restrictCmekCryptoKeyProjects
    
  3. 在“名称”列中,点击限制哪些项目可以为 CMEK 提供 KMS CryptoKey

  4. 点击 管理政策

  5. 修改政策页面上,选择“政策来源”下方的覆盖父级政策

  6. 规则下,点击添加规则

  7. 政策值列表中,选择自定义

  8. 政策类型列表中,选择允许

  9. 自定义值字段中,输入以下内容:

    under:projects/KMS_PROJECT_ID
    

    KMS_PROJECT_ID 替换为您要使用的 Cloud KMS 密钥所在的项目 ID。

    例如 under:projects/my-kms-project

  10. 点击完成,然后点击设置政策

gcloud

  1. 创建临时文件 /tmp/policy.yaml 以存储政策:

      name: projects/PROJECT_ID/policies/gcp.restrictCmekCryptoKeyProjects
      spec:
        rules:
        - values:
            allowedValues:
            - under:projects/KMS_PROJECT_ID

    替换以下内容

    • PROJECT_ID:您要应用此约束条件的项目的 ID。
    • KMS_PROJECT_ID:您要使用的 Cloud KMS 密钥所在的项目的 ID。
  2. 运行 org-policies set-policy 命令:

    gcloud org-policies set-policy /tmp/policy.yaml

如需验证政策是否已成功应用,您可以尝试使用其他项目中的 Cloud KMS 密钥创建队列。该过程将失败。

为 Cloud Tasks 停用 CMEK

您可以使用 API 或 gcloud CLI 停用 CMEK。对于 Cloud Tasks,CEMK 会按区域停用。它不会因单个任务而停用。在 Cloud Tasks 中为给定区域停用 CMEK 后,该区域中的任务将不受 CMEK 保护。

停用 CMEK 会影响日后创建的任务,而不会影响过去创建的任务:

  • 新任务:不受 CMEK 保护
  • 现有任务:在启用 CMEK 期间创建的任务会保持加密状态,并且只要 Cloud KMS 密钥保持有效,这些任务就会继续执行。

gcloud

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

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

替换以下内容:

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

REST

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

移除 Cloud KMS

如果您想撤消对任务数据的访问权限,可以移除 Cloud KMS。您可以通过以下三种方式实现此目的:

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

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

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

虽然这三项操作均不能保证即时撤消访问权限,但 IAM 更改通常会更快生效。如需了解详情,请参阅 Cloud KMS 资源一致性访问权限更改传播

价格

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