如何在Tomcat中正确configuration安全策略

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

值得注意的是:

  • 我没有更改股票tomcat安装 – 没有新的jar到它的公共lib目录(ies),没有server.xml变化等。把.war文件放在webapps目录是唯一的部署行动。
  • 我正在部署的Web应用程序失败,在此默认策略下有数千个访问拒绝(由于-Djava.security.debug="access,stack,failure"系统属性而被报告给日志)。
  • 完全closures安全pipe理器完全不会导致任何错误,以及正确的应用程序function

我想要做的是将一个特定于应用程序的安全策略文件添加到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; }; 

注意试图find正确的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) 

我相当确信触发拒绝的实际文件是无关紧要的 – 这只是一些属性文件,我们检查可选的configuration参数。 有趣的是:

  1. 在这种情况下不存在
  2. 该文件不存在的事实最终抛出了一个安全exception,而不是java.io.File.exists()简单地返回false(虽然我想这只是读取权限的语义问题)。

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

 grant { permission java.security.AllPermission; }; 

我认为这在function上等同于closures安全pipe理器。

我想我必须得到我的赠款中的codeBase声明微妙的错误,但目前我没有看到它。

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

佐证:

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

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

Tomcat以自己的tomcat用户运行。 战争文件需要对用户可见 – 可能值得先检查一下吗?

你直接部署到ROOT目录吗?

通常,当你在webapps文件夹中放置一个war时,比如说100myapp.war ,它会100myapp.war到一个名为100myapp的文件夹。 那么不应该在这个新文件夹而不是ROOT文件夹中完成授权吗?

您可能需要单独授予文件访问权限。 尝试将您的应用的授权更改为:

 grant codeBase "file:${catalina.base}/webapps/ROOT.war" { permission java.security.AllPermission; permission java.io.FilePermission "file:${catalina.base}/webapps/ROOT/-", "read, write"; } 

如果这不起作用,那么可能是现有许可证所涵盖的某些代码正在访问这些属性文件(例如,servlet或其他库代码)。

作为一种解决方法,为了确认是否属于这种情况,您可以对导致问题的.properties进行直接授予:

 grant { permission java.io.FilePermission "file:${catalina.base}/webapps/ROOT/WEB-INF/classes/com/foo/some-file-here.txt", "read, write"; } 

实际上,后者可能是这种情况,因为堆栈跟踪显示了Tomcat的上下文加载器中的代码。 如果.properties上的直接授权有效,则可能需要将授权锁定到org.apache.naming.resources.FileDirContext。

你得到任何特定于你自己的代码的堆栈跟踪?