java - 如何在Tomcat 6中合理配置安全策略

标签 java tomcat ubuntu tomcat6 securitymanager

我使用的是为 Ubuntu Karmic 打包的 Tomcat 6.0.24。 Ubuntu 的 Tomcat 包的默认安全策略非常严格,但看起来很简单。在/var/lib/tomcat6/conf/policy.d中,有各种建立默认策略的文件。

开 header value 得注意:

  • 我根本没有更改现有的 tomcat 安装——没有新的 jar 到它的公共(public) lib 目录,没有 server.xml 更改,等等。将 .war 文件放在webapps 目录是唯一的部署操作。
  • 我正在部署的 Web 应用程序在此默认策略下失败并拒绝访问数千次(由于 -Djava.security.debug="access,stack,failure" 向日志报告)系统属性)。
  • 完全关闭安全管理器不会导致任何错误,并且应用程序功能正常

我想做的是将特定于应用程序的安全策略文件添加到 policy.d 目录,这似乎是推荐的做法。我将此添加到 policy.d/100myapp.policy(作为起点——我想最终将授予的权限缩减为仅应用程序实际需要的权限):

grant codeBase "file:${catalina.base}/webapps/ROOT.war" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/-" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/-" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/lib/-" {
  permission java.security.AllPermission;
};

grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/classes/-" {
  permission java.security.AllPermission;
};

请注意在尝试找到正确的 codeBase 声明时遇到的麻烦。我认为这可能是我的根本问题。

无论如何,上面的(实际上只有前两个授权似乎有任何效果)几乎有效:成千上万的访问拒绝都消失了,我只剩下一个。相关堆栈跟踪:

java.security.AccessControlException: access denied (java.io.FilePermission /var/lib/tomcat6/webapps/ROOT/WEB-INF/classes/com/foo/some-file-here.txt read)
  java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
  java.security.AccessController.checkPermission(AccessController.java:546)
  java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
  java.lang.SecurityManager.checkRead(SecurityManager.java:871)
  java.io.File.exists(File.java:731)
  org.apache.naming.resources.FileDirContext.file(FileDirContext.java:785)
  org.apache.naming.resources.FileDirContext.lookup(FileDirContext.java:206)
  org.apache.naming.resources.ProxyDirContext.lookup(ProxyDirContext.java:299)
  org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:1937)
  org.apache.catalina.loader.WebappClassLoader.findResource(WebappClassLoader.java:973)
  org.apache.catalina.loader.WebappClassLoader.getResource(WebappClassLoader.java:1108)
  java.lang.ClassLoader.getResource(ClassLoader.java:973)

我非常确信触发拒绝的实际文件是无关紧要的——它只是我们检查可选配置参数的一些属性文件。有趣的是:

  1. 在这个上下文中不存在
  2. 文件不存在的事实最终会引发安全异常,而不是 java.io.File.exists() 简单地返回 false(尽管我认为这只是读取权限的语义)。

另一个解决方法(除了禁用 tomcat 中的安全管理器之外)是向我的策略文件添加一个开放式权限:

grant {
  permission java.security.AllPermission;
};

我认为这在功能上等同于关闭安全管理器。

我想我的授权中的 codeBase 声明一定是有细微的错误,但我目前没有看到。

最佳答案

您使用的是 Ubuntu 的包管理版本吗?我们最近对它的安全问题做了噩梦,但发现通过单独下载 Tomcat 并使用它,安全问题就消失了。

佐证:

http://www.howtogeek.com/howto/linux/installing-tomcat-6-on-ubuntu/

If you are running Ubuntu and want to use the Tomcat servlet container, you should not use the version from the repositories as it just doesn’t work correctly. Instead you’ll need to use the manual installation process that I’m outlining here.

关于java - 如何在Tomcat 6中合理配置安全策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2645298/

相关文章:

java - 如何在 LINUX 上设置环境变量 CLASSPATH 和 NoClassDefFoundError

java - 如何创建带有复选框项目的组合框?

java - null 参数错误计算节点上的 id

java - 在java中模拟https请求

tomcat - 当 Webapp 在不同的服务器上运行时,Solr 结果会有所不同。编码问题?

eclipse - 服务器不启动spring app

android - 无法更新 Android Development Toolkit 中的加载项

ubuntu - 将 Ubuntu 14 上的 CKAN 迁移到 Redhat Linux 7

java - Maven Tomcat7 运行依赖 war

python - Postgresql 启动失败