客户管理的加密密钥 (CMEK) 概览

默认情况下,Google Cloud 中的所有静态数据(包括 Spanner 中的数据)均采用 Google 管理的默认加密方式进行保护。Google Cloud 会为您处理和管理此默认加密,您无需进行任何其他操作。

如果您对保护数据的密钥有特定的合规性或监管要求,可以为 Spanner 使用客户管理的加密密钥 (CMEK)。您的 Spanner 数据库不是由 Google 来管理用于保护数据的加密密钥,而是通过您在 Cloud Key Management Service (KMS) 中控制和管理的密钥来保护您的数据。该密钥可以是对称密钥Cloud HSM 密钥Cloud External Key Manager 密钥

CMEK 不支持自定义实例配置

本页面介绍了适用于 Spanner 的 CMEK。如需大致了解 CMEK(包括其启用时间和原因),请参阅 Cloud KMS 文档

特性

  • 数据访问权限控制:管理员可以轮替、管理对 Spanner 中用于保护静态数据的密钥的访问权限、停用或销毁密钥。
  • 可审核性:如果您在项目中为 Cloud KMS API 启用审核日志记录,针对该密钥的所有操作(包括由 Spanner 执行的操作)都会记录在 Cloud Logging 中。Cloud EKM 密钥支持密钥访问理由,这会为所有密钥请求添加一个理由字段。借助特定的外部密钥管理合作伙伴,您可以根据理由自动批准或拒绝这些请求。
  • 性能:Spanner 性能或服务等级协议没有任何变化。

价格

Spanner 对支持 CMEK 的数据库计费,就像对任何其他数据库计费一样;不会产生额外的 Spanner 费用。如需了解详情,请参阅 Spanner 价格

Cloud KMS 会向您收取密钥费用以及对该密钥执行的任何加密操作的费用(当 Spanner 使用该密钥进行加密/解密时)。根据 Spanner 生成的预期加密操作数量,我们预计这些费用将会降至最低。如需了解详情,请参阅 Cloud KMS 价格

受 CMEK 保护的内容

在支持 CMEK 的数据库中,Spanner 会使用您的 Cloud KMS 密钥保护静态数据。这包括存储在磁盘或闪存上的数据库中的数据。

有一些例外情况。以下类型的数据受 Google 静态默认加密保护,而不是受 CMEK 密钥保护:

  • 行密钥的子集,用于标记范围边界
  • 调试数据,包括核心转储和操作日志
  • 传输中或内存中的数据
  • 数据库元数据

Spanner 中有三层加密。静态数据分成子文件区块进行存储,每个区块都在存储系统层级以单独的加密密钥进行加密。用于对块中的数据进行加密的密钥称为数据加密密钥 (DEK)。由于 Google 的密钥很多,且需要提供低延迟、高可用性的服务,因此这些密钥都存储在用其加密的数据附近。DEK 本身又使用密钥加密密钥 (KEK) 进行加密(也称为“封装”)。最后,每个 KEK 都通过客户管理的加密密钥进行加密。

当您轮替 CMEK 密钥时,Spanner 只会使用 CMEK 密钥的最新主版本重新加密中间 KEK。重新加密完成后,停用或删除旧版本的 CMEK 密钥不会停用对数据库的访问权限。您还可以查看密钥版本(要使用这些版本来保护数据库)。

使用 CMEK

展示使用客户管理的加密密钥进行加密的示意图

不使用 CMEK

展示使用 Google 管理的加密密钥进行加密的示意图

启用 CMEK

如需将 CMEK 用于 Spanner 数据库,您必须创建一个新数据库,并在创建数据库时指定 Cloud KMS 密钥。

Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色授予 Google 管理的 Spanner 服务帐号后,Spanner 将能够代表您访问密钥。

如需详细说明,请参阅使用 CMEK

对于客户管理的密钥和 Google 管理的密钥,Spanner 的数据访问 API(例如用于管理会话和对数据执行事务的 API)完全相同。在读取或写入数据时,应用无需指定密钥或加密配置。所有加密都由该服务处理。

管理密钥

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

创建数据库后,Spanner 大约每 5 分钟就会调用一次 Cloud KMS,以确保密钥仍然有效。

如果 Spanner 检测到您的 Cloud KMS 密钥已停用或销毁,会立即启动使数据库无法访问的操作。对数据库的任何后续调用(包括会话、读取和写入)都将返回 FAILED_PRECONDITION 错误:KMS key required by the Spanner resource is not accessible.

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

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

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

如果您的 Spanner 数据库受到在 Spanner 首次无法与 Cloud KMS 通信时启用的密钥保护,则 Spanner 会继续尽力支持完整的数据库操作(最长 1 小时),以最大限度降低任何此类事件对工作负载的影响。

一小时后,如果 Spanner 仍然无法与 Cloud KMS 连接,则 Spanner 会开始将数据库离线作为一项保护措施。在可以重新与 Cloud KMS 重新连接且 Cloud KMS 响应密钥有效之前,Spanner 数据库中的数据将始终无法访问。

相反,如果您的 Spanner 数据库受到密钥保护,而该密钥在 Spanner 首次无法与 Cloud KMS 通信时处于停用状态,则您的数据库将保持无法访问,直到它能够重新连接到 Cloud KMS 并且您重新启用该密钥。

外部密钥注意事项

当您使用 Cloud EKM 密钥时,Google 无法控制由外部管理的密钥在外部密钥管理合作伙伴系统中的可用性。

如果外部管理的密钥不可用,Spanner 会继续支持使用该密钥的缓存版本的完整数据库操作,持续长达一小时。

一小时后,如果 Spanner 仍然无法与 Cloud KMS 连接,则 Spanner 会开始将数据库离线作为一项保护措施。对数据库的调用将失败,并显示 FAILED_PRECONDITION 错误:External key error: Could not find a key resource at the key URI.

如需了解使用外部密钥的更多注意事项,请参阅 Cloud External Key Manager 文档

备份和恢复

Spanner 备份(如数据库)可以受到 CMEK 或 Google 管理的加密的保护。默认情况下,备份使用与其数据库相同的加密配置,但您可以在创建备份时指定不同的加密配置来替换此行为。如果备份启用了 CMEK,则在创建备份时会使用主要版本的 KMS 密钥对备份进行加密。创建备份后,即使 KMS 密钥已轮替,其密钥和密钥版本也无法修改。如需了解详情,请参阅备份数据库

从备份恢复数据库时,默认情况下,恢复的数据库使用与备份的加密配置相同。您可以通过在恢复数据库时指定不同的加密配置来替换此行为。如需恢复启用 CMEK 的备份,用于加密备份的密钥和密钥版本都必须可用。如需了解详情,请参阅从备份恢复

日志记录

如果您在项目中为 Cloud KMS API 启用审核日志记录,则可以在 Cloud Logging 中审核 Spanner 代表您发送到 Cloud KMS 的请求。您可以在 Cloud Logging 中查看这些 Cloud KMS 日志条目

在您的组织内要求或限制 CMEK

您可以针对各种 Google Cloud 产品(包括 Spanner)设置有关使用 CMEK 保护的组织级政策。通过这些政策,您可以:

  • 要求组织创建的新 Spanner 数据库使用 CMEK 保护。

  • 限制贵组织的哪些 Cloud KMS 密钥可用于 CMEK 保护。

如需了解详情,请参阅 CMEK 组织政策