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

本页面介绍了如何将客户管理的加密密钥 (CMEK) 与 Memorystore for Redis 配合使用。如需开始使用此功能,请参阅使用客户管理的加密密钥 (CMEK)

默认情况下,Memorystore for Redis 会对静态客户内容进行加密。Memorystore for Redis 会为您处理加密,您无需执行任何其他操作。此选项称为“Google 默认加密”

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

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

哪些人应该使用 CMEK?

CMEK 适用于拥有敏感或受监管数据且必须加密的组织。如需详细了解是否应使用 CMEK 加密此数据,请参阅决定是否使用 CMEK

Google 管理的加密与客户管理的加密

借助 CMEK 功能,您可以为 Memorystore for Redis 中的静态数据使用自己的加密密钥。添加 CMEK 后,无论何时进行 API 调用,Memorystore 都可以使用您的密钥来访问数据。

Memorystore 使用 Google 管理的数据加密密钥 (DEK) 和密钥加密密钥 (KEK) 来加密 Memorystore for Redis。因此存在两层加密:

  • DEK 加密数据。
  • KEK 加密 DEK。

Memorystore 实例将加密的 DEK 与加密的数据一起存储在永久性磁盘上,而 Google 管理 Google KEK。CMEK 是封装 DEK 的 KEK。还可以创建、撤消和删除 KEK。

客户管理的加密密钥通过 Cloud Key Management Service API 进行管理。

下图分别展示了在使用默认 Google 加密与客户管理的加密密钥时,Memorystore 实例内部的数据静态加密的工作原理。

不使用 CMEK

数据会上传到 Google,然后进行分块,每个区块使用自己的数据加密密钥进行加密。数据加密密钥使用密钥加密密钥进行封装。如果使用默认 Google 加密,系统会从 Google 的内部密钥库检索密钥加密密钥。加密的区块和封装的加密密钥分布在 Google 的存储基础架构中。

使用 CMEK

数据会上传到 Google,然后进行分块,每个区块使用自己的数据加密密钥进行加密。数据加密密钥使用密钥加密密钥进行封装。通过使用 Cloud KMS 的 CMEK,系统会从 Cloud KMS 中检索密钥加密密钥。加密的区块和封装的加密密钥分布在 Google 的存储基础架构中。

在解密使用 CMEK 封装的数据时,Memorystore 会使用 KEK 来解密 DEK,并使用未加密的 DEK 来解密静态数据。

数据区块使用 DEK 进行加密,使用封装的 DEK 进行存储。系统会将解封 DEK 的请求发送到 KMS 存储空间,该存储空间用于存储不可导出的 KEK。KMS 存储空间返回解封后的 DEK。

Memorystore 何时与 CMEK 密钥进行交互?

操作 说明
创建实例 在创建实例期间,您可以将实例配置为使用客户管理的加密密钥。
更新实例 在对启用了 CMEK 的实例进行更新期间,Memorystore 会检查 CMEK 密钥。

哪些数据会使用 CMEK 加密?

CMEK 会加密以下类型的数据:

  • 存储在持久性存储空间中的客户数据。
  • 与安全功能(例如 AUTH传输加密)相关的元数据。

服务账号简介

创建使用 CMEK 的实例时,您必须向具有以下格式的 Memorystore 服务账号授予 cloudkms.cryptoKeyEncrypterDecrypter 角色:

  • service-[PROJECT_NUMBER]@cloud-redis.iam.gserviceaccount.com

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

如需了解如何向服务账号授予此权限,请参阅向服务账号授予密钥访问权限

密钥简介

在 Cloud KMS 中,您需要创建一个包含加密密钥的密钥环,该密钥使用对称加密/解密算法。 在创建新的 Memorystore 实例时,您可以选择使用此密钥来加密该实例。您可以为密钥和 Memorystore 实例创建一个项目,也可以为它们分别创建不同的项目。

CMEK 在所有 Memorystore 实例位置均可用。密钥和密钥环区域必须设置为与 Memorystore for Redis 实例相同的区域。多区域密钥或全球区域密钥不起作用。如果区域不匹配,创建 Memorystore 实例的请求将失败。

Memorystore 的 CMEK 与 Cloud External Key Manager (Cloud EKM) 兼容。

CMEK 使用以下格式:

projects/[CMEK_ENABLED_PROJECT]/locations/[REGION]/keyRings/[RING_NAME]/cryptoKeys/[KEYNAME]

如果 Memorystore 无法访问当前正在使用的任何密钥版本(例如,您停用了密钥版本),Memorystore 会立即关闭实例。在 Google Cloud 控制台中,暂停的实例会在实例页面上显示红色感叹号提示。当鼠标悬停在工具提示上时,系统会显示“无状态”。该密钥再次可供访问后,Memorystore 会自动恢复该实例。

如何使 CMEK 加密的数据永远无法访问?

您可能遇到这样的情况,即您需要永久销毁使用 CMEK 加密的数据。为此,您需要销毁 CMEK 版本。您不能销毁密钥环或密钥,但可以销毁密钥的密钥版本。

如何为启用了 CMEK 的实例导出和导入数据?

如果您希望在导入或导出期间仍使用客户管理的密钥加密数据,则必须先在 Cloud Storage 存储桶上设置客户管理的加密密钥,然后再将数据导出到其中。

如果数据之前存储在启用了 CMEK 的 Memorystore 实例上,则将数据导入新 Memorystore 实例不存在特殊要求或限制。

销毁/停用 CMEK 密钥版本的行为

如果您希望确保无法访问实例中的数据,可以停用客户管理的加密密钥的主密钥版本。这样做会关闭实例,而不会造成不必要的延迟。此外,如果任何正在使用的客户管理的加密密钥被停用/销毁,Memorystore 会立即关闭相应实例。这包括 Memorystore 实例仍在使用的任何旧版密钥。您可以使用 gcloud 或 Google Cloud 控制台来查看实例是否处于暂停状态:

对于 Google Cloud 控制台,如果您的实例处于暂停状态,您会在 Memorystore for Redis 的实例页面上看到实例旁边的红色提示工具提示通知。当光标悬停在其上时,工具提示会显示“无状态”。

对于 gcloud,如果您运行 gcloud redis instances describe,但在实例元数据中未看到 state: READYstate: REPAIRING 或任何其他状态,则表示您的实例已暂停。

重新启用/恢复正在使用的 CMEK 密钥版本

重新启用/恢复正在使用的 CMEK 密钥版本后,实例会取消隐藏。

限制

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

  • 您无法在现有 Memorystore 实例上启用 CMEK。
  • 密钥、密钥环和 Memorystore 实例的区域必须完全相同。
  • 您必须为密钥使用对称加密/解密算法
  • Cloud KMS 加密和解密费率受配额限制。

CMEK 组织政策

Memorystore for Redis 支持可用于 CMEK 保护的组织政策限制条件

政策可以限制哪些 Cloud KMS 密钥可用于 CMEK 保护。

  • 当 Memorystore for Redis API 位于限制条件 constraints/gcp.restrictNonCmekServices 下的服务 Deny 政策列表中时,系统会因实例未受 CMEK 保护而无法创建 Memorystore for Redis。

  • 配置 constraints/gcp.restrictCmekCryptoKeyProjects 后,Memorystore for Redis 会创建 CMEK 保护的实例,这些实例使用允许的项目、文件夹或组织中的密钥进行加密。

如需详细了解如何配置 CMEK 组织政策,请参阅 CMEK 组织政策