1.配置文档中使用$CATALINA_HOME变量声明为tomcat的安装目录并明确写出了tomcat的配置文件路径,此路径为测试环境的路径,线上系统对应配置文件的路径可能不一样,在进行相关配置时,应以线上配置文件的实际路径为准。
2.本文档仅包括了用于提升安全的配置方法。
3.在遵从本文档的方法进行配置前,请做好相关配置文件的备份,以便在配置失败时可以回退到变更前状态。
1.新安装,选用安全稳定版本
编号: |
Tomcat_Sec_001 |
适用: |
新安装或者升级tomcat服务器 |
配置要求: |
1.新安装或者升级tomcat服务器时建议选用最新稳定版本,源码安装包文件要求从官方网站下载(http://tomcat.apache.org/)并要求对下载后的源码包文件进行完整性验证。 2.如果是跨大版本升级,则要求在测试环境测试不存在兼容性问题后才可在生产环境进行部署。 源码包文件进行完整性验证方法请参照“备注”处的方法。 |
安全增强说明: |
1.新版本往往修复了大量在旧版本中发现的安全漏洞,选用新版本可以防范或者减少已知漏洞的影响。选用稳定版则使得功能加固稳定; 2.从官方网站下载安装包,以及对安装包进行指纹验证可以最大程序确保安装文件未被篡改; |
备注: |
对tomcat源码包文件进行指纹验证方法: 方法1,验证sha1指纹: (1)下载源码包文件和该文件的sha1指纹文件在同一目录: (2)执行# sha1sum -c 源码包文件 例如: apache-tomcat-7.0.70.tar.gz: 确定 ---说明校验成功,文件没有被篡改。 如果显示如下,则说明文件已经被篡改。 apache-tomcat-7.0.70.tar.gz: 失败 sha1sum: 警告:1/1 生成的校验和不匹配 方法2,可以参考nginx安全配置文档中关于pgp检验方法进行pgp指纹的校验。 |
2.使用普通账号运行tomcat服务
编号: |
Tomcat_Sec_002 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
要求tomcat服务器进程只能使用普通账号运行,不能使用root账号,具体方法参考“备注”处的配置方法。 |
安全增强说明: |
防范或降低攻击者通过上传webshell来获取到的执行权限 |
备注: |
创建普通账号运行tomcat服务的方法: (1)创建tomcat用户组 # sudo groupadd -g 1000 tomcat (2)创建tomcat用户,并限制登录 #sudo useradd -s /bin/bash -g tomcat -u 1000 tomcat 说明:GID和UID定义为1000,避免与nis系统上的账号的ID冲突。 # sudo usermod -L tomcat 备注: -L 锁定用户密码,使密码无效。 -U 解除锁定 (3)修改tomcat项目目录所有者和用户组 #sudo chown -R tomcat:tomcat $CATALINA_HOME 备注: $CATALINA_HOME为tomcat的家目录,如果web应用项目的目录定义在家目录以外的目录,则也可以使用该方法来设置对应目录的所有者和用户组。 (4) 使用普通账号运行tomcat服务 #sudo -u tomcat -c "/usr/local/tomcat7/bin/startup.sh" 说明:-c 后跟tomcat的启动脚本,实际部署中该路径可能不一样. (5)查看tomcat服务端口已成功启动 (6)查看tomcat进程账号为tomcat |
3.移除样例目录和帮助文档应用
编号: |
Tomcat_Sec_003 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
tomcat的样例目录(examples)和帮助文档(docs)应用仅用于演示和学习的目录,线上部署的tomcat服务器要求移除这两个应用, 具体方法参考“备注”处的方法。 |
安全增强说明: |
应该从安全敏感性安装中移除examples应用。虽然 examples 应用并不包含任何已知的漏洞,但现已证明,它所包含的一些功能可以被攻击者利用,特别是一些显示所有接收内容,并且能设置新 cookie 的 cookie 范例。攻击者将这些公关和部署在 Tomcat 实例中的另一个应用中的漏洞相结合,就能获取原本根本不可能得到的信息。 |
备注: |
“移除样例目录应用”方法: 1.样例目录应用(examples)位于$CATALINA_HOME/webapps/ examples,($CATALINA_HOME是tomcat安装目录) (1)访问样例应用时,在web页面的显示如下: (2)直接将$CATALINA_HOME/webapps/目录下的整个examples目录删除即可。 “移除帮助文档应用”方法 2. 帮助文档(docs)应用位于$CATALINA_HOME/webapps/ docs目录,($CATALINA_HOME是tomcat安装目录) (1) 访问帮助文档应用时,在web页面的显示如下: (2)直接将$CATALINA_HOME/webapps/目录下的整个docs目录删除即可。 |
4.移除或者限制管理控制台(Manager)的访问
编号: |
Tomcat_Sec_004 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
Tomcat有3个控制台, Server status控制台:通过web页面显示、监控服务状态信息;Manager APP控制台:用于通过web界面部署、监控Web应用;Host Manager控制台:用于通过web界面创建并管理虚拟主机。 我公司不使用Manager控制台来进行部署、管理应用,要求将该应用移除,具体方法参考“备注”处的方法。 |
安全增强说明: |
由于Manager控制台应用允许远程部署Web应用,所以经常被攻击者利用。 |
备注: |
1.移除管理控制台(Manager)应用方法: 控制台( Manager)文件目录位于$CATALINA_HOME/webapps/ manager和$CATALINA_HOME/webapps/host-manager (1)在web页面访问控制台登录页面,如下: 备注:在tomcat新版本中默认是不能访问的控制台,因为没有配置能够执行这种访问的用户。 (2)直接将$CATALINA_HOME/webapps/目录下的整个manager目录和host-manager删除即可。 2.如果确实需要到控制台(Manager)来管理tomcat,则要遵循保证管理型应用的安全性原则来进行配置:
(1)控制台账号增加账号密码方法: 控制台的用户名和密码是通过Tomcat的JAAS(Java验证和授权API)控制的,在Tomcat的文件结构中webapps是web应用的存放位置,所以Manager控制台所对应的web应用也是放置在这个文件夹下。然后进入以下路径webapps\manager\WEB-INF\,找到web.xml文件并打开。在该文件的最后部分可以看到如下配置: <auth-method>属性表示使用的是弹出式窗口登陆,<role-name>属性表示只有manager-gui角色才能够登陆该应用。 为了可以登陆Manager控制台,就必须增加属于manager-gui角色的用户。Tomcat默认采用文件安全域,即文件存放用户名和密码,而这个文件就是%Tomcat_Home%\conf下的tomcat-users.xml来控制。打开该文件,其有以下内容:
以上的配置文件中显示Tomcat默认没有配置任何用户,所以说无论我们在以上的登陆对话框中输入何种内容,系统都不会让我们登陆。为了能够正常登陆,则必须修改这个tomcat-users.xml文件来增加用户,并让该用户属于manager-gui角色。方法为在<tomcat-users>元素中增加<user>元素来增加用户,修改后内容如下:
以上的代码增加了一个用户,用户名为tomcat,密码为tomcat,角色为manager与web.xml中定义的一致。 |
5.移除默认ROOT 应用
编号: |
Tomcat_Sec_005 |
适用: |
LINUX下新安装部署 |
配置要求: |
新安装部署tomcat时,建议默认的ROOT应用移除,移除方法参考“备注处”的方法。 |
安全增强说明: |
ROOT 应用带来安全风险的可能性非常小,但它确实含有正在使用的 Tomcat的版本号。应该从可公开访问的 Tomcat 实例中清除 ROOT 应用。 |
备注: |
移除默认ROOT应用方法: 1.直接删除$CATALINA_HOME/webapps/ROOT目录即可。 说明:$CATALINA_HOME为Tomcat的安装目录。 |
6.隐藏tomcat版本号
编号: |
Tomcat_Sec_006 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
要求隐藏tomcat版本号,默认情况下,在错误页面会显示tomcat版本号,具体方法参考“备注”处的方法。 注意: 这也会改变一些管理工具所报告的版本号,可能难于确定实际安装的版本号,通过执行CATALINA_HOME/bin/version.sh 脚本依然能够报告版本号。 |
安全增强说明: |
绝大多数漏洞扫描工具通过获取目标web服务器的版本号来判断该web服务器是否存在安全漏洞,隐藏版本号后可以最大减少恶意攻击者通过漏扫工具来收集漏洞信息。 |
备注: |
隐藏tomcat的版本号方法: 1.默认在tomcat的错误请求页面会显示tomcat的版本号,如下: 2.tomcat的版本号可以隐藏或者修改,tomcat的版本号配置位于$CATALINA_HOME /lib/org/apache/catalina/util/ServerInfo.properties 文件中,具体配置方法: 方法1: 在指定路径创建ServerInfo.properties文件,如下 (1)#cd $CATALINA_HOME/lib 说明:$CATALINA_HOME为tomcat的安装目录 (2)#mkdir -p org/apache/catalina/util (3)#cd org/apache/catalina/util (4)#vim ServerInfo.properties (5)在此文件中写入以下2个参数 server.info=Apache Tomcat/X server.number=X (6)保存退出后,修改文件的所有者和用户组,在$CATALINA_HOME/lib目录下执行chown -R tomcat:tomcat org (7)重启tomcat服务.即可 方法2: (1)#cd $CATALINA_HOME/lib (2)找到catalina.jar包文件 (3)使用命令解压该文件,执行: jar xf catalina.jar (4)解压后得到META-INF和org目录 (5)执行vim org/apache/catalina/util/ServerInfo.properties (6)将默认的 改成 (7)重启tomcat服务 3.测试,修改完成后在错误页面已经看不到版本号: |
7.禁止目录列表
编号: |
Nginx_Sec_007 |
适用: |
LINUX下新安装部署或已上线nginx服务器 |
配置要求: |
要求禁止tomcat服务器的目录列表功能,tomcat默认是禁止目录列表的,但可能存在人为开启的可能,需要确认线上系统没有开启目录列表功能,具体方法参考“备注”处的方法。 |
安全增强说明: |
1.当目标web服务器允许目录时,只要访问目标web服务器的目录,如果该目录下没有设置默认访问的文件,则会同时将该目录的所有文件列出来,如下: 2.禁止目录列表功能可以避免因暴露目标网站的目录结构和敏感文件,最终造成敏感信息丢失。 |
备注: |
检查tomcat是否开启了目录列表功能的方法: (1) 编辑$CATALINA_HOME/conf/web.xml,找到如下配置: <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> 说明:$CATALINA_HOME为tomcat的安装目录。 如果listings的值为false,则说明已禁止目录列表,如果值为true,则允许目录列表。 禁用目录列表后,请求没有设置默认文件的目录时,tomcat服务器会返回404错误,如下“” |
8.开启日志记录
编号: |
Nginx_Sec_008 |
适用: |
LINUX下新安装部署或已上线nginx服务器 |
配置要求: |
要求tomcat服务器开启access日志, 默认情况下已开启访问日志,具体开启方法参考“备注”处的方法。 |
安全增强说明: |
可用于攻击行为分析和故障诊断。 |
备注: |
配置开启tomcat访问日志方法: 编辑$CATALINA_HOME/conf/server.xml,找到如下: <Host name="localhost" ...> ... <!-- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> ... --> </Host> 如果上面的<Valve ... />的配置使用注释符号<!-- ... -->注释后,需要将注释符号去掉。 Pattern默认有2个:ommon和combined Common的值:"%h %l %u %t "%r" %s %b" 效果: 192.168.12.11 - - [24/Aug/2016:11:35:43 +0800] "GET /docs/tribes/transport.html HTTP/1.1" 200 5645 combined的值:%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i 效果: 192.168.12.11 - - [24/Aug/2016:12:02:01 +0800] "GET /docs/images/tomcat.gif HTTP/1.1" 200 2066 http://192.168.12.93:8080/docs/config/host.html Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36 参数说明: %a – 远程主机的IP (Remote IP address) |
9.修改SHUTDOWN字符串
编号: |
Tomcat_Sec_009 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
要求修改用于关闭tomcat服务的shutdow属性值,具体方法参考“备注”处的方法。 |
安全增强说明: |
主要用于防止未授权用户关闭tomcat服务器。 |
备注: |
修改SHUTDOWN字符串方法: 1.在Tomcat配置文件$CATALINA_HOME/conf/server.xml,有如下的配置, < Server port ="8005" shutdown ="SHUTDOWN" debug ="0" > 该配置的作用是启动tomcat Server后在端口8005处等待关闭命令 如果接受到"SHUTDOWN"字符串则关闭服务器,利用方法,如下 (1)登录tomcat服务器, (2)在本地执行 telnet 127.0.0.1 8005 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 输入:SHUTDOWN Connection closed by foreign host. ---此时tomcat服务器被成功关闭。 2.出于防范未授权用户使用该方式来关闭tomcat服务,要求修改shutdown 属性值,如下: 将shutdown 属性值改成SHUTDOWNT,即<Server port="8005" shutdown="SHUTDOWNT">,也可以改成其他字符串。 说明: Tomcat的tcp 8005端口,只允许在本地连接,如下: # netstat -tlpun |grep 8005 tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 9636/java |
10.拒绝TRACE请求方法
编号: |
Tomcat_Sec_010 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
要求配置tomcat服务器拒绝TRACE请求方法,默认配置不接受该请求方法,配置TOMCAT服务器拒绝TRACE请求方法参考“备注”处的方法。 |
安全增强说明: |
TRACE方法是HTTP(超文本传输)协议定义的一种协议调试方法,该方法使得服务器原样返回任何客户端请求的内容(可能会附加路由中间的代理服务器的信息),由于该方法原样返回客户端提交的任意数据,因此,可用来进行跨站脚本(XSS)攻击,这种攻击方式又称为跨站跟踪攻击(XST)。 启用TRACE方法存在如下风险: |
备注: |
配置TOMCAT服务器拒绝TRACE请求方法: 在Tomcat配置文件$CATALINA_HOME/conf/server.xml中,可以给 Connector(连接器)配置allowTrace属性,该属于用于设置是否启用指定连接器的Trace方法,如下: 默认,没有启用Trace,配置如下: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 如果当进行如下配置时,则允许接受TRACE请求 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" allowTrace="true"/> 注:allowTrace="true"配置允许接受TRACE请求。 在远程Linux主机验证目标主机是否方法: #curl -X TRACE 192.168.12.93:8080 响应 TRACE / HTTP/1.1 user-agent: curl/7.19.7 (i686-pc-linux-gnu) libcurl/7.19.7 NSS/3.12.6.2 zlib/1.2.3 libidn/1.18 libssh2/1.2.2 host: 192.168.12.93:8080 accept: */* # curl -X TRACE -H "Cookie: name=value" 192.168.12.93:8080 响应 TRACE / HTTP/1.1 user-agent: curl/7.19.7 (i686-pc-linux-gnu) libcurl/7.19.7 NSS/3.12.6.2 zlib/1.2.3 libidn/1.18 libssh2/1.2.2 host: 192.168.12.93:8080 accept: */* cookie: name=value 关闭后 curl -X TRACE 192.168.12.93:8080 执行后没有任何响应信息 -X/--request <command>指定什么命令 -H/--header <line>自定义头信息传递给服务器 |
11.静态资源仅允许只读访问(read-only)
编号: |
Tomcat_Sec_011 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
配置只允许通过只读方法访问静态资源,默认只允许静态方法,具体配置方法参考 “备注”处的方法。 |
安全增强说明: |
能有效地防止防止恶意客户端删除/修改服务器上的静态文件和更新新的资源。 |
备注: |
Tomcat默认的servlet(DefaultServlet)是既服务于静态资源又服务于目录列表(如果允许目录列表的话)的servlet,所有的请求进入tomcat,都会流经servlet,如果没有匹配到任何应用指定的servlet,那么就会流到默认的servlet,默认的servlet是配置在$catalina/conf/web.xml文件中。 在配置文件$CATALINA_HOME/conf/web.xml,可以配置 DefaultServlet 的readonly属性,该属性默认值为true,,表明静态资源仅允许只读方式访问。 DefaultServlet的默认配置如下: 当DefaultServlet的readonly属性设置为true时,将拒绝客户端使用PUT、DELETE等删除或修改服务器上的静态资源。 (1)DELETE请求被拒绝,如下 (2)PUT请求被拒绝,如下 |
12.不发送“X-Powered-By”HTTP响应头
编号: |
Tomcat_Sec_012 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
要求配置tomcat不发送X-Powered-By”HTTP响应头,默认不发送该响应头,具体方法参考“备注”处的方法。 |
安全增强说明: |
X-Powered-By字段值包含 Servlet 和 JSP 规范版本号、完整的 Tomcat 版本号(比如 Apache Tomcat/8.0)、JVM Vendor 名称,以及 JVM 版本号等信息,禁止发送Tomcat服务器发送X-Powered-By”HTTP响应头,可以防止恶意攻击者从中获取目标服务器信息。 |
备注: |
配置tomcat不发送X-Powered-By”HTTP响应头方法: 在Tomcat配置文件$CATALINA_HOME/conf/server.xml中,可以给 Connector(连接器)配置xpoweredBy属性,该属于在于设置指定连接器在响应头部是否发送X-Powered-By, 默认,不发送X-Powered-By。如果配置成xpoweredBy="true",比如: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" xpoweredBy="true"/> 响应头会增加X-Powered-By字段:该字段会显示Servlet and JSP specification versions and the full Tomcat version among others. 测试: 1.响应头不发送X-Powered-By 2.响应头发送X-Powered-By |
13.自定义错误页面
编号: |
Tomcat_Sec_013 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
建议自定义403,,404,500等错误页面,具体方法参考“备注”处的方法。 |
安全增强说明: |
减少在错误页面中暴露敏感信息的风险。 |
备注: |
自定义错误页面方法: 当出现错误时,默认的 ErrorReportValve 能向客户端显示堆栈跟踪信息以及/或者 JSP 源代码。为了避免这一点,可以在每个 Web 应用内配置自定义错误处理器,具体方法如下: 编辑配置文件:sudo vim $CATALINA_HOME/conf/web.xml --说明:$CATALINA_HOME为tomcat的家目录。 在该文件底部</web-app>的前面添加 <error-page> <error-code>404</error-code> <location>/error/404.html</location> </error-page> 说明: 404.html为自定义的错误页面,存放在tomcat应用目录/error/目录下 例如: 在应用目录下创建error目录,执行mkdir error sudo cd error sudo vim 404_error.html 写入: <head> 配置后重启tomcat服务 测试,404错误页面显示了自定义的页面: 其他的错误页面的自定义方法一样: <error-page> <error-code>403</error-code> <location>/error/403.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/500.html</location> </error-page> |
14.限制连接器的可用性
编号: |
Tomcat_Sec_014 |
适用: |
LINUX下新安装部署或已上线Tomcat服务器 |
配置要求: |
Tomcat的连接器的address 属性用来控制连接器在哪个 IP 地址上侦听连接。默认,连接器会在所有配置好的IP 地址上进行侦听。建议在指定连接器上配置address属性,只监听指定IP的指定端口,具体方法参考“备注”处的方法。 |
安全增强说明: |
仅在指定IP上监听服务端口,进一步提升安全性。 |
备注: |
配置监听器只在指定IP地址上监听指定端口方法: 例如只在127.0.0.1地址上监听tcp 8080端口,配置如下: <Connector address="127.0.0.1" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 查看8080端口,看到只在127.0.0.1监听8080 # netstat -tlpnu |grep 8080 tcp 0 0 ::ffff:127.0.0.1:8080 :::* LISTEN 13793/java |
15.禁用SSL/TSL不安全协议和弱加密算法
编号: |
Tomcat_Sec_015 |
适用: |
使用提供HTTPS方式访问的Tomcat服务器 |
配置要求: |
当tomcat使用到https访问时,要求禁止SSLV1.0、SSLV2.0,SSLV3.0不安全协议,要求禁止使用以下不安全加密算法: 具有配置方法参考“备注”处的方法。 |
安全增强说明: |
降低由于使用不安全协议和弱加密导致敏感信息泄露的风险。 |
备注: |
Tomcat配置加密协议和加密套件方法: (1)编辑配置文件$CATALINA_HOME/conf/server.xml (2)找到指定的连接器进行配置,例如: <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" … /> (3)在连接器内配置下面的加密协议: sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" (4)在连接器内配置下面加密套件: ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,SSL_RSA_WITH_3DES_EDE_CBC_SHA" (5)保存配置文件,重启Tomcat服务即可。 以上配置支持的加密协议和加密套件如下: 加密协议 优先使用顺序TLSv1.2,TLSv1.1,TLS1.0。其中TLS1.0也被认为是不安全协议,也建议不使用。 加密套件: Kx:密钥交换算法,优先使用顺序:ECDHE(支持正向安全,2048位,防止中间人攻击),DHE,RSA(无法防止中间人攻击),不要使用1024位的DH。 Au:认证算法,优先使用RSA, ECDSA Enc:对称加密算法,优先使用AES_256_GCM,AES_128_GCM,AES_256_CBC,AES_128_CBC,3DES_EDE_CBC Mac:散列算法,优先使用顺序SHA_256,SHA1 注意:JDK1.6版本不支持TLSv1.2和TLv1.1版本。 |