使用客户管理的加密密钥

默认情况下,Google Cloud 会使用 Google 管理的加密密钥自动加密静态数据。如果您对保护数据的密钥有特定的合规性或监管要求,则可以对 Dataform 代码库使用客户管理的加密密钥 (CMEK)。

本指南介绍了如何将 CMEK 用于 Dataform,并逐步介绍了如何为 Dataform 代码库启用 CMEK 加密。

如需大致了解 CMEK(包括何时及为何启用 CMEK),请参阅 CMEK 文档

对代码库数据的 CMEK 加密

在对 Dataform 代码库应用 CMEK 加密时,系统会使用为代码库设置的 CMEK 保护密钥对该代码库中所有由 Dataform 管理的客户数据进行静态加密。这些数据包括以下内容:

  • Dataform 代码库及其工作区的 Git 代码库内容
  • 已编译的 SQL 查询和编译错误
  • 工作流操作的存储 SQL 查询
  • 已执行的工作流操作的错误详情

Dataform 会在以下情况下使用 CMEK 保护密钥:

  • 在每次需要解密静态存储的客户数据的操作中。 这些操作包括但不限于以下操作:
  • 在需要存储客户静态数据的每项操作中。 这些操作包括但不限于以下操作:

Dataform 负责管理仅与 Dataform 资源关联的客户数据的加密。Dataform 不通过执行 Dataform 工作流来管理在 BigQuery 中创建的客户数据的加密。如需加密在 BigQuery 中创建和存储的数据,请为 BigQuery 配置 CMEK

支持的键

Dataform 支持以下类型的 CMEK 密钥:

密钥的可用性因密钥类型和区域而异。如需详细了解 CMEK 密钥的适用地理位置,请参阅 Cloud KMS 位置

限制

Dataform 支持 CMEK,但存在以下限制:

  • 创建代码库后,您无法向该代码库应用 CMEK 保护密钥。您只能在创建代码库期间应用 CMEK 加密。
  • 您无法从代码库中移除 CMEK 保护密钥。
  • 您无法更改代码库的 CMEK 保护密钥。
  • CMEK 组织政策不可用。
  • 能否使用 Cloud HSM 密钥取决于可用情况。 如需详细了解密钥在不同位置的可用性,请参阅 Cloud KMS 位置

Cloud KMS 配额和 Dataform

您可以将 Cloud HSM 密钥与 Dataform 搭配使用。在 Dataform 中使用 CMEK 时,您的项目可以使用 Cloud KMS 加密请求配额。例如,每次对代码库内容进行更改时,由 CMEK 加密的 Dataform 代码库都会使用这些配额。仅当您使用硬件 (Cloud HSM) 或外部 (Cloud EKM) 密钥时,使用 CMEK 密钥执行的加密和解密操作才会影响 Cloud KMS 配额。如需了解详情,请参阅 Cloud KMS 配额

管理密钥

使用 Cloud KMS 执行所有密钥管理操作。 在 Cloud KMS 传播之前,Dataform 无法检测任何密钥更改或对其进行操作。某些操作(例如停用或销毁密钥)可能需要长达 3 小时才能传播。对权限的更改通常会快得多。

创建代码库后,Dataform 会调用 Cloud KMS 以确保密钥在对加密代码库数据每次操作期间仍然有效。

如果 Dataform 检测到您的 Cloud KMS 密钥已被停用或销毁,则存储在相应代码库中的所有数据将变得无法访问。

如果 Dataform 对 Cloud KMS 的调用检测到先前停用的密钥已重新启用,则 Dataform 会自动恢复访问权限。

如何处理不可用的密钥状态

在极少数情况下,例如在 Cloud KMS 不可用期间,Dataform 可能无法从 Cloud KMS 检索密钥的状态。

如果您的 Dataform 代码库受到密钥的保护,而该密钥在 Dataform 无法与 Cloud KMS 通信时启用,则加密的代码库数据将变得无法访问。

在 Dataform 能够重新与 Cloud KMS 重新连接并且 Cloud KMS 响应密钥有效之前,加密的代码库数据将始终无法访问。

反之,如果您的 Dataform 代码库受到密钥的保护,而该密钥在 Dataform 首次无法与 Cloud KMS 通信时被停用,那么在加密的代码库数据能够重新连接到 Cloud KMS 并且您重新启用密钥之前,将一直无法访问加密的代码库数据。

日志记录

如果您在项目中为 Cloud KMS API 启用审核日志记录,则可以在 Cloud Logging 中审核 Dataform 代表您发送到 Cloud KMS 的请求。这些 Cloud KMS 日志条目会显示在 Cloud Logging 中。如需了解详情,请参阅查看日志

准备工作

  • 确定您要在不同项目中还是在同一项目中运行 Dataform 和 Cloud KMS。我们建议您使用单独的项目,以便更好地控制权限。如需了解 Google Cloud 项目 ID 和项目编号,请参阅识别项目

  • 对于运行 Cloud KMS 的 Google Cloud 项目:

    1. 启用 Cloud Key Management Service API
    2. 按照创建密钥环和密钥中的说明创建密钥环和密钥。在与 Dataform 代码库位置匹配的位置创建密钥环:
      • 代码库必须使用匹配的区域密钥。例如,必须使用位于 asia-northeast3 的密钥环中的密钥保护区域 asia-northeast3 中的代码库。
      • global 区域无法与 Dataform 一起使用。
      如需详细了解 Dataform 和 Cloud KMS 支持的位置,请参阅 Cloud 位置

启用 CMEK

将 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色授予默认 Dataform 服务帐号后,Dataform 可以代表您访问密钥。

您的默认 Dataform 服务帐号 ID 采用以下格式:

service-YOUR_PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com

如需将 CryptoKey Encrypter/Decrypter 角色授予默认 Dataform 服务帐号,请按以下步骤操作:

控制台

  1. 在 Google Cloud 控制台中打开密钥管理页面。

    打开密钥管理页面

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

  3. 点击要向其添加角色的加密密钥对应的复选框。此时会打开权限标签。

  4. 点击添加成员

  5. 输入服务帐号的电子邮件地址

    • 如果该服务账号已经在成员列表中,则表明它具有现有角色。点击服务帐号的当前角色下拉列表。
  6. 点击选择角色下拉列表,点击 Cloud KMS,然后点击 Cloud KMS CryptoKey Encrypter/Decrypter 角色。

  7. 点击保存,将该角色应用于服务帐号。

gcloud

您可以使用 Google Cloud CLI 分配角色:

gcloud kms keys add-iam-policy-binding \
    --project=KMS_PROJECT_ID \
    --member serviceAccount:SERVICE_ACCOUNT \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --location=KMS_KEY_LOCATION \
    --keyring=KMS_KEY_RING \
    KMS_KEY

替换以下内容:

  • KMS_PROJECT_ID:运行 Cloud KMS 的 Google Cloud 项目的 ID
  • SERVICE_ACCOUNT:您的默认 Dataform 服务帐号的电子邮件地址
  • KMS_KEY_LOCATION:Cloud KMS 密钥的位置名称
  • KMS_KEY_RING:Cloud KMS 密钥的密钥环名称
  • KMS_KEY:Cloud KMS 密钥的名称

将 CMEK 应用于代码库

在创建代码库期间,您可以对 Dataform 代码库应用 CMEK 保护。

如需将 CMEK 加密应用于 Dataform 代码库,请在创建代码库时指定 Cloud KMS 密钥。有关说明,请参阅创建代码库

创建 Dataform 代码库后,您将无法更改该代码库的加密机制。

如需了解详情,请参阅限制

后续步骤