赞
踩
01前言
前几天@wilson师傅要测试线上命令监控功能,将我写的java-sec-code
(https://github.com/JoyChou93/java-sec-code) 应用打包到线上的Tomcat进行命令执行测试,想到公司发布系统是在Tomat上运行的Java应用,所以去评估了公司发布系统的安全问题。结果发现一个很严重的安全漏洞,觉得有必要对Tomcat的安全配置进行总结和说明。
02基础知识
首先,我们需要了解一些Tomcat基础知识,以便后续的理解。
2.1 war包部署
war包在Tomcat里的部署逻辑:
将war包cp到Tomcat的webapps目录
重启Tomcat应用bin/shutdown.sh & bin/startup.sh
这样,一个Java应用就可以在Tomcat下跑起来了。有兴趣的朋友,可以下载我的java-sec-code (https://github.com/JoyChou93/java-sec-code) 应用,该应用已经做了对Tomcat适配。具体操作步骤:
使用命令mvn clean package打war包,生成的war包名叫java-sec-code-1.0.0.war,将该war包cp到Tomcat的webapps目录,路径后面跟上war包名就能访问相应的路由了,http://localhost:8080/java-sec-code-1.0.0/rce/exec?cmd=whoami。
如果不想在URL里出现war包名,可以将war包放在webapps/ROOT目录,该目录是Tomcat的根目录,默认是猫的首页。由于该目录不会随着Tomcat重启自动解压war包,所以需要手动解压war包jar xf java-sec-code-1.0.0.war。解压完成后,会出现WEB-INF和META-INF目录,这两个目录通过HTTP协议默认都不能访问。所以webapps/ROOT目录除了WEB-INF和META-INF,其他都应该被删除。
2.2 自解压
webapps里的war包,会随着Tomcat的启动自动解压。并且,webapps目录的war包不能在Tomcat运行时删除,否则会删除已经自动解压的工程,可以停止Tomcat后删除war。
webapps/ROOT目录的war包不会随着Tomcat启动自动解压,所以当webapps/ROOT目录的war包删除后,重启应用并不会影响到应用。2.3 web目录
默认的Web目录在Tomcat运行目录的webapps目录。
-rw-r–r--@ 1 Viarus staff 57K 5 7 14:16 LICENSE
-rw-r–r--@ 1 Viarus staff 1.2K 5 7 14:16 NOTICE
-rw-r–r--@ 1 Viarus staff 9.4K 5 7 14:16 RELEASE-NOTES
-rw-r–r--@ 1 Viarus staff 17K 5 7 14:16 RUNNING.txt
drwxr-xr-x@ 25 Viarus staff 850B 5 24 17:49 bin
drwxr-xr-x@ 10 Viarus staff 340B 5 28 16:23 conf
drwxr-xr-x@ 23 Viarus staff 782B 5 24 17:49 lib
drwxr-xr-x@ 19 Viarus staff 646B 5 29 10:21 logs
drwxr-xr-x@ 3 Viarus staff 102B 5 24 17:49 temp
drwxr-xr-x@ 8 Viarus staff 272B 5 28 16:30 webapps
drwxr-xr-x@ 3 Viarus staff 102B 5 24 17:55 work
如果想改成其他目录,一般有两种方法:
修改conf/server.xml里appBase值为新路径。另外docBase为根路径,也就是webapps/ROOT目录。
利用export CATALINA_BASE=新目录环境变量。
描述下如何利用第二种方式启动Tomcat应用:
Tomcat的应用路径为~/Downloads/apache-tomcat-7.0.88
将/Downloads/apache-tomcat-7.0.88目录cp到新目录/Downloads/tomcat,并且删除其他文件和目录,只剩下conf logs temp webapps work目录
运行下面tomcat_diy.sh脚本,指定Tomcat的运行目录(HOME)以及webapps目录(BASE),此时所有配置都在/Downloads/tomcat/conf里,/Downloads/apache-tomcat-7.0.88只提供bin文件作用。
tomcat_diy.sh
export CATALINA_HOME=~/Downloads/apache-tomcat-7.0.88
export CATALINA_BASE=~/Downloads/tomcat
“$CATALINA_HOME”/bin/startup.sh
无论什么方式启动,Tomcat的Web目录都可以根据Java进程的cmdline查找。只是很多公司Tomcat是以第二种方式运行。
拿tomcat_diy.sh举例,从Java的cmdline可以看出,上面Tomcat的Web目录为Dcatalina.base的值。
-Dcatalina.base=/Users/Viarus/Downloads/tomcat -Dcatalina.home=/Users/Viarus/Downloads/apache-tomcat-7.0.88
2.4 架构
Tomcat一般的架构为:
Nginx Proxy统一层 -> 后端Nginx 80端口 -> Tomcat 8080端口
如果Tomcat前面是Nginx,那么可以将AJP协议的8009端口关闭。
03安全配置
3.1 删除默认应用
删除所有的默认应用,防止有人利用Tomcat后台弱口令进行漏洞利用。也就是删除webapps目录的所有目录和文件,只保留ROOT目录。
3.2 删除静态文件
删除webapps/ROOT目录里的所有静态文件,防止文件被下载。除了WEB-INF和META-INF目录里的文件不能被下载,其他文件都能被下载。也就是说:webapps/ROOT目录除了WEB-INF和META-INF,其他都应该被删除。
3.3 shutdown
Tomcat默认开启8005的端口,提供Tomcat的关闭服务。不过默认都是开在本地,不会远程开启,所以默认都不会有问题。利用方式为,telnet后,发送SHUTDOWN字符串,该字符串在配置里配置。
conf/server.xml
3.4 Tomcat运行用户禁止root启动,一般以mapp启动,大多数公司都会有一个专门运行Java应用的用户。它和Nginx不同,Nginx可以用root启动,因为实际上处理Nginx worker进程的用户默认为nobody,root是处理Nginx master进程的事件。所以,当Nginx存在安全问题后,攻击者一般只能拿到worker进程的权限。
3.5 目录浏览
conf/web.xml
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
false为关闭目录浏览,true为开启目录浏览,默认是false。
3.6 8005端口
如果Tomcat前面是Nginx,那么可以将AJP协议的8009端口关闭,关闭后少一个端口服务,减少风险,不过不关闭目前也不会有什么安全问题。关闭方法:注释掉下面的配置。AJP是为了Apache和Tomcat通信,相关资料可以Google Tomcat AJP。
conf/server.xml
04总结
使用Tomcat应删除所有默认应用。
webapps/ROOT目录除了WEB-INF和META-INF,其他都应该被删除。
Tomcat的应用通过HTTP协议默认不能访问WEB-INF和META-INF目录。
webapps里的war包会随着Tomcat的启动自动解压。
webapps目录的war包不能在Tomcat运行时删除,否则会删除已经自动解压的工程,可以停止Tomcat后删除war。
webapps/ROOT目录的war包不会随着Tomcat启动自动解压,所以当webapps/ROOT目录的war包删除后,重启应用并不会影响到应用。
https://mp.weixin.qq.com/s/BDElZaFoyi074dC025Fd6g
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。