【问题标题】:How to sanely configure security policy in Tomcat 6如何在 Tomcat 6 中合理配置安全策略
【发布时间】:2011-02-08 08:57:08
【问题描述】:

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

开头值得注意:

  • 我根本没有更改股票 tomcat 安装 - 没有新的 jars 到它的公共 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 声明,但我现在没有看到它。

【问题讨论】:

    标签: java tomcat ubuntu tomcat6 securitymanager


    【解决方案1】:

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

    证实:

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

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

    【讨论】:

    • 除了这个安全管理器问题之外,我们没有遇到任何关于 tomcat 的问题——它以何种方式对您来说“无法正常工作”? FWIW,链接的文章大约有 3 年的历史,cmets 指的是 ubuntu 7.x。不过,我会尝试手动安装,看看会发生什么。
    • 这都是与安全管理器相关的,我们遇到的问题。那就是说是我团队的一位同事与之抗争,他现在离开了公司,所以我不能给你任何细节。看到您的问题,并且从未听说过 packaged-tomcat-on-ubuntu 之外的此类问题,这对我来说是个大红警,并且使用独立安装是无缝的。
    • 出于好奇,您是如何进行手动安装的?
    【解决方案2】:

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

    【讨论】:

    • 是的,所有有问题的文件(.war 文件和展开的应用程序目录)都归 tomcat6:tomcat6 所有,与运行 tomcat 服务器的用户相同。
    【解决方案3】:

    你是直接部署到ROOT目录吗?

    通常,当您在 webapps 文件夹中放置一个战争时,例如 100myapp.war,它会解压缩到一个名为 100myapp 的文件夹中。难道不应该在这个新文件夹而不是 ROOT 文件夹上完成授权吗?

    【讨论】:

    • 一般来说,我们将我们的应用程序部署为ROOT.war,因此它将被解压到ROOT 目录。以防万一这是问题的根源,我还尝试部署到另一条路径 (foo.war),根据需要更新授权(参考 foo.war 和解压缩的 foo 目录。
    【解决方案4】:

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

    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。

    您是否获得任何特定于您自己的代码的堆栈跟踪?

    【讨论】:

    • 对不起,没有骰子:为我所有的授权添加一个带有“读、写”选项的 FilePermission 没有任何改变。但是,我确实认为该理论有一些东西:tomcat 加载的默认策略文件(位于/var/lib/tomcat6/work/catalina.policy),已经为我一直使用的代码库指定了授权,但其中包括 AllPermission 和 FilePermission。尽管快速测试表明前者意味着后者。不幸的是,对特定文件的一揽子授权也没有改变行为。不,我从我们的代码库中看不到任何堆栈跟踪。
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2017-07-15
    • 2017-05-08
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多