默认情况下,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-gax
的4.0.0
以下版本:适用于 Node.js 的 NPM 软件包google-gax
在4.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
替换为您的队列名称。如果列出的
type
为pull
,则您的队列是拉取队列。如果列出的type
为push
,则此限制不会影响队列中的任务。队列级路由:启用 CMEK 后,您无法应用队列级路由。如果启用了队列级路由,则无法启用 CMEK。如需检查是否启用了队列级别路由,请执行以下操作:
在终端中运行以下 gcloud CLI 命令:
gcloud tasks queues describe QUEUE_NAME
将QUEUE_NAME
替换为您的队列名称。在输出中,查找字段
httpTarget
并检查是否已设置uriOverride
。如果指定了host
,则队列已启用队列级路由,且与 CMEK 不兼容。如需移除队列级路由,请参阅更新或移除队列级路由。如果输出未显示已指定host
的uriOverride
,则表示您的队列不使用队列级路由。
任务 TTL:启用 CMEK 后,您无法将
task_ttl
设置为大于 60 天。如果您将task_ttl
设置为超过 60 天,则无法启用 CMEK。
准备工作
在 Cloud Tasks 中使用 CMEK 之前,请完成以下步骤:
启用 API。
控制台
-
启用 Cloud KMS and Cloud Tasks API。
gcloud
In the Google Cloud console, 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.
设置默认项目。该项目应该包含您要使用 CMEK 保护的 Cloud Tasks 资源。如果您需要在其他项目(例如包含 Cloud KMS 资源的项目)中运行命令,此页面将在 gcloud CLI 命令中添加
--project
标志并告知您要指定哪个项目。gcloud config set project PROJECT_ID
将
PROJECT_ID
替换为包含 Cloud Tasks 资源的项目的 ID。更新
gcloud
组件。gcloud components update
为存储加密密钥的项目启用 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。
-
在 Cloud Tasks 资源启用、停用密钥或使用密钥加密和解密数据时,Cloud KMS 会生成 Cloud Audit Logs。请确保为项目中的 Cloud KMS API 启用日志记录 ,并且您已确定适用于您的用例的日志记录专用权限和角色。如需了解详情,请参阅 Cloud KMS 审核日志记录信息。
获取 Identity and Access Management 角色。
如需获取将 CMEK 用于 Cloud Tasks 所需的权限,请让管理员授予您项目的以下 IAM 角色:
-
启用或停用 CMEK:
roles/cloudtasks.admin
-
查看使用中的密钥:
roles/cloudtasks.viewer
如需详细了解如何授予角色,请参阅管理访问权限。
-
启用或停用 CMEK:
创建 Cloud KMS 密钥环和密钥
如果您在 Cloud Tasks 资源所在的区域中已有密钥环,并且想要使用该密钥和密钥环,请跳过此部分。如果没有,请按照以下说明创建 Cloud KMS 密钥和密钥环。
-
密钥环必须位于要保护的 Cloud Tasks 资源所在的区域。如需了解详情,请参阅 Cloud KMS 位置和 Cloud Tasks 位置。
密钥环和受 CMEK 保护的 Cloud Tasks 资源可以位于同一项目中,但为了限制对 Cloud KMS 密钥的访问,请考虑在单独的项目中设置 Cloud KMS。
检索 Cloud KMS 密钥的 ID
为 Cloud Tasks 启用 CMEK 时,必须提供 Cloud KMS 密钥的资源 ID。
控制台
在 Google Cloud 控制台中,前往密钥管理页面,然后选择密钥库存标签页。
找到要检索其资源 ID 的密钥,点击 more_vert 操作。
点击复制资源名称。
密钥的资源 ID 会复制到剪贴板。其格式类似于以下内容:
projects/PROJECT_NAME/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
gcloud
列出一个给定密钥环的所有密钥:
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 密钥:
控制台
在 Google Cloud 控制台中,前往“Identity and Access Management”页面。
选中包括 Google 提供的角色授权复选框。
通过在过滤条件中输入
cloudtasks.iam.gserviceaccount.com
来查找 Cloud Tasks 服务帐号。Cloud Tasks 服务帐号的格式为
service-PROJECT_NUMBER@gcp-sa-cloudtasks.iam.gserviceaccount.com
。点击修改主账号铅笔图标。
在打开的面板中,点击添加其他角色。
搜索并选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
点击保存。
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
方法:
- REST:使用
updateCmekConfig
方法。 - RPC:使用
UpdateCmekConfigRequest
方法。
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 保护现有任务,请执行以下操作:
- 启用 CMEK(请参阅启用 CMEK 部分)。
替换现有任务。方法主要有两种。最佳方式取决于对您而言比较重要的方面:
持续执行:为了确保持续执行(“至少至少一次”交付),您可以先重新创建任务,然后在验证新任务按预期运行后删除现有任务。这可能会导致重复执行,因为旧任务和新任务都可能会在您删除旧任务之前执行。
防止重复:为防止重复执行(最多一次”传送),您可以先删除旧任务,然后重新创建。这可能导致执行丢失,因为从删除旧任务到创建新任务之间经过了一段时间。
识别使用中的密钥
如需确定用于 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
方法:
- REST:使用
updateCmekConfig
方法。 - RPC:使用
UpdateCmekConfigRequest
方法。
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.cryptoKeyEncrypterDecrypter
IAM 角色。这会影响 Google Cloud 项目中支持使用 CMEK 加密的所有任务。您无法创建新的 CMEK 集成任务,也无法查看任何 CMEK 加密的资源。
虽然这些操作都不能保证立即撤消访问权限,但 IAM 更改通常可以更快地生效。如需了解详情,请参阅 Cloud KMS 资源一致性和访问权限变更传播。
价格
除了密钥操作费用(会计入您的 Google Cloud 项目),此集成不会产生额外费用。如需了解当前价格信息,请参阅 Cloud KMS 价格。