本指南介绍了如何将 CMEK 用于 Dataform,并逐步引导您启用 Dataform 代码库的 CMEK 加密。
默认情况下,Dataform 会对静态客户内容进行加密。Dataform 会为您处理加密,您无需执行任何其他操作。此选项称为 Google 默认加密。
如果您想要控制加密密钥,则可以将 Cloud KMS 中客户管理的加密密钥 (CMEK) 与集成 CMEK 的服务(包括 Dataform)结合使用。使用 Cloud KMS 密钥时,您可以控制其保护级别、位置、轮替时间表、使用和访问权限以及加密边界。此外,您还可使用 Cloud KMS 跟踪密钥使用情况、查看审核日志并控制密钥生命周期。这样您就可以在 Cloud KMS 中控制和管理用于保护您数据的对称密钥加密密钥 (KEK),而不是由 Google 拥有和管理这些密钥。
使用 CMEK 设置资源后,访问 Dataform 资源的体验与使用 Google 默认加密功能类似。如需详细了解加密选项,请参阅客户管理的加密密钥 (CMEK)。
对代码库数据进行 CMEK 加密
将 CMEK 加密应用于 Dataform 代码库后,该代码库中所有 Dataform 管理的客户数据都会在静态状态下使用为该代码库设置的 CMEK 保护密钥进行加密。这些数据包括:
- Dataform 代码库及其工作区的 Git 代码库内容
- 已编译的 SQL 查询和编译错误
- 工作流操作的存储 SQL 查询
- 已执行的工作流操作的错误详情
Dataform 会在以下情况下使用 CMEK 保护密钥:
- 在需要解密静态存储的客户数据的每项操作期间。这些操作包括但不限于:
- 对用户询问的回答,例如
compilationResults.query
。 - 创建需要之前创建的加密代码库数据的 Dataform 资源,例如工作流调用。
- 用于更新远程代码库的 Git 操作,例如推送 Git 提交内容。
- 对用户询问的回答,例如
- 在需要将客户数据存储为静态数据的每项操作期间。这些操作包括但不限于:
- 对用户询问的回答,例如
compilationResults.create
。 - 对工作区执行的 Git 操作,例如拉取 Git 提交内容。
- 对用户询问的回答,例如
Dataform 仅管理与 Dataform 资源相关联的客户数据的加密。Dataform 不会管理通过执行 Dataform 工作流在 BigQuery 中创建的客户数据的加密。如需对在 BigQuery 中创建和存储的数据进行加密,请为 BigQuery 配置 CMEK。
支持的按键
Dataform 支持以下类型的 CMEK 密钥:
密钥可用性因密钥类型和地区而异。 如需详细了解 CMEK 密钥的地理位置可用性,请参阅 Cloud KMS 位置。
限制
Dataform 支持 CMEK,但存在以下限制:
- CMEK 加密代码库的大小上限为 512 MB。
- CMEK 加密代码库中工作区的大小上限为 512 MB。
- 在代码库创建后,您无法向代码库应用 CMEK 保护密钥。您只能在创建代码库期间应用 CMEK 加密。
- 您无法从代码库中移除 CMEK 保护密钥。
- 您无法更改代码库的 CMEK 保护密钥。
- 如果您为 Google Cloud 项目设置了默认 Dataform CMEK 密钥,则在 Google Cloud 项目位置中创建的所有新代码库都必须使用 CMEK 加密。在 Google Cloud 项目位置中创建新代码库时,您可以应用默认的 Dataform CMEK 密钥或其他 CMEK 密钥,但无法应用默认的静态数据加密。
- 如果您更改默认 Dataform CMEK 密钥的值,则之前的值会应用于现有代码库,而更新后的值会应用于更改后创建的代码库。
- 您只能为每个 Google Cloud 项目代码库位置设置一个默认 Dataform CMEK 密钥。
- CMEK 组织政策不可用。
- 使用 Cloud HSM 和 Cloud EKM 密钥需视其可用性而定。如需详细了解密钥在各个位置的可用性,请参阅 Cloud KMS 位置。
Cloud KMS 配额和 Dataform
您可以将 Cloud HSM 和 Cloud EKM 密钥与 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 EKM 搭配使用
除了使用存储在 Cloud KMS 上的密钥之外,您还可以使用存储在支持的外部密钥管理合作伙伴处的密钥。为此,请使用 Cloud External Key Manager (Cloud EKM) 创建和管理外部密钥,这些密钥是指向位于 Google Cloud之外的密钥的指针。如需了解详情,请参阅 Cloud External Key Manager。
使用 Cloud EKM 创建外部密钥后,您可以在创建代码库时提供该密钥的 ID,将其应用于新的 Dataform 代码库。此过程与将 Cloud KMS 密钥应用于新代码库的过程相同。
使用 Dataform 默认的 CMEK 密钥
如需使用相同的 CMEK 密钥加密多个 Dataform 代码库,您可以为 Google Cloud 项目设置默认的 Dataform CMEK 密钥。您必须为默认的 Dataform CMEK 密钥指定 Google Cloud 项目的位置。您只能为每个 Google Cloud 项目设置一个默认 CMEK 密钥。
设置默认 Dataform CMEK 密钥后,Dataform 会默认将该密钥应用于在 Google Cloud 项目位置中创建的所有新代码库。创建代码库时,您可以使用默认密钥,也可以选择其他 CMEK 密钥。
如何处理不可用的密钥状态
在极少数情况下,例如 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 Logging 中查看这些 Cloud KMS 日志条目。如需了解详情,请参阅查看日志。
准备工作
确定您要在不同的项目中还是在同一个项目中运行 Dataform 和 Cloud KMS。我们建议您使用单独的项目,以便更好地控制权限。如需了解 Google Cloud 项目 ID 和项目编号,请参阅识别项目。
对于运行 Cloud KMS 的 Google Cloud 项目:
- 启用 Cloud Key Management Service API
- 按照创建密钥环和密钥中的说明创建密钥环和密钥。请在与 Dataform 代码库的位置匹配的位置创建密钥环:
-
仓库必须使用匹配的区域密钥。例如,区域
asia-northeast3
中的代码库必须使用位于asia-northeast3
中的密钥环中的密钥进行保护。 -
global
区域无法与 Dataform 搭配使用。
-
仓库必须使用匹配的区域密钥。例如,区域
启用 CMEK
将 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter
) 角色授予默认 Dataform 服务账号后,Dataform 将能够代表您访问该密钥。
默认的 Dataform 服务账号 ID 采用以下格式:
service-YOUR_PROJECT_NUMBER @gcp-sa-dataform.iam.gserviceaccount.com
如需向默认 Dataform 服务账号授予 CryptoKey Encrypter/Decrypter 角色,请按以下步骤操作:
在 Google Cloud 控制台中打开密钥管理页面。
点击包含密钥的密钥环的名称。
点击要向其添加角色的加密密钥对应的复选框。此时会打开权限标签。
点击添加成员。
输入服务账号的电子邮件地址
- 如果该服务账号已经在成员列表中,则表明它具有现有角色。点击服务账号的当前角色下拉列表。
点击选择角色下拉列表,点击 Cloud KMS,然后点击 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
点击保存,将角色应用到服务账号。
您可以使用 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项目的 IDSERVICE_ACCOUNT
:默认 Dataform 服务账号的电子邮件地址KMS_KEY_LOCATION
:Cloud KMS 密钥的位置名称KMS_KEY_RING
:Cloud KMS 密钥的密钥环名称KMS_KEY
:Cloud KMS 密钥的名称
设置默认 Dataform CMEK 密钥
为 Google Cloud 项目设置默认 Dataform CMEK 密钥后,您可以使用同一 CMEK 密钥加密多个代码库。如需了解详情,请参阅为 Dataform 代码库使用默认密钥。
如需设置或修改默认 CMEK 密钥,请在以下请求中调用 Dataform API:
curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"defaultKmsKeyName":"projects/PROJECT_ID /locations/PROJECT_LOCATION /keyRings/KMS_KEY_RING /cryptoKeys/KMS_KEY "}' \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID /locations/PROJECT_LOCATION /config
替换以下内容:
- KMS_KEY_RING:Cloud KMS 密钥的密钥环名称。
- KMS_KEY:Cloud KMS 密钥的名称。
- PROJECT_ID:您的 Google Cloud 项目的 ID。
- PROJECT_LOCATION:您的 Google Cloud 项目的位置名称。
移除默认的数据表格 CMEK 密钥
如需从 Google Cloud 项目中移除默认的 Dataform CMEK 密钥,请在以下请求中调用 Dataform API:
curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"defaultKmsKeyName":""}' \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID /locations/PROJECT_LOCATION /config
替换以下内容:
- PROJECT_ID:您的 Google Cloud 项目的 ID。
- PROJECT_LOCATION:您要取消设置默认 CMEK 的 Google Cloud 项目的位置名称。
检查是否设置了默认 Dataform CMEK 密钥
如需检查是否为您的 Google Cloud 项目设置了默认的 Dataform CMEK 密钥,请在以下请求中调用 Dataform API:
curl -X GET \
-H "Content-Type: application/json" \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID /locations/PROJECT_LOCATION /config
替换以下内容:
- PROJECT_ID:您的 Google Cloud 项目的 ID。
- PROJECT_LOCATION:您的 Google Cloud 项目的位置名称。
将 CMEK 应用于代码库
您可以在创建代码库期间对 Dataform 代码库应用 CMEK 保护。
如需对 Dataform 代码库应用 CMEK 加密,请在创建代码库时选择使用默认 Dataform CMEK 密钥进行加密,或指定唯一的 Cloud KMS 密钥。如需了解相关说明,请参阅创建代码库。
创建 Dataform 代码库后,您无法更改其加密机制。
如需了解详情,请参阅限制。
后续步骤
- 如需详细了解 CMEK,请参阅 CMEK 概览。
- 如需详细了解 Cloud KMS 配额,请参阅 Cloud KMS 配额。
- 如需详细了解 Cloud KMS 价格,请参阅 Cloud KMS 价格。
- 如需详细了解 Dataform 代码库,请参阅创建代码库。