1.配置文档中使用$CATALINA_HOME变量声明为tomcat的安装目录并明确写出了tomcat的配置文件路径,此路径为测试环境的路径,线上系统对应配置文件的路径可能不同,在进行相关配置时,应以线上配置文件的实际路径为准。html
2.本文档仅包括了用于提高安全的配置方法。前端
3.在听从本文档的方法进行配置前,请作好相关配置文件的备份,以便在配置失败时能够回退到变动前状态。java
编号:linux |
Tomcat_Sec_001nginx |
适用:web |
新安装或者升级tomcat服务器算法 |
配置要求:shell |
1.新安装或者升级tomcat服务器时建议选用最新稳定版本,源码安装包文件要求从官方网站下载(http://tomcat.apache.org/)并要求对下载后的源码包文件进行完整性验证。apache 2.若是是跨大版本升级,则要求在测试环境测试不存在兼容性问题后才可在生产环境进行部署。vim
源码包文件进行完整性验证方法请参照“备注”处的方法。 |
安全加强说明: |
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指纹的校验。 |
编号: |
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
|
编号: |
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目录删除便可。 |
编号: |
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中定义的一致。 |
编号: |
Tomcat_Sec_005 |
适用: |
LINUX下新安装部署 |
配置要求: |
新安装部署tomcat时,建议默认的ROOT应用移除,移除方法参考“备注处”的方法。 |
安全加强说明: |
ROOT 应用带来安全风险的可能性很是小,但它确实含有正在使用的 Tomcat的版本号。应该从可公开访问的 Tomcat 实例中清除 ROOT 应用。 |
备注: |
移除默认ROOT应用方法: 1.直接删除$CATALINA_HOME/webapps/ROOT目录便可。 说明:$CATALINA_HOME为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.测试,修改完成后在错误页面已经看不到版本号:
|
编号: |
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错误,以下“”
|
编号: |
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) |
编号: |
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 |
编号: |
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>自定义头信息传递给服务器 |
编号: |
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请求被拒绝,以下
|
编号: |
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
|
编号: |
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> |
编号: |
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 |
编号: |
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版本。 |