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

cem*_*ick 17 java ubuntu tomcat securitymanager tomcat6

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

值得一提的是:

  • 我根本没有更改库存tomcat安装 - 没有新的jar进入其公共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;
};
Run Code Online (Sandbox Code Playgroud)

请注意试图找到正确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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

grant {
  permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)

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

我想我必须codeBase在我的补助金中巧妙地做出声明,但我现在还没有看到它.

ang*_*ger 0

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