这篇关于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 解决方案特别感兴趣,但这是任何语言的普遍问题。