使用客户管理的加密密钥

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

如果您对保护数据的密钥有特定的合规性或监管要求,可以将客户管理的加密密钥 (CMEK) 用于 Workflows。您的工作流和关联的静态数据受只有您可以访问的加密密钥保护,并且您可以使用 Cloud Key Management Service (Cloud KMS) 控制和管理该密钥。

受 CMEK 保护的内容

部署工作流时,您可以指定 Cloud KMS 密钥。此密钥用于加密工作流及其执行:

  • 工作流需要包含有效工作流定义的源文件。此源文件已使用密钥进行加密。

  • 工作流执行会运行当前工作流定义(特定的工作流修订版本)。使用部署时与工作流修订版本关联的密钥,已编译的工作流以及任何存储的执行输入、输出和运行时数据都会进行加密。这包括执行参数、结果、错误和异常;传递的 Eventarc 事件,以及回调以及 HTTP 请求和响应。

准备工作

在 Workflows 中使用 CMEK 之前,请完成以下步骤:

  1. 启用 API。

    控制台

    1. 启用 Cloud KMS and Workflows API。

      启用 API

    gcloud

    1. 在 Google Cloud 控制台中,激活 Cloud Shell。

      激活 Cloud Shell

      Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

    2. 更新 gcloud 组件。
      gcloud components update
      
    3. 为存储加密密钥的项目启用 Cloud KMS 和 Workflows API。
      gcloud services enable cloudkms.googleapis.com workflows.googleapis.com
      
  2. 在 Workflows 资源启用、停用密钥或使用密钥加密和解密数据时,Cloud KMS 会生成 Cloud Audit Logs。请确保为项目中的 Cloud KMS API 启用日志记录 ,并且您已确定适用于您的用例的日志记录专用权限和角色。如需了解详情,请参阅 Cloud KMS 审核日志记录信息

创建 Cloud KMS 密钥环和密钥

您可以创建新的密钥环,也可以使用现有的密钥环。在密钥环中,您可以添加新密钥或使用现有密钥。

  1. 创建密钥环

  2. 为指定的密钥环创建密钥

检索 Cloud KMS 密钥的资源 ID

为工作流启用 CMEK 时,必须提供 Cloud KMS 密钥的资源 ID。在本文档中,请参阅为工作流启用 CMEK

控制台

  1. 在 Google Cloud 控制台中,前往密钥管理页面。

    前往“密钥管理”

  2. 点击包含密钥的密钥环。

  3. 找到您要检索其资源 ID 的密钥,点击 更多

  4. 点击复制资源名称

    密钥的资源 ID 会复制到剪贴板。其格式类似于以下内容:

    projects/PROJECT_NAME/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
    
  5. 一个密钥包含零个或多个密钥版本。密钥版本的资源 ID 由密钥 ID 加斜杠 (/) 和版本 ID 组成。如需列出密钥的所有版本,请执行以下操作:

    1. 点击密钥的名称。
    2. 如需特定版本,请点击 更多
    3. 点击复制资源名称

gcloud

  1. 列出一个给定密钥环的所有密钥:

    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
    
  2. 一个密钥具有零个或多个密钥版本。密钥版本的资源 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 Cloud 控制台的欢迎页面上或者通过运行以下命令找到项目编号:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gcloud projects describe ${PROJECT} --format="value(projectNumber)"
    

只要服务代理具有 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色,项目中的工作流即可使用 CMEK 密钥加密和解密其数据。如果您撤消此角色,或者停用或销毁 CMEK 密钥,则无法访问这些数据。在本文档中,请参阅停用 Cloud KMS

为工作流启用 CMEK

创建工作流或更新工作流时,您可以指定工作流应该用于数据加密的 Cloud KMS 密钥。

控制台

  1. 在 Google Cloud 控制台中,转到工作流页面。

    进入 Workflows

  2. 点击您要更新的工作流的名称。

    随即会出现工作流详细信息页面。

  3. 点击 修改

  4. 选择客户管理的加密密钥 (CMEK)

  5. 选择客户管理的密钥列表中,选择或过滤 Cloud KMS 密钥。

  6. 可选:如需手动输入密钥的资源名称,请在选择客户管理的密钥列表中,点击手动输入密钥,然后按照指定格式输入密钥资源名称。

  7. 如果出现提示,请将 cloudkms.cyptoKeyEncrypterDecrypter 角色授予具有 workflows.serviceAgent 角色的 Workflows 服务帐号。

  8. 点击下一步

  9. 如需保存更改并部署更新后的工作流,请点击部署

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 集成。

控制台

  1. 在 Google Cloud 控制台中,转到工作流页面。

    进入 Workflows

  2. 点击您要验证的工作流的名称。

    随即会出现工作流详细信息页面。

  3. 点击详情标签页。

    加密值会显示用于保护工作流及其执行的 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 密钥。

控制台

  1. 在 Google Cloud 控制台中,转到工作流页面。

    进入 Workflows

  2. 点击您要更新的工作流的名称。

    随即会出现工作流详细信息页面。

  3. 点击 修改

  4. 如需清除客户管理的加密密钥 (CMEK) 单选按钮,请选择 Google 管理的加密密钥

  5. 点击下一步

  6. 如需保存更改并部署更新后的工作流,请点击部署

gcloud

gcloud workflows deploy WORKFLOW_NAME \
    --source=SOURCE_FILE \
    --clear-kms-key \
    --service-account=SERVICE_ACCOUNT

这会对当前工作流修订版本停用 CMEK,后续执行的任何作业都不会在 CMEK 加密的情况下使用。现有工作流修订版本和执行作业仍使用先前加密的密钥进行加密。

停用 Cloud KMS

如果要撤消对工作流或工作流执行作业的数据访问权限,您可以执行以下任一操作来停用 Cloud KMS:

  • 停用destroy CMEK 的主密钥版本。停用 CMEK 密钥版本后,系统会暂停访问受该密钥版本保护的所有数据。销毁密钥版本是此操作的永久版本。两者都只会影响与特定密钥关联的工作流和工作流执行。您无法创建新的执行作业,也无法查看与已停用或已销毁的密钥关联的资源。所有进行中的执行都将失败,并显示相应的错误消息。

  • 从 Workflows 服务代理中撤消 cloudkms.cryptoKeyEncrypterDecrypterIAM 角色。这会影响 Google Cloud 项目中支持使用 CMEK 进行加密的所有工作流。您无法创建新的集成 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 价格