【技术分享】Tomcat基线安全

阿里云幸运券

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

服务推荐

猜你喜欢

转载自blog.csdn.net/ff00yo/article/details/89383303