Tomcat安全配置策略

  • A+
所属分类:网络安全文章
阿里


推广者专属福利,新客户无门槛领取总价值高达2775元代金券,每种代金券限量500张,先到先得。

Tomcat安全配置策略

1. 前言

前几天要测试线上命令监控功能,将java-sec-code应用打包到线上的Tomcat进行命令执行测试,系统是在Tomat上运行的Java应用,所以去评估了公司发布系统的安全问题。结果发现一个很严重的安全漏洞,觉得有必要对Tomcat的安全配置进行总结和说明。

2. 基础知识

首先,我们需要了解一些Tomcat基础知识,以便后续的理解。

2.1 war包部署

war包在Tomcat里的部署逻辑:

将war包cp到Tomcat的webapps目录

重启Tomcat应用bin/shutdown.sh & bin/startup.sh

这样,一个Java应用就可以在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。

  1. <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

webapps/ROOT目录的war包不会随着Tomcat启动自动解压,所以当webapps/ROOT目录的war包删除后,重启应用并不会影响到应用。

2.3 Web目录

默认的Web目录在Tomcat运行目录的webapps目录。

  1. -rw-r--r--@  1 Viarus  staff    57K  5  7 14:16 LICENSE
  2. -rw-r--r--@  1 Viarus  staff   1.2K  5  7 14:16 NOTICE
  3. -rw-r--r--@  1 Viarus  staff   9.4K  5  7 14:16 RELEASE-NOTES
  4. -rw-r--r--@  1 Viarus  staff    17K  5  7 14:16 RUNNING.txt
  5. drwxr-xr-x@ 25 Viarus  staff   850B  5 24 17:49 bin
  6. drwxr-xr-x@ 10 Viarus  staff   340B  5 28 16:23 conf
  7. drwxr-xr-x@ 23 Viarus  staff   782B  5 24 17:49 lib
  8. drwxr-xr-x@ 19 Viarus  staff   646B  5 29 10:21 logs
  9. drwxr-xr-x@  3 Viarus  staff   102B  5 24 17:49 temp
  10. drwxr-xr-x@  8 Viarus  staff   272B  5 28 16:30 webapps
  11. 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

  1. export CATALINA_HOME=~/Downloads/apache-tomcat-7.0.88
  2. export CATALINA_BASE=~/Downloads/tomcat
  3. "$CATALINA_HOME"/bin/startup.sh

无论什么方式启动,Tomcat的Web目录都可以根据Java进程的cmdline查找。只是很多公司Tomcat是以第二种方式运行。

拿tomcat_diy.sh举例,从Java的cmdline可以看出,上面Tomcat的Web目录为Dcatalina.base的值。

  1. -Dcatalina.base=/Users/Viarus/Downloads/tomcat -Dcatalina.home=/Users/Viarus/Downloads/apache-tomcat-7.0.88

2.4 架构

Tomcat一般的架构为:

  1. Nginx Proxy统一层 ->  后端Nginx 80端口 -> Tomcat 8080端口

如果Tomcat前面是Nginx,那么可以将AJP协议的8009端口关闭。

3. 安全配置

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

  1. <Server port="8005" shutdown="SHUTDOWN">

3.4 Tomcat运行用户

禁止root启动,一般以mapp启动,大多数公司都会有一个专门运行Java应用的用户。它和Nginx不同,Nginx可以用root启动,因为实际上处理Nginx worker进程的用户默认为nobody,root是处理Nginx master进程的事件。所以,当Nginx存在安全问题后,攻击者一般只能拿到worker进程的权限。

3.5 目录浏览

conf/web.xml

  1. <init-param>
  2.             <param-name>listings</param-name>
  3.             <param-value>false</param-value>
  4.         </init-param>

false为关闭目录浏览,true为开启目录浏览,默认是false。

3.6 8009端口

如果Tomcat前面是Nginx,那么可以将AJP协议的8009端口关闭,关闭后少一个端口服务,减少风险,不过不关闭目前也不会有什么安全问题。关闭方法:注释掉下面的配置。AJP是为了Apache和Tomcat通信,相关资料可以Google Tomcat AJP。

conf/server.xml

  1. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

4. 总结

使用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包删除后,重启应用并不会影响到应用。

CE安全网

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: