使用客户管理的加密密钥

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

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

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

代码库数据的 CMEK 加密

当您将 CMEK 加密应用于 Dataform 代码库时,系统会使用为该代码库设置的 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 无法检测或响应任何密钥更改。某些操作(例如停用或销毁密钥)可能需要长达三个小时才能传播。对权限的更改通常传播得更快。

创建仓库后,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 控制台中打开 Key Management(密钥管理)页面。

    打开 Key Management 页面

  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 代码库一经创建,您便无法更改其加密机制。

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

后续步骤