使用客户管理的加密密钥

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

如果您对密钥具有特定的合规性或监管要求 保护您数据的方法,您可以使用 客户管理的加密密钥 (CMEK),用于 Workflows。您的工作流和关联的静态数据 使用只有您能访问的加密密钥进行保护,而且您可以 使用 Cloud Key Management Service (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. 启用密钥后,Cloud KMS 会生成 Cloud Audit Logs, 停用,或者供 Workflows 资源用于加密和解密 数据。确保针对您的项目中的 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. 选择客户管理的加密密钥 (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 页面。

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

    进入 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:

  • 停用销毁您的 客户管理的加密密钥。停用 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 检索密钥的状态。

如果密钥状态不可用,工作流或其执行将返回 一个 state: UNAVAILABLE 值并在 stateError 字段中提供相关详情。

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

价格

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