客户提供的加密密钥 (CSEK) 是 Google Cloud Storage 和 Google Compute Engine 中的一项功能。如果您提供自己的加密密钥,Google 会使用您的密钥来保护 Google 生成的用于加密和解密数据的密钥。
本主题中使用的术语包括:
数据加密密钥 (DEK):用于加密数据的密钥。
密钥加密密钥 (KEK):用于加密或“封装”数据加密密钥的密钥。
集群管理器:在 Google 生产基础架构中以集群管理员身份运行的一组进程。实现管理 Compute Engine 资源(例如磁盘和虚拟机实例)的逻辑。存储与这些资源相关的元数据。
实例管理器:在 Google 生产基础架构中以实例管理员身份运行的一组进程。对机群上的虚拟机实例(进程)执行修改,例如虚拟机启动/停止或磁盘挂接/分离。集群管理器指定虚拟机在任何时间点应处于什么状态,实例管理器则负责具体执行。
客户提供的加密密钥的工作原理
以下部分介绍了客户提供的加密密钥与 Google Cloud Storage 和 Google Compute Engine 搭配使用的方式。
Cloud Storage
在 Cloud Storage 使用客户提供的加密密钥时,请注意以下事项:
您在调用 API 时要提供原始 CSEK。此密钥将从 Google 前端传输到存储系统的内存。此密钥在 Google Cloud Storage 中用作您的数据的密钥加密密钥。
原始 CSEK 将用于解封封装的区块密钥,以便在内存中创建原始区块密钥。原始区块密钥可用于解密保存在存储系统中的数据区块。此类密钥在 Google Cloud Storage 中用作您的数据加密密钥 (DEK)。
密钥 | 存储位置 | 用途 | 可访问截止时间 |
---|---|---|---|
原始 CSEK | 存储系统内存 | 由客户提供。 区块密钥的密钥加密密钥 (KEK)。 封装区块密钥。 |
客户请求的操作(例如 insertObject 或 getObject )完成 |
封装的区块密钥 | 存储设备 | 保护静态存储的区块密钥 | 存储对象被删除 |
原始区块密钥 | 存储设备的内存 | 数据的数据加密密钥 (DEK)。 读/写磁盘数据。 |
客户请求的操作完成 |
Compute Engine
在 Compute Engine 中使用 CSEK 时,请注意以下事项:
您在调用 API 时需提供原始 CSEK。
- 或者,您可以提供封装有公钥的 CSEK。
此密钥将从 Google 前端传输到集群管理器的后端。
- 如果提供了封装 CSEK,则系统将使用 Google 拥有的非对称封装密钥解封该密钥。
- 原始 CSEK 将与每个永久性磁盘加密随机数组合,以便生成 CSEK 派生密钥。此密钥在 Google Compute Engine 中用作数据的密钥加密密钥。
在集群管理器前端,CSEK 和 CSEK 派生密钥均仅保留在集群管理器内存中。CSEK 派生密钥在集群管理器内存中用于解封存储在集群管理器实例元数据和实例管理器元数据中的封装磁盘密钥,其中启用了自动重启(此类密钥与实例元数据不同)。
- CSEK 派生密钥将用于在创建磁盘时封装原始磁盘密钥,以及在访问磁盘时解封原始磁盘密钥。
- 如果启用了自动重启,则集群管理器会在虚拟机有效期之内保留封装磁盘密钥,以便在发生崩溃时可以重新启动虚拟机。该封装磁盘密钥使用 Google 拥有的对称包装密钥进行封装。它的权限仅允许 Google Compute Engine 对其进行使用。
- 如果启用了实时迁移,则原始磁盘密钥将从旧虚拟机实例内存传递到新虚拟机实例内存,这一密钥拷贝过程不涉及实例管理器或集群管理器。
原始磁盘密钥将传递到集群管理器、实例管理器和虚拟机。此类密钥在 Google Compute Engine 中用作您的数据加密密钥。
密钥 | 持有者 | 用途 | 可访问截止时间 |
---|---|---|---|
原始 CSEK | 集群管理器前端 | 由客户提供。 用于通过添加加密随机数来派生 CSEK 派生密钥。 |
客户请求的操作(例如 instances.insert 、instances.attachDisk )完成 |
公钥封装 CSEK (可选 - 如果使用 RSA 密钥封装) |
集群管理器前端 | (可选)由客户提供。 用于通过首先使用 Google 拥有的非对称密钥解封来派生 CSEK 派生密钥。 |
客户请求的操作完成 |
非对称封装密钥 (如果使用 RSA 密钥封装) |
Google 的内部密钥管理服务 | 用于解封客户提供的 RSA 封装密钥 | 无限期 |
CSEK 派生密钥 | 集群管理器前端 | 磁盘密钥的密钥加密密钥 (KEK)。 封装磁盘密钥。 |
密钥封装或解封操作完成 |
Google 封装的磁盘密钥 (可选 - 如果使用自动重启) |
集群管理器前端 | 保护静态存储的磁盘密钥,用于挂接到运行实例的磁盘。 在虚拟机内存丢失的情况(例如主机崩溃)下重启实例 |
虚拟机被停止或删除 |
原始磁盘密钥 | 虚拟机监视器 (VMM) 内存、 集群管理器 (CM) 内存 |
数据的数据加密密钥 (DEK)。 读取/写入磁盘数据,实时迁移虚拟机以及执行就地升级 |
虚拟机已停止或删除 |
Google 封装的 CSEK 派生密钥 | 集群管理器数据库 | 发生故障时重启操作 | 客户请求的操作完成 |
。
保护客户提供的加密密钥安全性的方式
以下部分介绍了客户提供的加密密钥在磁盘上、在 Google Cloud Platform 基础架构中转移时以及在内存中如何得到保护。
在磁盘上
原始 CSEK、CSEK 派生密钥和原始区块/磁盘密钥永远不会存储在未加密的磁盘上。原始区块/磁盘密钥使用 CSEK 派生密钥封装后进行存储,使用 Google 密钥进行自动重启。Google 不会在其服务器上永久存储您的密钥。
密钥在基础架构中移动过程中
每项服务都使用基础架构提供的访问权限管理功能,来精确指定该服务可以与其他哪些服务进行通信。在这种情况下,可以使用列有允许的服务帐号身份标识的白名单配置服务,然后由基础架构自动执行这一访问权限限制。 了解有关服务身份标识、完整性和隔离的更多信息。
除上文讨论的 RPC 身份验证和授权功能外,基础架构还会通过加密处理确保网络上 RPC 数据的隐私性和完整性。服务可以为每个基础架构 RPC 配置所需级别的加密保护,并为客户提供的加密密钥启用这些保护。了解有关服务间通信加密的更多信息。
在内存中
密钥材料存在于各种系统的内存中,包括集群管理器内存和虚拟机监视器内存。对这些系统的内存的访问属于例外情况(例如某个事件需要执行此类访问),并由访问权限控制列表进行管理。这些系统要么停用了内存转储,要么会自动扫描内存转储中的密钥材料。对作业访问权限仅限于少数站点可靠性工程师,以便他们维护服务,而对日志的访问权限仅限于调试这些功能的少数软件工程师。