我怀疑,由于 Java 的多平台特性,没有太多强调像 Apache Httpd 中存在的基于 Unix 的技术,因为这些技术不一定适用于 Java 可以运行的所有平台。
在 Java 中,权限分离是通过安全管理器内置的。这是否与根/非根分离一样好,我不确定(总会有错误)。但是,原则上,它的策略能够表达更微妙的访问规则,而不仅仅是 root 用户和非 root 用户之间的区别。
Jetty 有这个,但这显然在 Jetty 9 中被删除了(您仍然可以使用安全管理器,但您可能必须编写自己的策略并做更多的工作才能在容器中实现它们)。
码头政策文件还指出:
通常,用户信任他们正在开发的应用程序,或者足够信任将 webapp 部署到 jetty 实例中。如果您不知道需要使用安全管理器设置,那么您可能不需要。
我不确定我是否同意这一点。事实上,如果有一个我怀疑是恶意的 web 应用程序,我无论如何都不会运行它,但使用安全管理器也是为了包含潜在的安全漏洞。任何人都可以编写错误,甚至是优秀的程序员。拥有一种机制来限制 webapps 可能的操作当然是一件好事。
一个明智的策略肯定会阻止 webapps 访问配置文件和密钥库。
我还认为这种 webapp 分离也是“容器”概念的核心(尽管安全性只是这种分离的目的之一,但它似乎已经丢失了)。
公平地说,它不像 Apache Httpd 中的根/分叉机制提供的分离那么简单。Java 安全策略的强大功能也带来了复杂性。我想这些功能一般都不是很好理解,因此很少使用。为了保护私钥,使用 Apache Httpd(或 Nginx 或其他)作为反向代理往往是一种更简单的解决方案。
您可以研究的另一种方法是使用 PKCS#11 密钥库。JRE 支持这一点。硬件安全模块将有助于防止您的私钥被复制。(从 Java 的角度来看,您会获得一个PrivateKey
将加密操作委托给 PKCS#11 库的实例,但您根本无法从中提取私有数据。)
当然,当您无法访问硬件时,这是一个问题,但是有软件实现(查找“软件 HSM”可能看起来很奇怪,但它会带来一些结果)。并非所有这些都可以让您获得所需的分离,但有些应该(有效地,通过与另一个持有私钥的实体进行通信,您可能会以另一个用户的身份运行)。我还没有尝试过,但这可能会引起人们的兴趣。