如何阻止 Tomcat 提供对文件的访问?

如何阻止 Tomcat 提供对文件的访问?

我们有几个 tomcat 服务器,我们刚刚发现一些我们不想公开的文件可以访问这些文件。举例来说:

假设我们有一个文件夹 /var/www/html/,我们正在通过 tomcat 发布它,但我们不想公开 /var/www/html/conf/dbinfo.txt。此时人们可以访问 www.thissite.com/conf/dbinfo.txt 并可以看到一些东西。我希望能够阻止它,这样就不会显示它,但允许 tomcat 本身读取它。

任何帮助都将受到赞赏。

答案1

Tomcat 的文件访问由 WEB-INF/web.xml 的安全约束部分控制。

您可以通过conf以下方式进行阻止:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>HTTP-Protected-Resource-1</web-resource-name>
        <description>Description here</description>
        <url-pattern>/conf/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>NOSOUPFORYOU</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>DEFAULT</auth-method>
    <realm-name>NOACCESSFORANYONE</realm-name>
</login-config>
<security-role>
    <role-name>NOSOUPFORYOU</role-name>
</security-role>

如果您使用 apache 提供静态内容,则此方法将不起作用,因为 apache 将在 tomcat 获取 URL 之前提供 conf 文件。在这种情况下,您需要通过 apache 的 http 配置文件来解决这个问题。

答案2

向本帖中的所有系统管理员和 IT 工作者问好。感谢你们的回复。许多对我的问题的回复都是可以接受的,但这个回复最适合我们的生产环境。

好的。要在 server.xml 中阻止虚拟主机内的目录或文件,只需将以下代码添加到 tomcat/conf 目录中的 server.xml 中。

前:

  <Host name="www.customer.com" appBase="/usr/share/app4_0b/tomcat/webapps/" autoDeploy="false">
    <Context path="" docBase="./customer" />

    <Valapp className="org.apache.catalina.valapps.FastCommonAccessLogValapp"
           directory="weblogs/customer"
           prefix="www_customer_com_"
           suffix=".txt"
           pattern="combined"
           resolappHosts="false" />
  </Host>

后:

  <Host name="www.customer.com" appBase="/usr/share/app4_0b/tomcat/webapps/" autoDeploy="false">
    <Context path="" docBase="./customer" />

    <Context path="/app/xv/~customer/etc" docBase="" >
      <Valapp className="org.apache.catalina.valapps.RemoteAddrValapp" deny="*" />
    </Context>
    <Context path="/etc" docBase="" >
      <Valapp className="org.apache.catalina.valapps.RemoteAddrValapp" deny="*" />
    </Context>

    <Valapp className="org.apache.catalina.valapps.FastCommonAccessLogValapp"
           directory="weblogs/customer"
           prefix="www_customer_com_"
           suffix=".txt"
           pattern="combined"
           resolappHosts="false" />
  </Host>

因此,问题的答案是添加以下几行:

    <Context path="/app/xv/~customer/etc" docBase="" >
      <Valapp className="org.apache.catalina.valapps.RemoteAddrValapp" deny="*" />
    </Context>
    <Context path="/etc" docBase="" >
      <Valapp className="org.apache.catalina.valapps.RemoteAddrValapp" deny="*" />
    </Context>

答案3

为什么不将其存储在您的 Web 目录结构之外?我们从来不会将任何我们不想让用户发现的内容放在 /var/www/html/ 下。

答案4

忠告。修复权限后。更改所有密码,并确保没有 Google 缓存。

相关内容