gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:41:40 25 4
gpt4 key购买 nike

我使用的是为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com