使用 Cloud KMS 进行 secret 管理

应用通常需要在构建或运行时访问小块敏感数据。这些小块数据通常被称为密文。密文在概念上与配置文件类似,但通常更敏感,因为它们可以授予对其他数据(例如用户数据)的访问权限。

本主题介绍密文管理的一些主要概念,还提供有关如何使用 Cloud Key Management Service 管理 secret 的指南。

密文管理概览

您可以采用若干选择来管理密文。密文的一些常见存储位置包括:

  • 代码或二进制文件
  • 部署管理器
  • 容器中的密文卷
  • 虚拟机的元数据
  • 存储系统

从这些选项中进行选择通常需要在安全性和功能性之间进行权衡。典型的安全考量包括:

  • 授权:对密文或其存储位置的访问管理,包括严格的授权范围。
  • 使用情况验证:能够以较低的粒度(例如,基于每个密文)对密文的访问权限和使用方式进行审核。
  • 静态加密:加密密文,以防发生数据被窃或丢失。
  • 轮替:能够定期或根据回应事件的需要轮替或更新密文。
  • 隔离:管理密文与使用密文的位置之间的分离。隔离也适用于可以管理密文的用户和可以使用密文的用户之间的职责分离。

典型的功能考量包括:

  • 一致性:多个位置和多个应用之间的密文同步。
  • 版本管理:了解更新密钥的时间和方式,以支持密文轮替。

选择密文管理解决方案

根据您独特的当前环境、密文和安全需求,选择最佳的密文管理解决方案。一些常见的方法包括:

  1. 在代码中存储密文,并使用 Cloud KMS 中的密钥对其进行加密。该解决方案一般通过在应用层对密文进行加密来实现。使用此解决方案可以通过限制对密文的访问范围,提供防范内部威胁的额外保护层。对密文的访问权限从可以访问代码的所有开发者调整为可以同时访问代码和相应密钥的开发者。即使在所有开发者都可以访问代码和密钥的情况下,实现此选项也有好处,因为它提供了审核对密文的访问权限,这在代码存储库中可能无法实现。

  2. 将密文存储在 Cloud Storage 存储分区中,并对其进行静态加密。此解决方案具有与上一个解决方案类似的优点,因为它仅允许较少开发者访问密文,并提供了审核访问的能力。此外,通过将密文存储在单独的位置,您可以在必要时更轻松地轮替密文;例如,检测到安全漏洞时。此外,该解决方案允许系统分离;如果使用密文的代码存储库遭到入侵,密文本身可能仍然受到保护。

  3. 使用第三方密文管理解决方案。基于此列表中的前两个选项构建的专用密文管理工具。此外,这些工具不仅可以让您更轻松地轮替密文,而且在某些情况下,可以代表您执行轮替或简化定期轮替。

更改密文

在考虑密文管理解决方案时,另一个重要的考量因素是更改密文的轻松程度。例如,对密文进行硬编码通常是非常有吸引力的解决方案,但是这种解决方案在后期更改密文时非常耗时,且难度较大。

在权衡密文管理解决方案时,请考虑以下设计要求以及它们与您的应用的相关性:

  • 轮替密文。您可能希望定期轮替密文,尤其是出于安全考虑。理想情况下,您可以存储各个密文的多个版本,并让您的代码一次使用一个。通过存储密文的众多版本,并根据需要轮替到较新的密文,您可以与可能需要该密文的外部系统更好地保持一致性。这也允许您在需要时回滚到较旧的密文。该解决方案实施起来可能非常复杂,但事先考虑这些需求可以使管理密文更容易。
  • 在本地缓存密文。根据您存储与应用相关的密文的位置,您可能需要在本地缓存密文。然后您可以经常刷新这些密文,例如每小时几次。此解决方案的优势在于,刷新的频率越高,对中断的响应速度就越快。然而,缺点是,如果密文的配置存在错误,更快的刷新会使错误在整个系统中更快地传播。
  • 使用单独的解决方案或平台。 在密文管理方面,您可能希望对您的密文实施不局限于平台的密文管理解决方案,以避免局限性。这样,如果有更灵活的解决方案时,您可以进行选择。

使用 Google Cloud Platform 进行密文管理

GCP 提供多种手段,帮助您解决实施密文管理解决方案的方式。本部分介绍了一种方法,该方法使用 Cloud Storage 存储密文,使用 Cloud KMS 管理加密密钥,使用 Cloud Identity and Access Management 进行访问权限控制,使用 Cloud 审核日志进行审核。

以下是在 GCP 上使用密文管理实现的一种方法。如需了解详情,请参阅如何存储使用 Cloud KMS 加密的密文

  • 创建两个项目。第一个项目使用 Cloud Storage 来存储密文。第二个项目使用 Cloud KMS 管理加密密钥。
  • storage.objectAdmincloudkms.cryptoKeyEncrypterDecrypter 角色分配给需要访问密文的任何用户。或者,您可以使用服务帐号代表用户访问 Cloud Storage。确保不需访问密文的用户具有管理权限,但不具有访问权限。
  • 在 Cloud Storage 中,将各个密文存储为加密对象,并根据需要将这些密文分组到存储分区中。通常,您可以根据相同的密文使用、访问和保护需求对其进行分组。
  • 通过在应用层使用 Cloud KMS 中的唯一密钥来保护每个存储分区。另一个选项是依靠 Google 的默认加密。
  • 尽可能定期轮替密文。
  • 使用 Cloud 审核日志监控活动。默认情况下,管理活动日志(例如密钥轮替或 Cloud IAM 权限更改)会自动记录。另一个需要考虑的选项是对 Cloud Storage 对象启用数据访问日志的日志记录。在监控特别关键的密文时,这些数据访问日志非常有用。

此解决方案解决了选择秘密管理解决方案中描述的大多数密文管理要求。未解决的一个问题是版本管理。这是因为版本管理的解决因应用而异。

在实施这样的解决方案之前,您还应该考虑哪种加密方案最适合您的需求以及您希望如何管理用户对 secret 的访问权限

加密选项

在 GCP 上,您有两种加密密文的选项:

  • 使用 Cloud KMS 中的密钥进行应用层加密。使用此选项,您可以使用存储在 Cloud KMS 中的密钥,在现有 Google 加密的基础上,对 Cloud Storage 中的对象或存储分区实施加密。这是推荐的选项。

  • 使用 Cloud Storage 存储分区内置的默认加密。GCP 使用一种或多种加密机制对静态存储的客户内容进行加密。顾名思义,此加密默认情况下可用,无需您执行其他操作。

如需了解这些和其他加密选项,请参阅静态加密

使用 Cloud KMS 中的密钥进行应用层加密

存储密文的推荐方法是使用 Cloud KMS 中的密钥进行应用层加密。如果您正在寻找额外的控制层,或者需要满足管理自己的密钥的合规要求,则此方法特别有用。

要实施此类加密,请使用 Encrypt 请求将要加密的 secret 发送到 Cloud KMS。然后,Cloud KMS 会返回加密后的 secret,您可以将其写入存储。

Cloud KMS 可以处理最大为 64 KiB 的 secret。如果您需要加密较大的 secret,建议您使用密钥层次结构,使用本地生成的 DEK(数据加密密钥)对 secret 进行加密,并使用 Cloud KMS 中的 KEK(密钥加密密钥)对 DEK 进行加密。如需详细了解 DEK,请参阅信封加密

默认加密

如果您的应用不可使用应用层加密,另一种常见的解决方案是使用 Cloud Storage 的默认加密。寻找主要用来保护存储中的密文的云解决方案时,通常使用此选项。

此加密自动启用,您无需执行其他操作。

管理对密文的访问权限

限制和执行访问权限有两个主要选项:

  • 对存储密文的存储分区的访问权限控制。此选项可以支持每个存储分区中的多个密文(对象),也支持每个存储分区的一个密文。此为推荐选项。
  • 对加密存储密文的存储分区的密钥的访问权限控制。此选项支持每个密钥对应多个密文,也支持每个密钥对应一个密文。

只有在提高安全性和易用性时才应隔离密文。一种常见的最佳做法是限制任何一个加密密钥保护的数据量,以用于加密隔离;或限制任何一个访问控制列表保护的数据量。这种做法允许您对密文访问进行更精细的控制,有助于防止授予过多权限,并支持更精细的审核。当存在相应逻辑需要时,您可以将密文组合在一起。例如,您可以将一些密文组合在一起以简化控制,例如,当单个应用需要在某个运行时对特定的密文集合精细访问时。

在决定如何存储您的密文时,建议您使用以下准则:

  • 每个密文作为自己的对象
  • 单个存储分区中的密文拥有多个共同特征
  • 单个加密密钥用于加密每个存储分区,其中包括这些按逻辑进行分组的密文。

您可能希望将密文组合在一起的一些场景包括:

  • 密文访问来自同一应用
  • 同一人类管理员复制管理密文版本和访问权限
  • 相同的环境,例如生产、开发或测试环境
  • 相同的使用时间,例如构建时间或部署时间
  • 所需的保护级别一样

密钥轮替

一个好的做法是定期轮替用于加密密文的密钥。轮替密钥有助于限制使用单个密钥加密的数据量,并有助于在密钥遭破解时限制密钥的生命周期。除了自动密钥轮替外,您还可以手动轮替密钥。例如,您可以在更新新版本的密文时手动轮替密钥。如需了解详情,请参阅密钥轮替

密文轮替

除了轮替密钥,您还可以轮替密文。创建新版本时,通常会轮替(或更新)密文。例如,为数据库凭据生成新密码时。您可能还需要定期轮替密钥,以限制密文的生命周期。

密文轮替会生成您必须管理的拥有多个版本的密文。可能存在任何时候都有效的单个版本的密文,或拥有多个版本的密文。建议您考虑将旧版本的密文保留一段时间,因为如果应用回滚到旧版本,可能会需要它们。

管理拥有多个版本的密文的一种方法是为每个版本创建一个对象,并将这些对象存储在与该特定密文相关联的同一个存储分区中。然后,您可以使用命名惯例对可正在使用的版本进行跟踪。此外,您可以使用一组集中变量来帮助您确定在任意给定时间应使用哪个密文。

使用 Cloud IAM 进行权限管理

建议您使用 Cloud IAM 进行 GCP 密文管理。通过 Cloud IAM,您可以创建和管理对 GCP 资源的权限。它将 GCP 服务的访问权限控制统一到单个系统中,提供了一套统一的操作。如需详细了解 Cloud IAM,请参阅 Cloud IAM 文档

角色和访问权限管理中的一个关键概念是职责分离。您希望避免让单一个体拥有加密和解密数据以及管理或创建新密钥的权限。如需了解详情,请参阅职责分离

管理权限的两种方法如下:

  • 不借助服务帐号。此为推荐选项。
  • 借助服务帐号

不借助服务帐号进行权限管理

对于使用 Cloud KMS 进行密文管理,理想的配置尽可能限制不必要的访问,并执行职责分离。此类配置需要多个用户:

  • 组织级管理员。这是具有 resourcemanager.organizationAdmin 角色的用户。组织级管理员通常是帐号的业务所有者。请注意,如果您使用的是 resourcemanager.projectCreator 角色,则该用户将被授予对这些项目的 owner 访问权限。通常不需要这种访问级别。建议您不要将此角色用于密文管理。
  • 具有 storage.objectstorageA.admin 角色的第二个用户。该用户负责管理密文。此用户还使用对包含 Cloud Storage 存储分区的产品具有 storage.admin 角色的服务帐号。此服务帐号限制此用户可以修改存储分区元数据或删除存储分区。
  • 具有 cloudkms.admin 角色的第三个用户。该用户管理用于加密密文的密钥。
  • 第四个用户同时具有 storage.objectAdmincloudkms.cryptoKeyEncrypterDecrypter 角色。该用户是需要访问密文的最终用户。

使用服务帐号进行权限管理

另一种实现方式要求最终用户仅拥有对存储分区的权限,并允许存储服务使用服务帐号代表用户访问密钥。此配置类似于不借助服务帐号进行权限管理中介绍的配置,但包含以下更改:

  • 访问密文的最终用户具有 storage.objectAdmin 角色。
  • 第五个用户(用于 Cloud Storage 服务帐号)具有 cloudkms.cryptoKeyEncrypterDecrypter 角色。

这种配置可实现所有人均无权使用密钥进行加密和解密,在某些情况下,该配置更合适。但是,此配置允许 Cloud Storage 使用其自身权限借助密钥进行加密和解密。

使用 Cloud Audit Logging 进行审核

在 GCP 上管理密文时需考虑的最后一个因素是使用 Cloud 审核日志。此服务由两个日志流(即管理员活动日志和数据访问日志)组成,这些日志流由 GCP 服务生成。这些流可以帮助您了解在 GCP 项目中“何时何地何人做了何事”。

管理活动日志包含下列日志条目:API 调用或修改资源服务或项目的配置或元数据的管理操作。此日志始终处于启用状态,并且对所有项目成员可见。

数据访问日志包含下列日志条目:创建、修改或读取由服务管理并由用户提供的数据(例如存储在数据库服务中的数据)的 API 调用。数据访问日志仅对项目所有者和具有“私有日志查看者”角色的用户可见。

在 Cloud Storage 和 Cloud KMS 中,管理活动日志默认启用;管理活动包括创建新存储分区或轮替密钥等操作。管理活动日志默认处于启用状态,并且不需要用户执行任何操作即可打开。

默认情况下,Cloud Storage 和 Cloud KMS 都不打开数据访问日志,因为这些日志可能是大量数据。这些日志会跟踪频繁发生的操作,实施此处描述的解决方案时尤其如此。这些操作的示例包括读取存储分区,或使用密钥进行加密或解密。此外,任何密文访问都需要同时使用 Cloud Storage 和 Cloud KMS,因此可能会在上述两个位置都记录与密文的交互(尽管在两个位置都记录会造成重复)。

如果您选择使用日志记录,建议您打开针对 Cloud Storage 中对象而非 Cloud KMS 中密钥的数据访问日志。与针对 Cloud KMS 中密钥的数据访问日志相比,这些日志提供的数据更精细、更易于审核。您还可以打开针对 Cloud Storage 对象的数据访问日志,以获取特别关键的 secret 的日志记录。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud KMS