写点什么

Apache Tomcat 7.x 安全加固指南

作者:喀拉峻
  • 2021 年 11 月 25 日
  • 本文字数:6074 字

    阅读完需:约 20 分钟

1 引言由于官方尚未发布 Tomcat 7 的强化指南,ERNW 便总结了相关的设置,并制作出本文中列出的清单。尽管有大量的设置可以被应用,但本文旨在提供一些加固方法的基础。可能对操作系统功能造成严重影响的并且需要进行进一步大量测试的设置并未列在该清单中,或者被标记为可选。


我们用“强制”或“可选”标记了此清单中的每个推荐设置,用以清楚的表达从我们的角度来看哪个设置是必须的(强制)或者是应该的(可选)。“可选”也意味着我们推荐你应用此设置,但这可能会影响系统的必需功能。


2 操作与系统安全 2.1 补丁与漏洞管理必须及时安装与安全相关的 Tomcat 更新:


必须在 10 天内安装高危或重要优先级的更新和补丁。


必须在发布后 30 天内安装中等优先级的更新和补丁。


必须在发布后 90 天内安装低优先级更新。


有关补丁的可用性和严重性的信息,请参见http://tomcat.apache.org/lists.html#tomcat-announce


更新可能会影响功能。关于核心/业务方面的 Tomcat 的更新可能带来的副作用,请查看http://tomcat.apache.org/lists.html#tomcat-announce


2.2 Tomcat 服务的最小权限在系统上以低权限运行 Tomcat 应用程序。创建一个专门的 Tomcat 服务用户,该用户只能拥有一组最小权限(例如不允许远程登录)。必须检查以最小特权用户身份使用操作系统资源库安装程序的行为,以确保 Tomcat 不以 root /管理员身份运行。必须在配置启动机制的操作系统层级上确保这一点(例如 Microsoft Windows 上的 Windows 服务或 Unix 上的 rc 脚本):


图一:Windows 服务配置


关于安全的服务配置,请参考 ERNW Windows 加固指南


图二:FreeBSD rc 脚本


具体配置与 Unix 系统和 Tomcat 版本有关。例如 FreeBSD 上的 Tomcat 7 已经不支持配置 rc.conf 中的用户帐户,因此用户名被硬编码在启动脚本中—这是不推荐的。在 FreeBSD 上,web 和应用服务器应该是以 www 用户身份运行,可参考http://www.freebsd.org/doc/en/books/porters-handbook/using-php.html#WEB-APPS


以低权限用户身份运行 Tomcat 可能会影响 Tomcat 的某些功能。例如,特权端口不可被设置为监听端口。为了解决该问题,可以在系统上使用本地 HTTP 代理(例如使用 Apache 的 mod_jk 模块)或者定义包转发规则,使得进入流量被转发到 Tomcat 监听的非特权端口。


2.3 限制访问 Tomcat 文件夹 Tomcat 文件夹只能由 tomcat 用户本身访问,尤其是对于目录 tomcathome/conf/和{tomcat_home}/webapps。


当不需要通过应用程序服务器自动部署时,标准配置就是将所有 Tomcat 文件的所有者设置为 root,并且所属群组设置为 Tomcat。然后用 chmod 740 仅允许 root 用户编辑文件并允许 Tomcat 用户读取文件。例外是,临时和工作目录的所有者应该是 Tomcat 用户而不是 root 用户。


该设置会影响自动部署。(参见第 8.5 小节)


3 管理界面 Tomcat 的主要管理界面被称为 Manager 应用程序。尽管保护该应用程序对于 Tomcat 服务器的安全至关重要,但是该应用程序在许多环境中被发现是非常的暴露的(例如,没有部署网络级限制以及使用弱/默认登录信息)。如果可能的话,管理性质的任务应该是在操作系统级别执行(例如使用 RDP 或 SSH),并且避免使用 Manager 应用程序(另见第 8.3 小节)。如果无法做到,下面小节描述的设置(或许还要考虑跳板机)应该与安全认证机制(另请参见第 4 小节)和加密传输(参见第 6.3 小节)结合使用。


3.1 网络层限制如果要使用 Manager 应用程序,应该只允许从授权的 IP 地址访问其管理界面。


这可以通过在 CATALINA_HOME/webapps/manager/META-INF/context.xml 文件中的做以下设置来实现。以下设置只允许从本地主机和特定 IP 地址或 IP 地址段访问管理界面:


<Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|172\.16\.16\.\d{1,3} "/>也可使用主机名:


<Valve className="org.apache.catalina.valves.RemoteHostValve"allow=".*\.admins\.domain\.com" />allow 和 deny 都支持正则表达式(使用 java.util.regex)


3.2 最小原则授权根据给定的任务,只能赋予相应角色的权限给用户。角色如下,并且要记得只赋予最小权限:


manager-gui:可以访问 web 界面


manager-status:只可以访问“Server Status”页面


manager-script: 可以脚本文本界面和“Server Status”页面


manager-jmx:可以访问 JMX 代理界面和“Server Status”页面


4 认证以下设置一般适用于基于 Tomcat 的身份验证。但是在大多数环境中,主要是针对 Manager 应用程序,因此以它来做例子。如果部署的应用程序使用基于 Tomcat 的认证,那么该应用程序也适用这些设置。


4.1 安全认证如果要使用 Manager 应用程序,则还应该附加额外的身份认证机制。认证机制优先级如下:


1 LDAPS 或客户端证书


2 本地(基于消息摘要)


另外,认证过程和与 Manager 应用程序的通信必须使用 SSL 来保护(见下文)。


对于本地和基于证书的身份验证,必须部署账户锁定机制(对于集中式认证,目录服务也要做相应配置)。为防止暴力破解,使用的认证域必须放在做了如下配置的锁定域中:


编辑 CATALINA_HOME/conf/server.xml 文件,并添加配置如下的锁定域:


<Realm className="org.apache.catalina.realm.LockOutRealm"


failureCount="5" lockOutTime="30">


</Realm>4.2 禁用域有几个域不适合用作生产用途,这些域必须被禁用。


打开文件 CATALINA_HOME/conf/server.xml,搜索 MemoryRealm 并禁用之。JDBCRealm 也必须被禁用,改用 DataSourceRealm。使用大规模安装时,请勿使用 UserDatabaseRealm 并也将其禁用。


5 会话处理 5.1 会话超时所有的 web 应用程序的会话超时必须设置为 20 分钟。


可通过编辑 CATALINA_HOME/conf/web.xml 文件并做以下配置来实现:


<session-config>


<session-timeout>20</session-timeout>


</session-config>5.2 HttpOnly 标记 Tomcat 7 对会话 cookie 自动启用 HttpOnly cookie 标记,查看配置以确保该选项为被禁用。


要启用 HttpOnly,必须在 CATALINA_BASE/conf/context.xml 中做如下设置,使之全局应用于所有应用程序:


<Context useHttpOnly='true' .../>


在需要通过 JavaScript 访问会话 cookie 的情况下,使用 HttpOnly 可能会影响应用程序功能。如果应用程序需要通过 JavaScript 访问 HttpOnly cookie,可以在 METAINF/context.xml 中一个单独的 Context 中定义一个异常。


5.3 CSRF 防护为保护应用程序,必须启用 Tomcat 的跨站请求伪造防护。Tomcat 7 提供了基本的 CSRF 防护。可以在 CATALINA_BASE/conf/web.xml 中配置一个全局过滤器。该过滤器可以被每个使用 WEB-INF/web.xml 文件的应用程序覆盖。


必须做以下设置:


<filter-mapping><filter-name>CSRFPreventionFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>有关详细说明和其他选项,请参阅 Tomcat 手册:http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CSRF_Prevention_Filter


使用 CSRF 防护可能会影响程序功能,必须要牢记这一点,尤其是在应用程序大量使用异步请求的情况下。


6 网络安全 6.1 限制监听网络接口不要让连接器(connector)监听服务器上所有可用的网络接口和 IP 地址,而要让连接器监听指定的网络接口和 IP 地址。


编辑 CATALINA_HOME/conf/server.xml,查看每个 Connector 并指定正确的 IP 地址:


<Connector port="TCP_PORT" address="LISTEN_IP_ADDRESS"…这样可以防止应用程序意外地运行在某个开放的网络接口上。


6.2 限制允许的网络连接只开放必须要的 Tomcat 端口。默认 TCP 端口是 8080 和 8443。确保在 Tomcat 和可安装在系统上的现有的包过滤器中正确配置这些端口。


打开 CATALINA_HOME/conf/server.xml 文件,查看每个 Connector 的端口配置。移除不需要的端和 Connector。


6.3 加密网络连接为了保护敏感的应用程序(比如 Manager 应用程序),必须使用并配置 SSL(对于处理敏感数据或提供登录功能的应用程序也是必需的)。第一步是创建可信的证书,以避免证书警告,并向终端用户提供一种验证可信连接的方法。


第二步是创建一个证书密钥库(keystore),其中包含 CA、服务器证书和相应的私钥。密钥库的密码应按照之前的“保障密码安全”小节中建议来创建。


要启用 SSL 支持,可以使用以下配置(实际配置取决于给定的平台和要求),并且必须放在 CATALINA_HOME/conf/server.xml 中:


<Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8443" scheme="https"secure="true" SSLEnabled="true" sslProtocol="TLS" keystoreFile="path to keystore file"keystorePass="keystore password"/>通过添加以下密码套件(cipher suite)至 SSL Connector 来指定可用的 SSL 加密方式:


<Connector ciphers="SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA" …为了使托管在 Tomcat 上的所有 web 应用程序强制使用 HTTPS,必须在每个 CATALINA_HOME/webapps/$WEBAPP/WEB-INF/web.xml 文件里每个 security-constraint 标签关闭(</security-constraint>标签)之前包含以下内容:


<user-data-constraint>


  <transport-guarantee>CONFIDENTIAL</transport-guarantee>
复制代码


<user-data-constraint>7 Java Runtime7.1 Java SecurityManager 可用 Java SecurityManager 限制单个应用程序的功能。$CATALINA_HOME/conf/catalina.policy 文件包含了 Java SecurityManager 使用的安全策略的配置。一旦配置了 catalina.policy 文件,便可以使用 SecurityManager 和--security 选项启动 Tomcat。想了解全面的配置介绍,请参阅官方的 Tomcat SecurityManager 教程:http://tomcat.apache.org/tomcat-7.0-doc/security-manager-howto.html


因为基本上所有的权限类型(比如访问单个文件和目录或 Java 包)都应该根据每个应用程序进行单独配置,所以这会大大增加操作成本。另外,限制过于严格的策略文件会影响应用程序的功能。


7.2 访问 Java 包 Tomcat 可限制对某些 Java 包的访问。如果检测到受限制的包被访问,将抛出安全异常。


对 Java 包做访问限制,打开 $CATALINA_BASE/conf/catalina.properties 文件并添加不允许访问的包至 package.access 列表。


分析 Java import 可以列出哪些应用程序需要哪些包。在 Unix 系统上,可以使用以下例子来实现:


grep –R import ${tomcat_home}/webapps/WEBAPP


8 通用设置 8.1 确保默认设置的安全检查几个默认值以防出现潜在的漏洞。参考第 9 小节列出的不能更改的默认配置。


8.2 确保关闭(shutdown)端口的安全如果必须要开启使用本地 Tomcat 系统上的网络端口关闭 Tomcat 的功能,必须使用难以被猜解出的强密码。


编辑 CATALINA_HOME/conf/server.xml 文件并设置关闭密码:


<Server port="8005" shutdown="NonDeterministicWordSoShutdownPWisNotEasyToGuess">


如果不需要该功能,必须要将其停用,设置如下:


<Server port="-1" shutdown="SHUTDOWN">


本地管理脚本可将服务器关闭,即使在关闭端口被禁用的情况下。


8.3 移除默认应用程序 Tomcat 可能自带一些默认的 web 应用程序。如果不是一定需要,必须将它们移除。


移除 ${tomcat_home}/webapps 中所有的默认的 web 应用程序。必须要移除的应用程序有:ROOT、Documentation、Examples、Host Manager 和 Manager。


Manager 应用程序提供管理性质的功能,比如部署应用程序和检索日志信息。这些功能应该使用本地服务器上的命令行来运行。但是,如果这个应用程序是绝对需要的,那它必须用 SSL 保护起来。


8.4 自定义错误页面由于默认的错误页面会泄露一些内部信息(比如版本号和堆栈轨迹),所以应该用包含一般错误信息(比如处理您的请求时出错了)的自定义错误页面取而代之。


每个 web 应用程序的 web.xml 文件里应包含以下配置,该文件位于 CATALINA_HOME/webapps/$WEB_APP/WEB-INF:


<error-page>


<error-code>500</error-code>


<location>/errorpages/error.html</location>


</error-page>


<error-page>


<exception-type>java.lang.Throwable</exception-type> <location>/errorpages/error.html</location>


</error-page>此外,如果 Manager 应用程序没被移除,必须手动将位于 CATALINA_HOME/webapps/manager/WEB-INF/jsp/的错误页面里的“Tomcat 7“版本信息移除。


8.5 禁用自动部署 Tomcat 允许在 Tomcat 运行时自动部署应用程序。这个功能必须被禁用,因为它可能允许部署恶意或未经测试的应用程序。


自动部署由 autoDeploy 和 deployOnStartup 属性控制。如果两者是 false,只有在 server.xml 中定义的 Context 将被部署,并且任何更改都需要重启 Tomcat。要禁用自动部署,请在 $CATALINA_HOME/conf/server.xml 文件中做以下配置:


autoDeploy=”false”


deployOnStartup=”false”在托管环境中 Web 应用程序可能不受信任,也可以设置 deployXML 属性为 false 来忽略 context.xml,以防给该 web 应用程序提高权限。


9 附录:默认设置以下列出了不能更改的默认设置,默认情况下这些设置被认为是安全的:


server.xml 中每个 Connector 的 allowTrace 的值要么为空或要么被设为 false。


在所有的 context.xml 文件中,将 privileged 属性设置为 false,除非像 Manager 应用程序那样需要权限:


<Context ... privileged =“false”/>确保 crossContext 值为空或被设为 false。crossContext 值为 true 可能会导致允许恶意应用程序向受限应用程序发送请求。<Context ... crossContext =“false”/>确保 allowLinking 值为空或被设为 false。allowLinking 值为 true 可能会导致目录遍历和源代码泄露漏洞的产生。<Context... allowLinking =“false”/>禁止对默认的 servlet 的写入。在 web.xml 文件中设置 DefaultServlet 的 read-only 为 true。如果该值是 false,将会允许客户端删除或修改服务器上的静态资源并上传新的资源。一般在没有认证的情况下不应该修改该值。


禁用显示列表设置 DefaultServlet 的 listings 为 false。这不仅仅是因为允许显示目录列表被认为是不安全的,而且还因为生成具有数千个文件的目录列表会消耗大量的 CPU 资源,相当于被 DDoS 攻击。


当 RECYCLE_FACADES 选项设置为 true 时,Tomcat 会回收请求间会话外观(session facade)。这将导致请求间的信息泄漏。默认情况下,此参数未被设置。确保使用的启动脚本不包含以下内容:-Dorg.apache.catalina.connector.RECYCLE_FACADES = false


允许在 Tomcat 上指定不同的路径分隔符,可能会允许攻击者访问应用程序,该行为本该被代理程序(比如 mod_proxy)阻止。默认情况下,此参数未被设置。确保正在使用的启动脚本不包含以下内容:


-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH = FALSE


-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = FALSE


允许指定自定义 header 状态消息,使攻击者也能够插入 header。这可能会导致 XSS 漏洞的产生。默认情况下,此参数未被设置。确保使用的启动脚本不包含以下内容:


-Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = false


-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = FALSE


允许自定义 header 状态消息,使攻击者也能够插 header。这可能会导致 XSS 漏洞的产生。默认情况下,此参数未被设置。¬ 确保使用的启动脚本不包含以下内容:


-Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = false

用户头像

喀拉峻

关注

左手Java右手Python,中间纹个C++ 2021.06.26 加入

还未添加个人简介

评论

发布
暂无评论
Apache Tomcat 7.x安全加固指南