如何用Java Web服务器实现"权限分离"的一些措施?

Gra*_*ray 6 java ssl privileges jetty

我正试图在我的Jetty网络服务器盒上主动安全 - 特别是关于存储SSL密钥信息,尽管我想要一个通用的解决方案.Apache使用权限分离,以便它以root身份启动,以便它可以读取受保护的SSL密钥文件(以及其他安全配置),然后切换到某个普通用户以实际服务HTTP请求.但Java没有这样做的机制.

有关如何在Java Web应用程序中实现相同级别的安全性的任何建议?我的要求包括:

  • 秘密信息只能由root读取.

  • 不应将任何解锁密钥等的密码配置到代码中,以便与服务器具有相同用户级权限的人无法轻松获取密码.

  • 我在Amazon EC2下运行,所以我希望安全性尽可能自动 - 即运营商不输入交互式密码.

一种可能性是使用~LDAP将秘密信息与应用程序分开,并仅将LDAP访问用户名/密码烘焙到应用程序中.但我正在寻找更好的解决方案.

感谢您提供任何信息.

编辑:

我希望解决方案涵盖SSL,但考虑到我想限制访问的其他秘密.我在最初的帖子中没有说清楚.

Gra*_*ray 0

尽管我很欣赏@Joakim 和@Tony 的答案,但我希望有一个更通用的解决方案,涵盖一般密码保护,无需 JNI/Jetty 特定功能,并且比 SSL 密钥保护更通用。

我能想到的最好的解决方案是一个小的 C 包装程序,它是 setuid root。它会:

  1. 启动并将一组秘密信息从磁盘上受根保护的文件读入内存。它应该立即加密内存中的秘密信息(见下文)。
  2. 从 root 切换到运行应用程序的非特权用户。
  3. 使用适当的应用程序参数来分叉和执行 JVM。
  4. 通过 STDIN 写入加密密钥和加密密码。
  5. 当 JVM 启动时,它立即从 STDIN 读取加密的秘密信息。
  6. 一旦它们被读取,包装应用程序将终止。

作为扩展,小型 C 包装器可以保持运行,并通过使用基于 STDIN/STDOUT 的简单行协议来提供对 JVM 和系统资源的访问。这将使 JVM 以受控方式访问系统上的其他受保护资源。

以下是关于可能的解决方案的一些其他想法。

  • 启动时由 init.d 脚本启动的服务,该脚本以 root 身份运行,并为通过某些 Web 服务或通过某些 FIFO 文件或其他内容启动的 JVM 提供一组密钥。在第一个请求后,它将关闭或在启动后几秒后关闭。
  • LDAP 肯定比在盒子本身上保存秘密 foo 更好——应用程序用户可以读取。作为对上述解决方案的修改,setuid 程序可以将 LDAP 密码注入到应用程序中,这样它就不会存在于用户可读空间中。

与往常一样,这两个应用程序都需要保护内存中的密码。将它们存储在系统套接字中或将它们分割成不连续的内存块始终是一个好主意。您还可以生成一个密钥并在内存中对其进行加密。