如何达到某种程度的;“特权分离”;使用Java web服务器?
我正试图在Jetty web服务器盒的安全性方面采取主动,特别是在存储SSL密钥信息方面,尽管我希望有一个通用的解决方案。Apache使用,因此它以root用户身份启动,这样它就可以读取受保护的SSL密钥文件(和其他安全配置),然后切换到一些普通用户来实际处理HTTP请求。但是Java没有这样做的机制 关于如何在Java web应用程序中实现相同级别的安全性,有什么建议吗?我的要求包括:如何达到某种程度的;“特权分离”;使用Java web服务器?,java,ssl,jetty,privileges,Java,Ssl,Jetty,Privileges,我正试图在Jetty web服务器盒的安全性方面采取主动,特别是在存储SSL密钥信息方面,尽管我希望有一个通用的解决方案。Apache使用,因此它以root用户身份启动,这样它就可以读取受保护的SSL密钥文件(和其他安全配置),然后切换到一些普通用户来实际处理HTTP请求。但是Java没有这样做的机制 关于如何在Java web应用程序中实现相同级别的安全性,有什么建议吗?我的要求包括: 机密信息只能由root用户读取 任何解锁密钥等的密码都不应配置到代码中,这样与服务器具有相同用户级别权限的
- 机密信息只能由root用户读取
- 任何解锁密钥等的密码都不应配置到代码中,这样与服务器具有相同用户级别权限的人就无法轻松获得它们
- 我在AmazonEC2下运行,所以我希望安全性尽可能自动化——即操作员不需要输入交互式密码
我希望解决方案能够涵盖SSL,但考虑到我希望限制访问的其他秘密。在我的第一篇文章中,我没有说得足够清楚。您描述的apache技术是由可选的jetty setuid特性提供的
请参见一旦您将密码之类的东西烘焙到源代码中(存储在磁盘上),您就规避了安全性。因此,将信息存储在LDAP中不会有任何帮助 我也不相信setuid功能会有帮助,因为它只是用于访问网络代码中的端口,并且可能不会在正确的时间(打开SSL文件后)执行setuid。当然,您可以通过以root用户身份保护文件来测试这一点,看看它是否可以打开它们……如果可以,那么您就是golden,Joakim的答案是最好的选择 我们所要做的是设置一个简单的apache或nginx服务器,通过代理将JVM前置,然后在它自己的UID下运行jetty。然后,您可以利用已经在这两个服务器中进行了良好测试的setuidsl安全性。我们还有一些其他的需求,这也有助于解决,但我可能会选择这样做,即使我们没有 nginx配置也非常简单:
server {
listen 192.168.1.1:443;
server_name www.mydomain.com;
index index.html index.htm;
root /usr/share/nginx/html;
ssl on;
ssl_certificate /etc/nginx/conf.d/ssl/server.crt;
ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;
access_log /var/log/nginx/ssl.access.log main;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /AppPath {
proxy_pass http://jettyhost:8080/AppPath;
}
}
尽管我很欣赏@Joakim和@Tony的回答,但我还是希望有一个更通用的解决方案,涵盖没有JNI/Jetty特定功能的通用密码保护,并且比SSL密钥保护更通用 我能想到的最好的解决方案是一个小型的C包装程序,它是setuid root。它将:
- 在启动时由init.d脚本启动的一种服务,它以root用户身份运行,并向通过某些web服务或FIFO文件或其他方式启动的JVM提供一组密钥。在第一次请求之后,它将关闭,或者在引导后几秒钟后关闭
- LDAP当然比将secretfoo放在盒子上要好——应用程序用户可以读取。作为对上述解决方案的修改,setuid程序可以将LDAP密码注入到应用程序中,这样它就不会存在于用户可读的空间中
和往常一样,这两个应用程序都需要保护内存中的密码。将它们存储在系统套接字中或将它们拆分为不连续的内存块始终是一个好主意。您还可以生成一个密钥并在内存中对其进行加密。我怀疑,由于Java的多平台特性,没有太多地强调基于Unix的技术,例如Apache Httpd中的技术,因为这些技术可能不一定适用于Java可以运行的所有平台 在Java中,特权分离是通过安全管理器内置的。这是否和根/非根分离一样好,我不确定(总是会有bug)。然而,原则上,它的策略能够表达更微妙的访问规则,而不仅仅是根用户和非根用户之间的区别 Jetty有这个功能,但显然是(您仍然可以使用安全管理器,但您可能需要编写自己的策略,并在容器中执行更多的工作) 委员会还指出: 通常情况下,用户信任他们正在开发的应用程序,或者信任程度足以将webapp部署到jetty实例中。如果您不知道需要使用安全管理器设置,您可能不知道 我不确定我是否同意这一点。事实上,如果我怀疑某个webapp是恶意的,我无论如何都不会运行它,但使用安全管理器也会包含潜在的安全漏洞。任何人都可以编写bug,即使是优秀的程序员。拥有一种机制来限制webapps可能的操作是非常必要的