使用 CMEK 的最佳实践

本页概述了在 Trusted Cloud 资源上使用客户管理的加密密钥 (CMEK) 配置静态加密的最佳实践。本指南面向云架构师和安全团队,概述了在设计 CMEK 架构时必须遵循的最佳实践和做出的决策。

本指南假定您已熟悉 Cloud Key Management Service (Cloud KMS)客户管理的加密密钥

决定是否使用 CMEK

如果您需要以下任一功能,我们建议您使用 CMEK 加密 Trusted Cloud服务中的静态数据:

  • 拥有加密密钥。

  • 控制和管理加密密钥,包括选择位置、保护级别、创建、访问控制、轮替、使用和销毁。

  • 在 Cloud KMS 中生成密钥材料,或导入在 Trusted Cloud之外维护的密钥材料。

  • 设置有关密钥必须在何处使用的政策。

  • 在停用账号或修复安全事件时,选择性删除由您的密钥保护的数据(加密碎片化)。

  • 创建并使用客户专有的密钥,在您的数据周围建立加密边界。

  • 记录对加密密钥的管理和数据访问情况

  • 遵守当前或未来要求实现任何这些目标的法规。

如果您不需要这些功能,请评估是否应使用默认的休眠时加密功能 ( Google Cloud-powered keys ) 来满足您的用例。 如果您选择仅使用默认加密,则可以停止阅读本指南。

设计 CMEK 架构

在设计 CMEK 架构时,您必须考虑要使用的密钥的配置以及这些密钥的管理方式。这些决策会影响您的费用、运营开销,以及实现加密碎片化等功能的难易程度。

以下部分介绍了针对每种设计选项的建议。

为每个环境使用一个集中式 CMEK 密钥项目

我们建议为每个环境文件夹使用集中式 CMEK 密钥项目。请勿在管理 Cloud KMS 密钥的项目中创建使用 CMEK 加密的资源。这种方法有助于防止在不同环境中共享加密密钥,并有助于实现职责分离。

下图展示了推荐设计中的这些概念:

  • 每个环境文件夹都有一个 Cloud KMS 密钥项目,该项目与应用项目分开管理。
  • Cloud KMS 密钥环和密钥是在 Cloud KMS 密钥项目中预配的,这些密钥用于加密应用项目中的资源。
  • 您可以将 Identity and Access Management (IAM) 政策应用于项目或文件夹,以实现职责分离。在 Cloud KMS 密钥项目中管理 Cloud KMS 密钥的正文与在应用项目中使用加密密钥的正文不同。

推荐的 Cloud KMS 文件夹和项目结构

为每个位置创建 Cloud KMS 密钥环

您必须在部署使用 CMEK 加密的Trusted Cloud 资源的位置创建 Cloud KMS 密钥环。

  • 区域级资源和可用区级资源必须使用与资源位于同一区域的密钥环和 CMEK,或者使用位于 global 位置的密钥环和 CMEK。
  • 全局资源必须使用 global 位置中的密钥环和 CMEK。

强制使用区域密钥是数据区域化策略的一部分。通过强制在指定区域中使用密钥环和密钥,您还可以强制要求资源必须与密钥环的区域一致。

对于需要在多个位置实现高可用性或灾难恢复功能的工作负载,您有责任评估在 Cloud KMS 在某个区域不可用的情况下,您的工作负载是否具有弹性。例如,在区域 A 不可用且灾难恢复场景中,使用区域 A 中的 Cloud KMS 密钥加密的 Compute Engine 永久性磁盘无法在区域 B 中重新创建。为降低此类情况的风险,您可以计划使用 global 密钥对资源进行加密。

选择键粒度策略

粒度是指每个密钥预期用途的规模和范围。例如,与仅保护一个资源的密钥相比,保护多个资源的密钥的粒度更粗

必须先预配用于 CMEK 的 Cloud KMS 密钥,然后才能创建将使用该密钥加密的资源,例如 Compute Engine 永久性磁盘。 您可以选择为单个资源创建非常精细的键,也可以创建不太精细的键,以便在资源之间更广泛地重复使用。

虽然没有普遍适用的正确模式,但请考虑不同模式之间的以下权衡:

高精细度键,例如,为每个单独的资源分配一个键

  • 增强控制功能,安全地停用密钥版本:与停用或销毁共享密钥相比,停用或销毁用于小范围的密钥版本对其他资源的影响风险更低。这也意味着,与使用低精细度密钥相比,使用高精细度密钥有助于降低密钥被破解的潜在影响。
  • 费用:与使用粒度较低的密钥的策略相比,使用粒度较细的密钥需要维护更多有效的密钥版本。 更高的键精细化程度需要更多有效的键版本,这会产生额外的费用。
  • 运营开销:使用精细化的密钥可能需要进行管理工作,或者需要额外的自动化工具来预配大量 Cloud KMS 资源,并管理服务代理的访问控制,以便他们只能使用适当的密钥。

粒度较低的密钥,例如,为每个应用、每个区域和每个环境分配一个密钥

  • 请务必小心谨慎地停用密钥版本:与停用或销毁精细划分的密钥相比,停用或销毁用于广泛范围的密钥版本需要更加谨慎。您必须确保使用该密钥版本加密的所有资源都已使用新密钥版本安全地重新加密,然后才能停用旧密钥版本。 这也意味着,与使用高精细度密钥相比,使用低精细度密钥可能会增加密钥遭到入侵的潜在影响。
  • 费用:使用粒度较低的键需要创建的密钥版本更少,因此费用也更低。
  • 运营开销:您可以定义并预配已知数量的密钥,从而减少确保适当访问控制所需的工作量。

选择密钥的保护级别

创建密钥时,您有责任根据对使用 CMEK 加密的数据和工作负载的要求,为每个密钥选择适当的保护级别。以下问题可帮助您进行评估:

  1. 您是否需要任何 CMEK 功能?您可以查看本页面上决定是否使用 CMEK 部分列出的能力。

    • 如果是,请继续回答下一个问题。
    • 如果没有,我们建议您使用 S3NS 默认加密。
  2. 您是否需要 FIPS 140-2 2 级或 3 级认证,或者需要将密钥材料存储在 Trusted Cloud之外?

尽可能使用 Trusted Cloud生成的密钥材料

本部分不适用于 Cloud EKM 密钥。

创建密钥时,您必须允许 Cloud KMS 为您生成密钥材料,或者手动导入在 Trusted Cloud之外生成的密钥材料。我们建议您尽可能选择系统生成的选项。此选项不会将原始密钥材料泄露到 Cloud KMS 之外,并会根据您选择的密钥轮替周期自动创建新的密钥版本。如果您需要使用自带密钥 (BYOK) 方法,建议您评估以下操作注意事项和风险:

  • 您能否实现自动化操作,以便持续导入新的密钥版本?这包括用于将密钥版本限制为仅导入的 Cloud KMS 设置,以及用于在 Cloud KMS 外部一致生成和导入密钥材料的自动化操作。如果自动化操作未能在预期时间创建新密钥版本,会有什么影响?
  • 您打算如何安全地存储或托管原始密钥材料?
  • 如何降低导入密钥流程泄露原始密钥材料的风险?
  • 如果原始密钥材料保留在 Trusted Cloud之外,重新导入先前销毁的密钥会产生什么影响?
  • 自行导入密钥材料的好处是否值得增加的运营开销和风险?

根据您的需求选择合适的密钥用途和算法

创建密钥时,您必须选择密钥的用途和底层算法。对于 CMEK 用例,只能使用具有对称 ENCRYPT_DECRYPT 用途的密钥。此密钥用途始终使用 GOOGLE_SYMMETRIC_ENCRYPTION 算法,该算法使用 256 位高级加密标准 (AES-256) 密钥(采用伽罗瓦计数器模式 (GCM)),使用 Cloud KMS 内部元数据进行填充。当您使用 Autokey 时,系统会自动为您应用这些设置。

对于客户端加密等其他用例,请查看可用的密钥用途和算法,选择最适合您的用例的选项。

选择轮替周期

我们建议您根据自己的需求评估适当的密钥轮替周期。密钥轮替频率取决于工作负载的敏感性或合规性要求。例如,为了满足某些合规性标准,您可能需要至少每年轮替一次密钥;或者,您可以为高度敏感的工作负载选择更短的轮替周期。

轮替对称密钥后,新版本会被标记为主密钥版本,并用于保护信息的所有新请求。旧密钥版本仍可用于解密之前使用该版本保护的所有已加密数据。轮替密钥时,使用先前的密钥版本加密的数据不会自动重新加密。

频繁轮替密钥有助于限制使用同一密钥版本加密的消息数量,这有助于降低密钥遭破解的风险和后果。

应用适当的访问权限控制

我们建议您在规划访问权限控制时考虑最小权限原则和分工原则。以下部分介绍了这些建议。

应用最小权限原则

分配用于管理 CMEK 的权限时,请考虑最小权限原则,并授予执行任务所需的最低权限。我们强烈建议您避免使用基本角色。请改为授予预定义 Cloud KMS 角色,以降低与过度特权访问相关的安全事件风险。

规划职责分离

为管理加密密钥的人员和使用加密密钥的人员维护不同的身份和权限。NIST SP 800-152 定义了加密密钥管理系统的服务启用和管理人员与使用这些密钥加密或解密资源的用户之间的职责分离。

当您使用 CMEK 通过 Trusted Cloud 服务管理静态数据加密时,用于使用加密密钥的 IAM 角色会分配给 Trusted Cloud 服务的服务代理,而不是个人用户。例如,如需在加密的 Cloud Storage 存储分区中创建对象,用户只需拥有 IAM 角色 roles/storage.objectCreator,而同一项目中的 Cloud Storage 服务代理(例如 service-PROJECT_NUMBER@gs-project-accounts.s3ns-system.iam.gserviceaccount.com)需要拥有 IAM 角色 roles/cloudkms.cryptoKeyEncrypterDecrypter

下表列出了哪些 IAM 角色通常与哪些工作职能相关联:

IAM 角色 说明 NIST SP 800-152 指定
roles/cloudkms.admin 提供对 Cloud KMS 资源的访问权限,但不提供对受限资源类型和加密操作的访问权限。 加密管理员
roles/cloudkms.cryptoKeyEncrypterDecrypter 仅提供使用 Cloud KMS 资源执行 encryptdecrypt 操作的权限。 加密密钥管理系统用户
roles/cloudkms.viewer 启用 getlist 操作。 审核管理员

一致强制执行 CMEK

以下部分介绍了其他控制措施,可帮助降低密钥用法不一致或意外删除或销毁等风险。

强制执行项目安全锁

我们建议您使用安全锁保护项目,以免意外删除。强制执行项目安全锁后,系统会阻止删除 Cloud KMS 密钥项目,直到移除安全锁为止。

要求使用 CMEK 密钥

我们建议您使用组织政策限制条件在整个环境中强制使用 CMEK。

使用 constraints/gcp.restrictNonCmekServices 阻止在未指定 CMEK 密钥的情况下创建特定资源类型的请求。

要求设定最短的已安排销毁时长

我们建议您设置最短的计划销毁时长。销毁密钥是一项不可逆转的操作,可能会导致数据丢失。默认情况下,在不可逆转地销毁密钥材料之前,Cloud KMS 会将已安排销毁时长(有时称为软删除期限)设为 30 天。这样一来,在意外销毁密钥时,您就有时间恢复密钥。不过,具有 Cloud KMS 管理员角色的用户可以创建安排销毁时长短至 24 小时的密钥,这可能不足以让您检测到问题并恢复密钥。已安排销毁时长只能在创建密钥时设置。

在密钥被安排销毁期间,该密钥无法用于加密操作,并且任何使用该密钥的请求都会失败。在此期间,请监控审核日志,以检查密钥是否未被使用。如果您想再次使用该密钥,则必须在安排销毁期限结束之前恢复该密钥。

为确保创建的所有密钥都遵循最短预定销毁期限,我们建议您将组织政策限制 constraints/cloudkms.minimumDestroyScheduledDuration 配置为至少 30 天或您偏好的时长。此组织政策可阻止用户创建安排销毁时长短于政策中指定值的密钥。

强制执行允许的 CMEK 保护级别

我们建议您使用组织政策限制在整个环境中一致强制执行密钥保护级别要求。

使用 constraints/cloudkms.allowedProtectionLevels 强制要求新密钥、密钥版本和导入作业必须使用您允许的保护级别。

为 CMEK 配置检测控制措施

Trusted Cloud 为 CMEK 提供了各种检测控件。以下部分介绍了如何启用和使用与 Cloud KMS 相关的这些控件。

启用和汇总审核日志记录

我们建议您将 Cloud KMS 管理员活动审核日志(以及所有服务的管理员活动日志)汇总到贵组织所有资源的集中位置。这样,安全团队或审核员就可以一次查看与创建或修改 Cloud KMS 资源相关的所有活动。如需有关配置汇总日志接收器的指导,请参阅汇总和存储组织的日志

您可以选择启用数据访问日志,以记录使用密钥的操作,包括加密和解密操作。使用 CMEK 时,这可能会产生大量日志并影响您的费用,因为使用 CMEK 的每项服务的每项操作都会创建数据访问日志。在启用数据访问日志之前,我们建议您为这些额外日志明确定义用例,并评估日志记录费用将增加多少。

评估您的合规性要求

不同的合规性框架对加密和密钥管理有不同的要求。合规性框架通常概述了加密密钥管理的概要原则和目标,但不会规定实现合规性的特定产品或配置。您有责任了解合规性框架的要求,以及您的控制措施(包括密钥管理)如何满足这些要求。

如需有关 Trusted Cloud 服务如何帮助满足不同合规性框架要求的指导,请参阅以下资源:

最佳做法摘要

下表总结了本文档中建议的最佳实践:

主题 任务
决定是否使用 CMEK 如果您需要 CMEK 支持的任何功能,请使用 CMEK。
Cloud KMS 密钥项目 为每个环境使用一个集中式密钥项目。请勿在密钥保护的资源所在的项目中创建 Cloud KMS 资源。 Trusted Cloud
Cloud KMS 密钥环 为您要保护的每个位置创建 Cloud KMS 密钥环 Trusted Cloud。
键粒度 选择符合您在风险容忍度、费用和运营开销方面的需求的密钥粒度模式
保护级别 如果您的密钥材料必须存储在 Trusted Cloud 之外,或者您需要 FIPS 140-2 2 级或 3 级认证,请选择 Cloud EKM。否则,请选择软件密钥。查看选择保护级别的指南
密钥材料 对于托管在 Trusted Cloud上的密钥材料,请尽可能使用 Trusted Cloud生成的密钥材料。如果您使用导入的密钥材料,请实现自动化操作和流程以降低风险
密钥用途和算法 所有 CMEK 密钥都必须使用对称 ENCRYPT_DECRYPT 密钥用途和 GOOGLE_SYMMETRIC_ENCRYPTION 算法。
轮替周期 使用自动密钥轮替功能可确保按计划轮替密钥。选择并应用符合您需求的轮替周期,最好不低于每年一次。针对敏感工作负载使用更频繁的密钥轮替。
最小权限 授予最受限的预定义角色,让您的主账号能够完成其任务。请勿使用基本角色。
职责分离 为密钥管理员和使用密钥的主账号维护单独的权限。
项目安全锁 使用项目安全锁可防止关键项目被意外删除。
要求使用 CMEK 使用 constraints/gcp.restrictNonCmekServices 约束条件。
要求设定最短的已安排销毁时长 使用 constraints/cloudkms.minimumDestroyScheduledDuration 约束条件。
强制执行允许的 CMEK 保护级别 使用 constraints/cloudkms.allowedProtectionLevels 约束条件。
启用和汇总审核日志记录 汇总贵组织中所有资源的管理员活动审核日志。考虑是否要启用使用密钥的操作日志记录。
评估合规性要求 检查您的 Cloud KMS 架构,并与您必须遵守的所有合规性要求进行比较。