在生产环境中保护密码

6
我们有一个在JBoss和Linux上运行的Java Web应用程序。生产环境数据库连接参数来自一个只存在于生产环境应用服务器上的配置文件。该配置文件只能被运行应用程序的用户ID(我们称其为appuser)读取,而且只有能够登录到生产环境服务器并sudo到appuser的操作团队成员才能访问该文件。生产环境本身与所有其他环境隔离。
我们希望使这更加安全。具体来说,我们希望防止操作团队读取当前配置文件中的数据库连接密码和其他密钥。
还要考虑的另一个因素是,操作团队负责构建和部署应用程序。
我们有哪些选择?解决方案需要支持手动重启应用程序以及在操作系统重新启动时自动启动应用程序。
更新:
我现在正在调查的解决方案(感谢Adamski的建议,大致翻译如下步骤):
1.编写一个包装器可执行文件,它被设置为一个用户,该用户启动/停止应用程序并拥有配置文件和Jboss目录树中的所有内容。
2.在构建完成WAR后使用jarsigner签名。 WAR的构建将由开发完成。 setuid包装器将验证签名,确认WAR没有被篡改。
3.更改部署流程以仅部署签名的WAR。 setuid包装器还可以将WAR移动到Jboss deploy目录中。

注意:任何签名只有在使用真正的证书而不是自签名证书时才有意义。此外,JVM仍然可能被篡改。 - Thorbjørn Ravn Andersen
没错,JDK的安装也需要被锁定,特别是cacerts目录。 - sourcedelica
3个回答

3

您可能会发现,Jetty团队是如何解决这个问题的:

http://wiki.eclipse.org/Jetty/Howto/Secure_Passwords

这至少确保您不能直接读取密码,而需要付出一些努力才能获得可阅读的版本。
如果Jetty许可证与您想要做的内容兼容,您可以直接使用他们的代码。

您需要访问Jetty解密代码和加密密钥,两者都在源代码控制中。嗯... - sourcedelica
请让我们知道您发现了什么。请记住,如果一台计算机可以使用它,它就可以被解码。 - Thorbjørn Ravn Andersen
更新了带有建议方法的问题。 - sourcedelica

3
为什么不创建一个第二个用户供运维团队使用,并且该用户只有应用程序用户ID的一部分文件权限?
无需进行任何代码更改,简单易行。

他们如何启动应用程序?将启动脚本设置为setuid吗? - sourcedelica
是的,你可以用那种方式做。 - Adamski
我无法使脚本本身设置为setuid(我忘记了这个限制),但我可以编写一个包装的可执行文件来运行脚本,并使包装器设置为setuid。 - sourcedelica
将数据库密码与其余配置分离到不同的文件中,需要时在运行时读取该文件,这个想法如何?可以简单地将其作为另一个 .properties 文件读入。 - Adamski
理想情况下,登录系统的任何人都不应该能够访问密码。尝试使用密钥库和/或ssh公共/私有密钥对,以便没有人需要手动输入密码即可登录该系统。对于Oracle数据库,您可以考虑使用Oracle Wallet,在此方式下,一旦在系统(Linux)上通过身份验证,您就可以自动作为同一用户身份认证到Oracle平台上。 - YoYo
显示剩余4条评论

0

简单的方法是使用Unix权限来控制谁可以读取这些文件。然而,像密码这样的敏感数据不应该以明文形式存储。有一些替代方案。它们需要一些努力,但这是大多数商业产品采用的方法。

将密码加密存储在文件系统中。您可以使用Java加密或XML加密来实现。

或者

将诸如密码之类的敏感信息与其他配置详细信息一起存储在数据库中,并使用数据库工具对其进行加密。您仍然需要在文件系统上存储数据库密码。Oracle提供了一个钱包来存储密码。如果您的数据库供应商没有提供此功能,则还有一些第三方钱包可以实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接