客户管理的加密密钥 (CMEK) 简介

本文档介绍如何在 Memorystore for Redis Cluster 中使用 Cloud Key Management Service (Cloud KMS) 中的客户管理的加密密钥 (CMEK)。该文档还概述了哪些数据在持久性存储中进行了加密,以及集群在关键生命周期事件期间的行为。

借助 CMEK,您可以控制用于保护存储数据的加密密钥。通过在 Cloud KMS 中管理自己的密钥,您可以更好地控制密钥访问、轮替和使用,从而满足严格的合规性和监管要求。

实施 CMEK 可为您的永久性数据(例如备份和持久性文件)提供额外的安全保障和控制。您只能在新集群上启用 CMEK。您无法将 CMEK 应用于现有集群。

哪些人应该使用 CMEK?

CMEK 适用于拥有敏感数据或受监管数据且需要控制自己的加密密钥的组织。如需详细了解是否应使用 CMEK 加密这些数据,请参阅决定是否使用 CMEK

客户管理的加密

借助 CMEK,您可以使用加密密钥来保护集群中存储的数据。为了加密这些数据,Memorystore for Redis Cluster 使用 Google 管理的数据加密密钥 (DEK) 和客户管理的密钥加密密钥 (KEK)。

您可以采用以下加密级别:

  • DEK 加密:DEK 用于加密 Memorystore for Redis Cluster 中的数据。
  • KEK 加密:KEK 用于加密 DEK。

Memorystore for Redis Cluster 使用 KEK 加密 DEK,并使用 DEK 加密存储的数据。如果您使用 CMEK,则可以管理用于加密集群中 DEK 的 KEK。

下图展示了集群如何使用 CMEK 加密数据。上传到 Google 存储基础设施的数据会进行分块,每个区块使用自己的 DEK 进行加密。Cloud KMS 提供 KEK 来加密 DEK,而 Google 的存储基础设施会在整个系统中分发加密的数据块和加密的 DEK。

数据会上传到 Google 的存储基础设施,并分成多个块。每个块都使用自己的 DEK 进行加密。然后,使用从 Cloud KMS 检索到的 KEK 对 DEK 进行加密。加密的区块和加密的 DEK 分布在存储基础架构中。

下图展示了 Memorystore for Redis 集群如何解密使用 CMEK 加密的数据。如需访问此已加密数据,Memorystore for Redis Cluster 会向 Cloud KMS(负责管理 KEK)发送请求,以解密 DEK。然后,Cloud KMS 会返回解密后的 DEK,集群会使用该 DEK 对存储的数据进行解密。

数据区块使用 DEK 进行加密,使用加密的 DEK 进行存储。系统会将解密 DEK 的请求发送到 Cloud KMS,该服务用于存储 KEK。Cloud KMS 返回解密的 DEK。

哪些数据使用 CMEK 加密?

CMEK 会加密存储在持久性存储空间中的以下类型的客户数据:

  • 备份:借助备份,您可以将数据恢复到某个时间点,并导出和分析数据。备份还可用于灾难恢复、数据迁移、数据共享和合规性场景。
  • 持久性: Memorystore for Redis Cluster 支持两种类型的持久性:
    • RDB 持久性:Redis 数据库 (RDB) 功能通过将数据快照保存到持久性存储空间来保护数据。
    • AOF 持久性:此功能优先考虑数据持久性。它通过将每个写入命令记录到名为“仅附加文件”(AOF) 的日志文件中来持久存储数据。如果发生系统故障或重启,服务器会按顺序重放 AOF 文件命令来恢复您的数据。

CMEK 组件

以下部分介绍了构成 CMEK 架构的服务账号、加密密钥、密钥版本和组织政策的要求和行为。

服务账号

如需创建启用 CMEK 的集群,您必须向 Memorystore for Redis 集群服务账号授予 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色,该服务账号采用以下格式:

service-PROJECT_NUMBER@cloud-redis.iam.gserviceaccount.com

授予此权限后,服务账号便可向 Cloud KMS 请求密钥访问权限。

在 Cloud KMS 中,您需要创建一个密钥环,然后创建一个使用对称加密算法的加密密钥。创建集群时,您可以选择此密钥来加密集群。您可以为密钥和集群创建一个项目,也可以为它们分别创建不同的项目。

CMEK 在所有集群位置均可用。您必须在要创建集群的同一区域中创建密钥环和密钥。对于多区域集群,您必须将密钥环和密钥设置为与集群相同的位置。 如果区域或位置不匹配,则创建集群的请求将失败。

对于密钥的资源 ID,CMEK 使用以下格式:

projects/CMEK_ENABLED_PROJECT/locations/REGION/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME

如需详细了解如何查找现有密钥的资源 ID,请参阅获取 Cloud KMS 资源 ID

外部密钥

作为 CMEK 策略的一部分,您可以使用外部密钥。为此,您可以使用 Cloud External Key Manager (Cloud EKM) 通过使用您管理的外部密钥来加密 Google Cloud 中的数据。

当您使用 Cloud EKM 密钥时,Google 无法控制外部管理的密钥的可用性。如果您在创建集群时没有可用的密钥,则 Memorystore for Redis Cluster 不会创建集群。

密钥版本

Cloud KMS 将您用于加密和解密数据的加密密钥材料存储在密钥版本中。单个密钥可以包含多个密钥版本。每次轮替密钥时,您都会创建一个密钥版本。

以下部分介绍了在密钥生命周期事件(例如停用、销毁、轮替、启用或恢复密钥版本)期间,集群及其受保护的数据会如何运行。这些部分还介绍了撤消对 Cloud KMS 密钥的访问权限或替换 Cloud KMS 密钥的影响,并提供了有关手动重新加密数据的指南。

停用或销毁 CMEK 密钥版本

您可能遇到这样的情况,即您需要使使用 CMEK 加密的数据永久无法访问,例如在补救数据泄露时。为了实现这种高保证的数据销毁(也称为加密粉碎),您需要销毁密钥版本。如需详细了解如何销毁密钥版本,请参阅销毁和恢复密钥版本

如果您停用或销毁主密钥版本,则备份和持久性会受到以下条件的影响。

备份

销毁主密钥版本后,集群的备份会受到以下限制:

  • 您无法创建按需备份或自动备份。不过,如果您启用旧版密钥,则可以访问使用该密钥版本创建的任何备份。
  • 您必须先启用或恢复主密钥版本,然后才能更新或重新启用自动备份。如需了解详情,请参阅启用或恢复主 CMEK 密钥版本
持久性

销毁主密钥版本后,集群的持久性会受到以下限制:

  • 如果您将集群配置为使用持久性,则当密钥版本不可用时,Memorystore for Redis Cluster 会停用持久性。您不再需要为使用持久性付费。
  • Memorystore for Redis Cluster 不会使用 CMEK 将新数据刷新到永久性存储空间。
  • Memorystore for Redis Cluster 无法读取持久性存储空间中的现有数据。
  • 在启用或恢复主密钥版本之前,您无法更新或重新启用持久性。

如果您启用了主密钥版本,但停用或销毁了较旧的密钥版本,则备份和持久性方面会受到以下条件限制:

  • 您可以创建备份。不过,如果备份使用已停用或销毁的旧版密钥进行加密,则该备份将无法访问。
  • 如果您启用持久性,则该功能将保持启用状态。如果持久性中使用的旧密钥版本被停用或销毁,Memorystore for Redis Cluster 会执行类似于维护中使用的更新,并使用主密钥版本重新加密数据。

撤消对 Cloud KMS 密钥的访问权限

如果您通过停用密钥或移除密钥的 IAM 权限来撤消对有效 Cloud KMS 密钥的访问权限,Memorystore for Redis Cluster 会优先考虑主缓存的可用性。常规的内存中缓存操作会继续处理流量。

不过,备份和持久性已停用。Memorystore for Redis Cluster 会立即停止将新数据写入磁盘,并且不会将客户加密的磁盘中的数据读取到内存中。

轮替主要 CMEK 密钥版本

如果您轮替主密钥版本并创建新的主密钥版本,则备份和持久性方面会受到以下条件的影响:

  • CMEK 的最新主密钥版本会加密新备份。
  • 对于现有备份,系统不会重新加密。
  • 对于持久性,节点不采取任何操作。在下一次维护事件之前,节点会继续使用旧密钥版本。

手动重新加密受 CMEK 保护的数据

Memorystore for Redis Cluster 不支持按需重新加密存储的数据。您无法手动触发某个进程,以使用新密钥版本重新加密现有备份或有效持久性文件。不过,您可以使用新密钥版本加密新写入的数据。

如果您轮替了密钥,并且必须强制集群使用新的密钥版本,则以下条件适用于备份和持久性:

备份

您无法重新加密现有备份。如果合规性要求所有数据都必须使用最新密钥进行加密,请创建使用此密钥的备份,然后手动删除现有备份。您还可以将此备份导出到 Cloud Storage 存储桶,以便使用 Cloud Storage 加密密钥。

持久性

如需强制集群使用新的 Cloud KMS 密钥,您可以对集群运行模拟维护。完成此操作后,Memorystore for Redis Cluster 可以使用更新后的主密钥版本写入持久性数据。

替换受保护的 Cloud KMS 密钥

如果您将受保护的 Cloud KMS 密钥替换为其他密钥或新的主密钥版本,则 Memorystore for Redis Cluster 仅将此更改应用于未来的操作。

替换受保护的密钥会对您的资源产生以下影响:

  • 备份:所有后续备份都使用新密钥进行加密。现有备份将保留其原始密钥。
  • 持久性:下次集群重启或发生维护事件时,系统会使用新密钥。
  • 主缓存:替换此键不会产生任何影响。CMEK 不会加密内存中的数据,因为这些数据不属于存储的数据。

启用或恢复主 CMEK 密钥版本

如果您启用或恢复主密钥版本,则备份和持久性方面会受到以下条件的限制:

  • 您可以重新创建按需备份和自动备份。
  • Memorystore for Redis Cluster 会执行类似于维护中所用的一种更新,并重新启用持久性。

组织政策限制条件

Memorystore for Redis Cluster 支持针对 CMEK 的组织政策限制条件。通过使用这些限制,您可以为集群强制执行 CMEK 保护,并限制可用于此保护的 Cloud KMS 密钥。

您可以配置以下组织政策限制条件:

  • constraints/gcp.restrictNonCmekServices:使用此限制条件可为集群强制执行 CMEK 保护。如果 Memorystore for Redis Cluster API 位于此限制条件的服务 Deny 政策列表中,则您无法创建未受 CMEK 保护的集群。
  • constraints/gcp.restrictCmekCryptoKeyProjects:使用此限制条件可限制哪些 Cloud KMS 密钥可用于 CMEK 保护。如果您配置此限制条件,则使用 CMEK 加密的集群必须使用允许的项目、文件夹或组织中的密钥。

由于 Memorystore for Redis Cluster 和 Memorystore for Redis 共享同一端点 (redis.googleapis.com),因此您无法独立于 Memorystore for Redis 实例为集群强制执行 CMEK。

如需详细了解 Google 为 Memorystore for Redis Cluster 管理的与 CMEK 相关的组织政策限制条件,请参阅组织政策限制条件

价格

Memorystore for Redis Cluster 对启用了 CMEK 的集群的计费方式与任何其他集群相同;不会产生额外费用。如需了解详情,请参阅 Memorystore for Redis Cluster 价格

您可以使用 Cloud KMS API 管理 CMEK。 创建启用 CMEK 的集群时,Memorystore 会定期使用该密钥来加密数据。

当 Memorystore for Redis Cluster 使用相应密钥时,Cloud KMS 会向您收取该密钥的费用以及加密和解密操作的费用。如需了解详情,请参阅 Cloud KMS 价格

限制

将 CMEK 与 Memorystore for Redis Cluster 搭配使用时,存在以下限制:

  • 您无法在现有集群上启用 CMEK。
  • 密钥、密钥环和集群必须位于同一区域。
  • 您必须为密钥使用对称加密算法。
  • Cloud KMS 加密和解密费率受配额限制。

后续步骤