使用客户管理的加密密钥

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

如果您对密钥具有特定的合规性或监管要求 保护您数据的方法,您可以使用 客户管理的加密密钥 (CMEK),用于 Cloud Tasks。您在 上的任务和相关数据(正文和标题) 其他数据均使用只有您可以访问的加密密钥进行保护, 您可以使用 Cloud Key Management Service (Cloud KMS) 进行控制和管理。

受 CMEK 保护的内容

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

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

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

兼容性限制

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

  • 以下 google-gax 个版本 4.0.0:适用于 Node.js 的 NPM 软件包 google-gax 仅在 低于 4.0.0 的版本。对于这些版本,只有 us-central1 区域。即使你在这个区域只有任务 建议您升级到 4.0.0 或更高版本。

  • App Engine 内置任务队列服务:使用 App Engine 内置 TaskQueue 服务不受 CMEK 保护,即使 并且位于启用了该 API 的区域中。启用 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. 设置默认项目。该项目应该包含 您要使用哪个 Cloud Tasks 资源 CMEK。如果您需要在其他项目(例如包含 Cloud KMS 资源的项目)中运行命令,本页将在 gcloud CLI 命令中添加 --project 标志,并告知您要指定哪个项目。

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为相应项目的 ID 其中包含您的 Cloud Tasks 资源。

    3. 更新 gcloud 组件。

      gcloud components update

    4. 为以下服务启用 Cloud KMS API 和 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 KMS 会生成 Cloud Audit Logs, 停用,或者供 Cloud Tasks 资源用来加密和解密 数据。确保针对您的项目中的 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

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

控制台

  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,CEMK 按区域启用。此功能不会由各个任务启用。当在 Google Cloud 控制台中对指定区域启用 CMEK 时 Cloud Tasks,则该区域中的所有任务都受 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,CEMK 会按区域停用。用户未将其停用 单个任务。当在以下位置为给定区域停用 CMEK 时 Cloud Tasks,则该区域中的任务不受 CMEK 保护。

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

  • 新任务:不受 CMEK 保护
  • 预先存在的任务:在启用 CMEK 时创建的任务会保留 并继续执行,只要 Cloud KMS 密钥 保持有效状态

API

您可以通过调用 Update CMEK config 方法并清除 Cloud KMS 密钥,只需将其替换为空字符串即可。通过 Cloud Tasks API 在 REST 和Update CMEK config 和 RPC API:

gcloud

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

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

替换以下内容:

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

移除 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 价格