默认情况下,Workflows 会静态加密客户内容 。Workflows 会为您处理加密,您无需执行任何 其他操作。此选项称为“Google 默认加密”。
如果您想要控制加密密钥,则可以将 Cloud KMS 中客户管理的加密密钥 (CMEK) 与集成 CMEK 的服务(包括 Workflows)结合使用。使用 Cloud KMS 密钥时,您可以控制其保护级别、位置、轮替时间表、使用和访问权限以及加密边界。 使用 Cloud KMS 还可让您跟踪密钥使用情况、查看审核日志以及控制密钥生命周期。 这样您就可以在 Cloud KMS 中控制和管理用于保护数据的对称 密钥加密密钥 (KEK),而不是由 Google 拥有和管理这些密钥。
使用 CMEK 设置资源后,访问您的 Workflows 资源的体验与使用 Google 默认加密功能类似。 如需详细了解加密 选项,请参阅客户管理的加密密钥 (CMEK)。
您可以使用只有您可以访问的加密密钥保护工作流和关联的静态数据,并且可以使用 Cloud KMS 控制和管理这些密钥。
受 CMEK 保护的内容
部署工作流时,您可以指定 Cloud KMS 密钥。此密钥用于加密工作流及其执行:
工作流 需要包含有效工作流定义的源文件。此源文件使用密钥进行加密。
工作流执行 会运行当前工作流定义(特定工作流修订版本 )。使用在部署时与工作流修订版本关联的密钥,编译后的工作流以及任何存储的执行输入、输出和运行时数据都会被加密。这包括执行实参、 结果、错误和异常;传送的 Eventarc 事件; 以及回调和 HTTP 请求与响应。
准备工作
在 Workflows 中使用 CMEK 之前,请完成以下步骤:
启用该 API。
控制台
gcloud
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在控制台的底部启动,并显示命令行提示符。 Google Cloud Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟来完成初始化。
- 更新
gcloud组件。gcloud components update
- 为存储加密密钥的项目启用 Cloud KMS 和 Workflows API。
gcloud services enable cloudkms.googleapis.com workflows.googleapis.com
-
当 Workflows 资源启用密钥、禁用密钥或使用密钥来加密和解密数据时,Cloud KMS 会生成 Cloud Audit Logs。确保针对您的项目中的 Cloud KMS API 启用 日志记录 ,并确定哪些特定于日志记录的权限和角色适用于您的使用场景。如需了解详情,请参阅 Cloud KMS 审核日志记录信息。
创建 Cloud KMS 密钥环和密钥
您可以创建新的密钥环,也可以使用现有的密钥环。在密钥环中,您可以添加新密钥或使用现有密钥。
检索 Cloud KMS 密钥的资源 ID
为工作流启用 CMEK 时,需要 Cloud KMS 密钥的资源 ID。在本文档中,请参阅为工作流启用 CMEK。
控制台
在 Google Cloud 控制台中,前往 密钥管理 页面。
点击包含密钥的密钥环。
找到要检索其资源 ID 的密钥,点击 more_vert 更多。
点击复制资源名称 。
密钥的资源 ID 会复制到剪贴板。其格式类似于以下内容:
projects/PROJECT_NAME/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
一个密钥包含零个或多个密钥版本。密钥版本的资源 ID 是密钥 ID 加上斜杠 (
/) 和版本 ID。如需列出密钥的所有版本,请执行以下操作:- 点击密钥的名称。
- 对于特定版本,点击 更多。
- 点击复制资源名称 。
gcloud
列出一个给定密钥环的所有密钥:
gcloud kms keys list --keyring RING_NAME --location LOCATION
替换以下内容:
RING_NAME:密钥环的名称LOCATION:密钥环的区域
输出包含每个密钥的资源 ID。例如:
NAME: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
一个密钥包含零个或多个密钥版本。密钥版本的资源 ID 是密钥 ID 加上斜杠 (
/) 和版本 ID。列出密钥的所有版本:gcloud kms keys versions list --location LOCATION --keyring RING_NAME --key KEY_NAME
输出包含每个密钥版本的资源 ID。例如:
NAME: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME/2
向 Workflows 服务代理授予对密钥的访问权限
您必须向 Workflows 服务代理 授予 Cloud KMS CryptoKey Encrypter/Decrypter Identity and Access Management (IAM) 角色,以便其可以访问 Cloud KMS 密钥:
控制台
通过控制台为工作流启用 CMEK 时,系统会提示您向服务账号授予 Cloud KMS CryptoKey Encrypter/Decrypter 角色。如需了解详情,请参阅本文档中的 为工作流启用 CMEK部分。
gcloud
gcloud kms keys add-iam-policy-binding KEY_NAME \ --keyring RING_NAME \ --location LOCATION \ --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \ --role roles/cloudkms.cryptoKeyEncrypterDecrypter
替换以下内容:
KEY_NAME:密钥的名称。 例如my-key。RING_NAME:密钥环的名称。 例如my-keyring。LOCATION:密钥的位置。 例如us-central1。PROJECT_NUMBER:您的 Google Cloud 项目 编号。您可以在 控制台 的欢迎页面上,或通过运行以下命令来查找项目编号: Google Cloudexport PROJECT=$(gcloud info --format='value(config.project)') gcloud projects describe ${PROJECT} --format="value(projectNumber)"
只要服务代理具有 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色,您项目中的工作流就可以使用 CMEK
密钥加密和解密其数据。如果您撤消此角色,或者停用或销毁 CMEK 密钥,则无法访问这些数据。在本文档中,请参阅
停用 Cloud KMS。
为工作流启用 CMEK
创建工作流或在之后更新工作流时,您可以指定工作流用于数据加密的 Cloud KMS 密钥。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面。
点击要更新的工作流的名称。
系统会显示工作流详情 页面。
点击 修改。
选择 Cloud KMS 密钥 。
选择密钥类型 。
您可以手动管理密钥,也可以使用 Autokey按需生成密钥环 和密钥。如果 Autokey 选项处于停用状态,则表明其尚未与当前的资源类型集成。
在选择 Cloud KMS 密钥 列表中,选择或过滤 Cloud KMS 密钥。
可选:如需手动输入密钥的 资源名称,请在选择客户管理的密钥 列表中, 点击 手动输入密钥,然后以 指定的格式输入密钥资源名称。
如果出现提示,请将
cloudkms.cyptoKeyEncrypterDecrypter角色授予给具有workflows.serviceAgent角色的 Workflows 服务帐号。点击下一步 。
如需保存更改并部署更新后的工作流,请点击部署 。
gcloud
gcloud workflows deploy WORKFLOW_NAME \ --source=SOURCE_FILE \ --kms-key=KEY \ --location LOCATION \ --service-account=SERVICE_ACCOUNT
替换以下内容:
WORKFLOW_NAME:工作流的名称SOURCE_FILE:工作流源文件,对于 YAML 文件,其文件扩展名为yaml,对于 JSON 文件,其文件扩展名为json; 例如myWorkflow.yaml。KEY:密钥的资源 ID,格式为projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME。 您可以 检索密钥 ID。LOCATION:工作流的位置SERVICE_ACCOUNT:工作流将用于访问其他 Google Cloud 服务的服务帐号;例如SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com。我们强烈建议您使用具备访问必需资源所需的最低权限的服务帐号。如果留空,则使用默认服务帐号。如需了解详情,请参阅 授予工作流访问资源的权限 Google Cloud 。
请注意以下几点:
- 工作流修订版本和执行使用在部署时指定的密钥进行加密;之前使用较早密钥加密的资源仍使用该较早密钥进行加密。如果随后编辑工作流并指定了新密钥,则该工作流修订版本将使用新密钥进行加密,并且任何后续执行都将使用新密钥。
- 之前非 CMEK 加密的工作流修订版本和执行仍未加密。
- 如果您为工作流修订版本停用 CMEK,则系统在创建任何后续执行时都不会使用 CMEK 加密。在本文档中,请参阅 为工作流停用 CMEK。现有工作流修订版本和执行仍使用之前加密的密钥进行加密。
验证 Cloud KMS 集成
您可以通过显示工作流的元数据来验证 CMEK 集成。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面。
点击要验证的工作流的名称。
系统会显示工作流详情 页面。
点击详情 标签页。
加密 值显示了用于保护工作流及其执行的 Cloud KMS 密钥的资源 ID。
gcloud
gcloud workflows describe WORKFLOW_NAME \ --location=LOCATION
输出应类似如下所示:
createTime: '2022-08-10T19:57:58.233177709Z' cryptoKeyName: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME name: projects/PROJECT_NAME/locations/LOCATION/workflows/WORKFLOW_NAME revisionCreateTime: '2022-11-18T19:44:04.933633237Z' revisionId: 000009-8be serviceAccount: projects/PROJECT_NAME/serviceAccounts/SA_NAME@PROJECT_NAME.iam.gserviceaccount.com sourceContents: [...] state: ACTIVE updateTime: '2022-11-18T19:44:05.171793128Z'
cryptokeyName 值是用于保护工作流及其执行的 Cloud KMS 密钥的资源 ID。
为工作流停用 CMEK
您可以为工作流停用 CMEK,使其不再使用关联的 Cloud KMS 密钥。
控制台
在 Google Cloud 控制台中,前往 Workflows 页面。
点击要更新的工作流的名称。
系统会显示工作流详情 页面。
点击 修改。
如需清除 Cloud KMS 密钥 单选按钮, 请选择 Google-managed encryption key。
点击下一步 。
如需保存更改并部署更新后的工作流,请点击部署 。
gcloud
gcloud workflows deploy WORKFLOW_NAME \ --source=SOURCE_FILE \ --clear-kms-key \ --service-account=SERVICE_ACCOUNT
这会为当前工作流修订版本停用 CMEK,并且系统在创建任何后续执行时都不会使用 CMEK 加密。现有工作流修订版本和执行仍使用之前加密的密钥进行加密。
停用 Cloud KMS
如果您想撤消对工作流或工作流执行的数据访问权限,可以执行以下任一操作来停用 Cloud KMS:
停用或 销毁客户管理的加密密钥的主密钥版本。停用 CMEK 密钥版本会暂停受该密钥版本保护的所有数据的访问。销毁密钥版本才是永久性的。这两项操作都只会影响与特定密钥关联的工作流和工作流执行。您无法创建新的执行,也无法查看与已停用或已销毁的密钥关联的资源。任何活跃执行都会失败,并显示相应的错误消息。
撤消从 Workflows 服务代理撤消
cloudkms.cryptoKeyEncrypterDecrypterIAM 角色。这会影响项目中为使用 CMEK 进行加密提供支持的所有工作流。Google Cloud 您无法创建新的集成 CMEK 的工作流和执行,也无法查看任何 CMEK 加密的资源。任何活跃执行都会失败,并显示相应的错误消息。
虽然这两项操作均不能保证即时撤消访问权限,但 IAM 更改通常会传播得更快。如需了解详情, 请参阅 Cloud KMS 资源一致性 和 访问权限更改传播。
问题排查
将 Cloud KMS 与 Workflows 结合使用时,您可能会遇到错误。下表介绍了不同的问题以及如何解决这些问题。
| 问题 | 说明 |
|---|---|
权限 cloudkms.cryptoKeyVersions.useToEncrypt 被拒绝 |
提供的 Cloud KMS 密钥不存在,或者
权限未正确配置。
解决方案:
|
| 密钥版本未启用 | 提供的 Cloud KMS 密钥版本已停用。
解决方案:重新启用 Cloud KMS 密钥版本。 |
| 密钥环区域与要保护的资源不匹配 | 提供的 KMS 密钥环区域与工作流的区域不同。
解决方案:使用来自同一区域的 Cloud KMS 密钥环和受保护的 工作流。(请注意,它们可以位于不同的 项目中。)如需了解详情,请参阅 Cloud KMS 网点 和 Workflows 网点。 |
| 超出 Cloud KMS 配额限制 | 您已达到 Cloud KMS 请求的配额限制。
解决方案:限制 Cloud KMS 调用的数量或 提高配额限制。如需了解详情,请参阅 Cloud KMS 配额。 |
如何处理不可用的密钥状态
如果 Cloud KMS 因某种原因不可用,Workflows 可能无法从 Cloud KMS 中检索密钥的状态。
如果密钥状态不可用,工作流或其执行将在 stateError 字段中返回 state: UNAVAILABLE 值和相关详细信息。
如果密钥状态在工作流执行过程中变为不可用(例如,在回调期间撤消了权限),则会发生运行时错误,返回 state: FAILED 值,并在
error 字段中返回相关详细信息。
价格
除了密钥操作费用(会计入您的 Google Cloud 项目)以外,这种集成不会产生额外的费用 。如需了解当前价格 信息,请参阅 Cloud KMS 价格。