如何在Tomcat 6中理智地配置安全策略

2022-09-03 03:01:55

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

一开始就值得注意的:

  • 我根本没有更改库存tomcat安装 - 没有新的jars进入其公共lib目录,没有更改等。将 .war 文件放在目录中是唯一的部署操作。server.xmlwebapps
  • 我正在部署的 Web 应用程序在此默认策略下失败,有数千个访问拒绝(由于系统属性而报告到日志)。-Djava.security.debug="access,stack,failure"
  • 完全关闭安全管理器不会产生任何错误,并且应用程序功能正确

我想做的是将特定于应用程序的安全策略文件添加到目录中,这似乎是推荐的做法。我添加了以下内容(作为起点 - 我想最终将授予的权限减少到仅应用程序实际需要的权限):policy.dpolicy.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. 文件不存在的事实最终会引发安全异常,而不是简单地返回false(尽管我认为这只是读取权限的语义问题)。java.io.File.exists()

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

grant {
  permission java.security.AllPermission;
};

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

我想我一定是在我的补助金中得到了微妙的错误,但我目前没有看到它。codeBase


答案 1

您是否正在使用 Ubuntu 的包管理版本?我们最近在安全方面遇到了一个噩梦,但发现通过单独下载Tomcat并使用它,安全问题消失了。

佐证:

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

如果您正在运行Ubuntu并且想要使用Tomcat servlet容器,则不应使用存储库中的版本,因为它无法正常工作。相反,您需要使用我在这里概述的手动安装过程。


答案 2

Tomcat 使用自己的 tomcat 用户运行。war文件需要对该用户可见 - 可能值得先检查一下?