使用客户管理的加密密钥

默认情况下,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。如果您需要在其他项目中运行命令(例如 项目,此页面将 在 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 审核日志信息

  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. 通过输入以下内容来查找 Cloud Tasks 服务账号 cloudtasks.iam.gserviceaccount.com

    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:您的 键。有关如何找到此信息的说明,请参阅 检索 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 按区域启用。它未启用 单个任务。当在 Google Cloud 控制台中对指定区域启用 CMEK 时 Cloud Tasks,则该区域中的所有任务都受 CMEK 保护。

API

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

gcloud

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

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

替换以下内容:

  • LOCATION:您的 Cloud Tasks 资源
  • KEY_ID:您的 键。有关如何找到此信息的说明,请参阅 检索 Cloud KMS 密钥的 ID。不包含键 版本号。如果包含密钥版本号,可能会导致此命令失败。

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

为现有任务启用

CMEK 不会保护为以下服务启用 CMEK 之前创建的任务 Cloud Tasks。如需使用 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 按区域停用。该功能未被下列开发者停用: 单个任务。在 Google Cloud 中针对指定区域停用 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 错误。时间 销毁 CMEK(客户管理的加密密钥)后,系统最多可能需要 5 分钟 要应用的更改。

  • 撤消 cloudkms.cryptoKeyEncrypterDecrypter您在 Google Cloud 控制台中 Cloud Tasks 服务代理。这会影响 支持使用 CMEK 进行加密的 Google Cloud 项目。禁止的行为 创建新的 CMEK 集成任务,或查看任何 CMEK 加密的资源。

尽管上述操作都不能保证立即撤消访问权限, IAM 更改通常更快生效。如需更多信息 请参阅 Cloud KMS 资源一致性访问更改传播

价格

除了密钥操作、 费用将计入您的 Google Cloud 项目。当前价格 信息,请参阅 Cloud KMS 价格