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

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

默认情况下,Spanner 会以 REST。Spanner 会为您处理加密,您无需执行任何其他操作。此选项称为 Google 默认加密

如果您想控制加密密钥,可以使用客户管理的加密密钥 将 Cloud KMS 中的 CMEK 与 CMEK 集成的服务结合使用,包括 Spanner。使用 Cloud KMS 密钥时,您可以控制其保护级别、位置、轮替时间表、使用和访问权限以及加密边界。此外,您还可使用 Cloud KMS 跟踪密钥使用情况、查看审核日志并控制密钥生命周期。这样您就可以在 Cloud KMS 中控制和管理用于保护您数据的对称密钥加密密钥 (KEK),而不是由 Google 拥有和管理这些密钥。

使用 CMEK 设置资源后,访问您的 Spanner 资源与使用 Google 默认加密类似。 如需详细了解加密选项,请参阅客户管理的加密密钥 (CMEK)

如需了解如何使用手动创建的 CMEK 来保护 Spanner 资源,请参阅使用 CMEK 保护数据库

将 CMEK 与 Cloud KMS Autokey 结合使用

您可以手动创建 CMEK 来保护 Spanner 资源或使用 Cloud KMS Autokey。借助 Autokey,在 Spanner 中创建资源时,系统会按需生成密钥环和密钥。 系统会创建使用密钥执行加密和解密操作的服务代理(如果它们尚不存在),并授予所需的 Identity and Access Management (IAM) 角色。如需了解详情,请参阅 Autokey 概览

Spanner 为 只有在以下情况下,才与 Cloud KMS Autokey 兼容: 使用 Terraform 或 REST API 创建资源您不能使用 使用 Cloud KMS Autokey 创建多个区域级(单区域) Spanner 数据库的 Cloud KMS 密钥。

使用由以下人员创建的 CMEK Cloud KMS Autokey 可保护您的 Spanner 资源, 请按照使用 Autokey 和 Secret Manager 资源 示例。

特性

  • 数据访问权限控制:管理员可以轮替用于保护 Spanner 中的静态数据的密钥、管理对该密钥的访问权限以及停用或销毁该密钥。
  • 可审核性:如果您为项目中的 Cloud KMS API 启用审核日志记录,则针对密钥的所有操作(包括由 Spanner 执行的操作)会在 Cloud Logging 中记录并可供查看。 Cloud EKM 密钥支持密钥访问理由,这会为所有密钥请求添加一个理由字段。借助特定的外部密钥管理合作伙伴,您可以根据理由自动批准或拒绝这些请求。
  • 性能:使用 CMEK 不会对 Spanner 性能服务等级协议造成任何影响。
  • 支持多个区域密钥:您可以创建多个区域(单区域)Cloud KMS 密钥,以保护 Spanner 自定义、双区域或多区域实例配置中的数据库。

价格

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

Cloud KMS 会向您收取密钥费用和 对密钥进行加密操作(当 Spanner 使用 密钥)。根据 Spanner 生成的加密操作的预期数量,我们预计这些费用会很小。如需了解详情,请参阅 Cloud KMS 价格

受 CMEK 保护的内容

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

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

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

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

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

使用 CMEK

演示使用客户管理的加密密钥进行加密的图表

不使用 CMEK

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

启用 CMEK

如需将 CMEK 用于 Spanner 数据库,您必须在创建数据库时创建新的数据库并指定 Cloud KMS 密钥。将 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色授予 Spanner 服务账号后,Spanner 将能够代表您访问该密钥。如需详细说明,请参阅使用 CMEK 保护数据库

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

管理密钥

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

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

如果 Spanner 检测到您的 Cloud KMS 密钥已被 停用或销毁后,会导致数据库无法访问的操作 。对数据库的任何后续调用(包括会话、读取和写入)都会返回 FAILED_PRECONDITION 错误:KMS key required by the Spanner resource is not accessible.如果 Spanner 对 Cloud KMS 的调用检测到之前已停用的密钥已重新启用,则 Cloud KMS 会自动恢复对 Spanner 数据库的访问权限。

此外,如果数据库受多个区域密钥和所有密钥的保护 停用或销毁后,Spanner 会立即开始 使数据库无法访问。如果 Spanner 检测到只有一个 数据库密钥的子集被停用或销毁,则会停用 在 12 小时内访问数据库。仅停用或销毁 强烈建议不要在启用了 CMEK 的数据库中使用密钥子集,如果这样做, 会导致不确定的行为。为防止出现这种情况,您可以使用 Spanner CMEK 密钥指标 (instance/replica/cmek/total_keys),在部分键被触发时触发提醒。 停用或销毁。如需了解详情,请参阅为停用部分 CMEK 创建提醒

创建提醒以停用一部分 CMEK

您可以使用 Spanner CMEK 密钥 (/instance/replica/cmek/total_keys) 指标,在 CMEK 的子集时触发提醒 已停用或销毁。如需创建此提醒政策,请展开以下步骤和设置:

CMEK 提醒政策的设置。

新建条件
字段

资源和指标 资源菜单中,选择 Spanner 实例
指标类别菜单中,选择实例
指标菜单中,选择 CMEK 密钥

(metric.type 为 spanner.googleapis.com/instance/replica/cmek/total_keys)。
过滤 instance_id = INSTANCE_ID
is_key_revoked = TRUE
跨时间序列
时间序列分组依据
database
跨时间序列
时间序列聚合
sum
滚动窗口 10 m
滚动窗口函数 mean
配置提醒触发器
字段

条件类型 Threshold
提醒触发器 Any time series violates
阈值位置 Above threshold
触发阈值 0
重新测试窗口 1 hr
新建条件
字段

资源和指标 资源菜单中,选择 Spanner 实例
指标类别菜单中,选择实例
指标菜单中,选择 CMEK 密钥

(metric.type 为 spanner.googleapis.com/instance/replica/cmek/total_keys)。
过滤 instance_id = INSTANCE_ID
is_key_revoked = FALSE
跨时间序列
时间序列分组依据
database
跨时间序列
时间序列聚合
sum
滚动窗口 10 m
滚动窗口函数 mean
配置提醒触发器
字段

条件类型 Threshold
提醒触发器 Any time series violates
阈值位置 Above threshold
触发阈值 0
重新测试窗口 1 hr
配置提醒触发器
字段

多条件触发器 All conditions are met

创建提醒后,如果 Spanner 检测到部分 CMEK 已停用,则提醒的政策详情页面上的突发事件表格下方会显示突发事件摘要项。您还可以设置可选的通知渠道。如需了解详情,请参阅创建和管理通知渠道

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

在极少数情况下,例如在 Cloud KMS 不可用,Spanner 可能无法检索 从 Cloud KMS 中获取您的密钥

如果您的 Spanner 数据库受在 Spanner 首次无法与之通信的时间 Cloud KMS,Spanner 继续支持完整数据库 同时尽力提供最长一个小时的运维服务, 此类突发事件对工作负载的影响。如果 Spanner 仍然无法连接到 Cloud KMS, Spanner 开始将数据库离线以保护数据 衡量。Spanner 数据库中的数据仍然无法访问 直到数据库可以与 Cloud KMS 和 Cloud KMS 重新连接为止 响应该密钥有效。

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

如果您使用多个区域密钥来保护 Spanner 数据库,则只有由位于不可用区域 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 EKM 密钥来保护自己的 Spanner 数据库,仅限受 键不可用。

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

备份和恢复

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

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

您可以对使用多个区域性密钥加密的数据库执行备份操作,例如创建、复制和恢复。

创建的所有备份 备份时间表 可以由 CMEK 或 Google 拥有的密钥和由 Google 管理的密钥保护。不过,增量备份时间表只能使用 Google 拥有且 Google 管理的密钥进行加密。

日志记录

您可以审核 Spanner 发送的请求, 代表您在 Cloud Logging 中使用 Cloud KMS(如果您满足以下条件) 已启用审核日志记录 使用 Cloud KMS API。您可以在 Cloud Logging 中查看这些 Cloud KMS 日志条目

在组织内要求或限制 CMEK

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

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

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

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

后续步骤