精华 Tomcat7 加固清单
发布于 3 个月前 阅读权限 无需登录 作者 zhutougg 2032 次浏览 最后一次编辑是 1 个月前 来自 知识碎片

一、简介

作为非官方的Tomcat7加固指南,ERNW已经把相关的设置编辑成这个CheckList。虽然有大量的设置,这个文档提供了基础化的加固措施。那些可能会严重影响操作系统的功能,需要进一步测试的设置项不包含于本文档,或者已标记成可选项。 我们在清单上标记了每一个建议的设置状态,如"强制"或"可选","可选"同样代表我们推荐使用这个设置,不过它可能导致系统出现意外

二、操作与系统安全

2.1 补丁和漏洞管理[强制]

必须及时安装与安全性相关的tomcat补丁

  1. 关键和重要的更新及补丁需要在十天内部署
  2. 中等优先级的更新及补丁需要在三十天内部署
  3. 低等代先级的更新及补丁可以在九十天内部署

有关补丁的可用性和严重性的信息可以在这里找到

2.2 设置Tomcat服务最小权限[强制]

系统应该使用较低的权限来运行Tomcat服务,可以创建专门的用户来启动Tomcat服务(该用户应该禁止远程登陆系统)。必须严格审查安装tomcat的用户权限,以确保它不会以root/administrator运行

2.png

上图为WINDOWS系统设置

3.png

上图为FreeBSD设置脚本

使用较低权限用户运行Tomcat服务,可能会影响Tomcat提供使用的某些特性。比如:设置监听端口为高权限端口操作为失败。这可以通过在系统上使用本地HTTP代理(Apache或者mod_jk)将请求转发给Tomcat监听的端口

2.3 限制对Tomcat文件夹的访问权限[可选]

Tomcat的文件夹应该只能由Tomcat用户自己访问。特别是目录${tomcat_home}/conf/ a${tomcat_home}/conf/

当不需要通过应用程序服务器自动部署时,标准配置是Tomcat的文件权限应该设置为Root权限用户及Tomcat用户。可能通过chmod 740让root用户编辑这些文件,并使Tomcat用户可以读取它们。temp目录和webapps目录应该所属于tomcat用户而不是root用户。

三、管理界面

Tomcat的主要管理接口就是Manager应用。这个应用程序在很多场景中都有使用默认口令或者没有网络级别的限制,尽管它对于Tomcat服务器的安全操作非常重要。如果条件允许的话,管理任务应该在操作系统上执行(如使用RDP或SSH),并且Manager应用并不应该被部署。如果条件不允许的话,下面描述的控制参数应该与安全认证机制相结合并且加密传输

3.1 网络级限制[可选]

如果部署了Manager应用,那么管理界面只能由授权的IP地址进行访问。 这个可以通过配置文件CATALINA_HOME/webapps/manager/META-INF/context.xml来实现该功能。 可以使用以下配置来限制只允许localhost,特定IP或者指定IP范围来访问。

1.png

上图为默认context.xml内容,只需把下面的注释清除即可

<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}
"/>

除了IP外,也可以使用主机名

<Valve className="org.apache.catalina.valves.RemoteHostValve" 
	allow=".*\.admins\.domain\.com" 
/>

注:allow和deny属性都是支持正则表达式解析的

3.2 最小权限原则[强制]

根据给出的需求,分配各个角色的权限。下列角色是可用的,请务必遵循最小权限原则

manager-gui:	允许访问WEB界面
manager-status:	仅允许访问`Server Status`页面
manager-script:	允许访问脚本跳转和纯文本以及`Server Status`页面
manager-jmx:	允许访问JMX代理接口和`Server Status`页面

四、身份认证

在一般情况下,下面提及的方法都适用基于Tomcat的身份验证。但是在大多数情况下,它们更适用于Manager应用。

4.1 安全认证

如果部署了Manager应用,应该使用额外的身份验证机制。身份验证机制按以下顺序排列:

  1. LDAPS或者客户端证书
  2. 限制本地登陆

另外,Manager的身份验证过程必须是基于SSL的。

[强制]对于本地和基于证书的认证,必须执行帐户锁定策略,来防止暴力破解攻击。配置方式如下:

编辑文件CATALINA_HOME/conf/server.xml,添加错误次数及锁定时间

<Realm className="org.apache.catalina.realm.LockOutRealm"
	failureCount="5" lockOutTime="30">
	<!-- AUTHENTICATION REALM -->
</Realm>
4.2 禁用范围[强制]

如果有多个域名不应该用于生产环境,那么这些域名必须被禁用。打开文件 CATALINA_HOME/conf/server.xml,搜索MemoryRealm然后注释它。JDBCrealm同样也必须被禁用,改用DataSourceRealm替代。(注:当使用大型应用程序时,请不要使用并禁用UserDatabaseRealm)

五、会话管理

5.1 session超时[强制]

所有web应用程序的会话超时必须设置为20分钟。可以通过配置文件CATALINA_HOME/conf/web.xml来实现该功能

<session-config>
	<session-timeout>20</session-timeout>
</session-config>
5.2 HttpOnly标识[强制]

Tomcat7 会自动将session cookie标记为HttpOnly。只需打开配置文件CATALINA_BASE/conf/context.xml,查看相关配置不被注释即可

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

使用HttpOnly会破坏必要情况下允许JavaScript操作session cookie的应用程序功能。如果应用程序需要允许JavaScript操作HttpOnly标识的session cookie,您可以在应用程序的/METAINF/context.xml单独配置一个例外情况。

5.3 CSRF保护[强制]

Tomcat 必须开启CSRF防护功能来保护应用程序。Tomcat7 提供了一个基本的CSRF防护,可以在文件CATALINA_BASE/conf/web.xml配置一个全局过滤器,该过滤器可以覆盖所有使用了WEB-INF/web.xml的应用程序。配置方法如下:

<filter-mapping>
   <filter-name>CSRFPreventionFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

这个功能的详细说明与其它选项,请参考 tomcat manual 7

使用CSRF防护可能会破坏应用程序功能,特别是大量使用AJAX请求的系统

六、 网络安全

6.1 限制监听接口[强制]

服务器禁止监听所有接口/IP地址,应该是指定某个IP地址

编辑文件 CATALINA_HOME/conf/server.xml,检查每个连接器是否正确指定IP

<Connector port="TCP_PORT" address="LISTEN_IP_ADDRESS"…
6.2 限制允许的网络连接[强制]

只打开必要的Tomcat端口,默认设置的TCP端口为8080和8443。确保这些端口在Tomcat中正确配置在现有的过滤器上。

打开文件CATALINA_HOME/conf/server.xml,检查每一个连接器的当前配置及期望设置的端口,删除不使用的端口和连接器

6.3 加密网络连接[强制]

敏感的应用程序必须配置SSL访问,如manager应用,对于托管敏感数据的应用程序必须包含登陆功能。

第一步就是创建可信赖的证书,以避免证书警告信息,并为最终用户提供一种可信连接的方法。

第二步是创建证书密钥库,包含CA证书,服务器证书及相关的私钥。

具体方法这里仅提供参考,具体配置还要看业务需求。

编辑文件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"/>

以下面密码套件的形式将密码属性添加到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>标签中,加上以下内容

<user-data-constraint>
	<transport-guarantee>CONFIDENTIAL</transport-guarantee>
<user-data-constraint>

七、Java Runtime

7.1 Java Security Manager[可选]

可以使用Java Security Manager 来限制单个应用程序的功能。Java Security Manager的安全策略配置在文件$CATALINA_HOME/conf/catalina.policy中。只要在catalina.policy文件中配置了,Tomcat 就可以通过使用--security参数启动,让Java Security Manager生效。对于这个参数详细的描述,可以参考官方的Tomcat安全管理文档

7.2 JAR包的权限控制[可选]

Tomcat提供了限制访问某些JAR包的功能,如果访问了被限制的JAR包,Tomcat将抛出一个安全异常,为了限制不允许访问的JAR包,可能通过配置文件$CATALINA_BASE/conf/catalina.properties添加不允许访问的JAR包到package.access列表中

为了评估应用程序需要哪些JAR包,可以通过Java的import进行分析,如在Unix系统中,可以使用如下命令实现

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

八、常用设置

8.1 默认安全配置[强制]

为了防止可能的漏洞,必须检查几个默认值,指第9部分默认配置列表没有被修改

8.2 安全关闭端口[强制]

如果需要通过本地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,docs,,,examples,host-managermanager

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应用如果没有被删除,"tomcat 7"版本信息必须从错误页面中手动删除(文件位于CATALINA_HOME/webapps/manager/WEB-INF/jsp/)

8.5 禁用自动部署[强制]

Tomcat允许在运行时自动部署应用程序,这个功能必须禁用,因为它可能允许部署恶意的或未测试的应用程序。 自动部署功能由autoDeploydeployOnStartup属性控制,如果两个都为false,只有在server.xml中定义了的应用会被部署,其它任何修改都需要重新启动Tomcat 。编辑文件$CATALINA_HOME/conf/server.xml,设置以下参数来禁用自动部署。

autoDeploy=”false”
deployOnStartup=”false”

在托管环境中,WEB应用可能不受信任,也可以设置deployXML属性为false,来忽略WEB应用包含的context.xml,这可能尝试为WEB应用程序分配更多的特权。

8.6 禁用不必要的http方法

Tomcat服务器提供默认http方法包括GET、HEAD、POST、PUT、DELETE、OPTIONS。在配置前,需要了解产品是否会使用到这些HTTP方法,如果用不到,则必须禁用。在tomcat目录下的web.xml中配置

<security-constraint>  
        <web-resource-collection>  
            <url-pattern>/*</url-pattern>  
            <http-method>PUT</http-method>  
            <http-method>DELETE</http-method>  
            <http-method>HEAD</http-method>  
            <http-method>OPTIONS</http-method>  
            <http-method>TRACE</http-method>  
        </web-resource-collection>  
        <auth-constraint>  
        </auth-constraint>  
</security-constraint>  

若只需要禁用delete和put方法,可以通过设置readonly为true来完成。在Tomcat的web.xml 文件中配置org.apache.catalina.servlets.DefaultServlet的初始化参数

<init-param>  
    <param-name>readonly</param-name>  
    <param-value>false</param-value>  
</init-param>

8.7 禁用webdav

WebDAV(Web-based Distributed Authoring and Versioning)是基于 HTTP 1.1 的一个通信协议。它为 HTTP 1.1 添加了一些扩展(就是在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些新的方法),使得应用程序可以直接将文件写到 Web Server 上,并且在写文件时候可以对文件加锁,写完后对文件解锁,还可以支持对文件所做的版本控制。这存在一定的安全问题。Tomcat本身是支持WebDAV的,虽然需要进行配置才可以启用。 确保以下配置在web.xml中不存在或者为注释状态

<servlet>
    <servlet-name>webdav</servlet-name>
    <servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
</servlet>

8.8 禁止配置Tomcat的网络连接超时时间为0或-1

connectionTimeout为网络连接超时时间毫秒数,当配置为0或-1时,表示永不超时,在受到DOS攻击时,很快就会导致最大连接数被完全占用,进而导致Tomcat服务器无法访问。因此这里禁止配置connectionTimeout为0和-1,通常推荐的超时时间为20s和30s。特殊情况下,请根据具体性能需求进行调优

在配置文件$tomcat/conf/server.xml中的每个Connector的“connectionTimeout”属性为20000:
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" maxPostSize="10240"
               redirectPort="8443" />

九、附录:默认设置

这里列出了一些默认设置,默认设置不能更改

  1. 文件server.xml中为每一个连接设置的allowTrace要么不存在,要么设置为false

  2. 在所有的context.xml文件中,设置特权属生为false,除非管理应用程序需要它

    <Context ... privileged=”false” />
    
  3. 确保crossContext的值为false或者未设置

    <Context ... crossContext=”false” />
    
  4. 确保allowLinking值为false或者未设置 <Context ... allowLinking=”false” />

  5. 不允许为DefaultServlet设置任何读写的权限

    在web.xml中DefaultServlet将read-only设置为true,将其更改为false允许客户端删除或修改服务器上的静态资源并上传新的资源。这通常不需要更改身份验证
    
  6. ​禁止列目录

    DefaultServlet设置list为false,不仅仅是因为允许列目录是不安全的,也由于生成具有数千个文件目录的列表会占用大量的CPU资源,导致DoS攻击。
    

<init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param>


7. 当`RECYCLE_FACADES`选项设置为`true`时,Tomcat会在请求是回收Session。这会导致请求时信息泄漏。默认情况下,该参数未设置。确保启动脚本程序不包含下面这段代码

Dorg.apache.catalina.connector.RECYCLE_FACADES=false


8. 在Tomcat上设定不同的路径分隔符,使攻击者在访问应用程序之前被类似`mod_proxy`的代码程序阻止。默认情况下,该参数未设置

确保启动脚本不包含下面一行 -Dorg.apache.catalina.connector. CoyoteAdapter.ALLOW_BACKSLASH=false -Dorg.apache.tomcat.util.buf. UDecoder.ALLOW_ENCODED_SLASH=false

9. 能够指定自定义header状态信息,会使攻击者能够注入头信息,这允许一个潜在的XSS跨站脚本攻击漏洞。默认情况下,该选项未配置

确保启动脚本不包含下面一行 -Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=false

10 回复

应峰哥要求,翻译这篇文档https://www.ernw.de/download/hardening/ERNW_Checklist_Tomcat7_Hardening.pdf 翻译的不好,请见谅。 (第九章部分应该是社区的MD解析与我本地编辑器的MD解析姿势不同导致可读性降低)

更新内容:文章的最后一条在tomcat8.5中已取消,详情:https://tomcat.apache.org/tomcat-8.5-doc/changelog.html

@zhutougg 大佬,可以转载到我的个人博客吗,想收藏一下

@akityo 可以的哦,要是能带上http://www.zhutougg.com/2017/08/14/tomcat-jia-gu-qing-dan/出处就更好啦,哈哈

@zhutougg 肯定会带上出处的,毕竟基本的意识还是有的

收藏,学习了

这个感觉跟加固规范很像

回到顶部