在云上存储秘密的最佳做法是什么?

信息安全 Web应用程序 密钥管理 爪哇 云计算
2021-08-27 23:51:44

这篇关于Securing Java Application Data for Cloud Computing的文章很好地介绍了如何使用 Java KeyStore 来保护云中的加密数据。然而,它忽略了回答一个基本问题,正如其中一条评论所指出的:您将如何保护云上的密钥库密码?

我们正在 AWS 公共云中设计一个 SAAS Web 应用程序,它将拥有许多最终用户(扩展到数百万)。所有用户数据都将使用标准加密以每个用户为基础进行加密。受密码保护的加密密钥将存储在远程安全密钥服务器上,这需要 API 密钥才能访问。这与上述问题中提到的问题基本相同,keyserver API 密钥与密钥库密码直接可比:您将如何保护云上的 keyserver API 密钥?

请注意,我们的 Web 应用程序需要访问此密钥,以便它可以获得用于加密和解密用户数据的每个用户的密钥。我们正在使用 AES-256 对称加密,但即使对于 PKI 解决方案,基本问题仍然存在,因为您仍然需要保护私钥。另请注意,我们可以使用密钥库而不是远程密钥服务器,但这只是简化为上一个问题,并且基本问题仍然存在。

一些进一步的限制:

  • 显然,将秘密存储在远程安全密钥服务器上是不可能的,因为它用于访问该密钥服务器。
  • 将秘密存储在云文件系统上是不安全的,因为关键是要防止任何破坏云文件系统的人访问该秘密。(如果云文件系统非常安全,我们就不需要加密那里的数据。)此外,鉴于云资源预计会下降并需要重新启动,依靠云来保存秘密是不可靠的。
  • 将密钥存储在代码中是不可接受的,原因有很多,包括:版本控制、纯文本存储、逆向工程、密钥轮换等。另请参阅闭源网站是否应在其源代码中保留密钥?.
  • 将密钥存储在 HSM 中是不切实际的,因为我们无法将密钥附加到虚拟云服务器。另请参阅“秘密”、密钥库、HSM 等的存储
  • 将机密存储在云之外以供应用程序远程加载也是有问题的:我们正在寻找一种纯粹基于云的方法,以避免需要维护任何内部服务器;网络可靠性无法保证;在内部服务器上验证云服务器的秘密请求有其自身的问题;等等。
  • 应尽量减少任何手动交互,因为我们希望服务器尽可能自动启动和重新启动,以减少任何停机时间或人为错误。我的猜测是可能需要手动交互。

那么,在云上存储秘密的最佳做法是什么?Web 应用程序应该如何加载这样的秘密?我会对 Java 解决方案特别感兴趣,但这是任何语言的普遍问题。

1个回答

“在云端”是指“在与我们有合同关系的某家大公司的基础设施上运行的虚拟机上”。根据定义,当您将事物存储在“云中”时,您就是在信任云提供商。该提供商拥有查看代码和数据内部细节以及存储在这些机器上的所有内容的所有技术能力。

这就像试图保持身体的完整性,当你已经在手术台上,处于全身麻醉状态,外科医生手里拿着手术刀。不信任外科医生有点晚了...

如果秘密很有价值,则不要将其存储在云中。换种说法:如果您负担不起专用硬件服务器的额外费用,那么秘密数据就不值那么多钱——或者您可能为了自己的利益而过于贪婪。