使用客户管理的加密密钥

默认情况下,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 之前,请完成以下步骤:

  1. 启用 API。

    控制台

    1. Enable the Cloud KMS and Workflows 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. 更新 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 页面。

    进入 Workflows

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

    系统随即会显示工作流详情页面。

  3. 点击 修改

  4. 选择 Cloud KMS 密钥

  5. 选择密钥类型

    您可以手动管理密钥,也可以使用 Autokey,以按需生成密钥环和密钥。如果 Autokey 选项不可用,则表明其尚未与当前的资源类型集成。

  6. 选择 Cloud KMS 密钥列表中,选择或过滤 Cloud KMS 密钥。

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

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

  9. 点击下一步

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

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 页面。

    进入 Workflows

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

    系统随即会显示工作流详情页面。

  3. 点击详情标签页。

    Encryption 值显示用于保护工作流及其执行的 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 页面。

    进入 Workflows

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

    系统随即会显示工作流详情页面。

  3. 点击 修改

  4. 如需清除 Cloud KMS 密钥单选按钮,请选择 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:

  • 停用销毁客户管理的加密密钥的主要密钥版本。停用 CMEK 密钥版本会暂停受该密钥版本保护的所有数据的访问,销毁密钥版本才是永久性的(24 小时后)。这两种操作仅会影响与特定密钥关联的工作流和工作流执行。您无法创建新的执行作业,也无法查看与已停用或已销毁的密钥关联的资源。所有正在执行的任务都将失败,并显示相应的错误消息。

  • 从 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 值和相关详细信息。

如果密钥状态在工作流执行过程中变为不可用(例如,在回调期间撤消了权限),则会发生运行时错误,并在 error 字段中返回 state: FAILED 值和相关详细信息。

价格

除了针对您的 Google Cloud 项目计费的密钥操作以外,这种集成不会产生额外的费用。如需了解当前价格信息,请参阅 Cloud KMS 价格