Tomcat优化及安全配置

1、Tomcat优化

Tomcat优化分为对Tomcat本身的优化以及对JVM进行优化,本文针对Tomcat自身的优化进行阐述,JVM优化参考其他文档。

1.1 优化连接数

tomcat 连接数分为最大连接数,最大排队数等,配置时需要根据部署的程序是计算型还是内存型还是IO型,不同类型的应用的配置参数略有差异,通用的配置参考:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="1000" minSpareThreads="100" prestartminSpareThreads="true"
        maxQueueSize="100" enableLookups="false" URIEncoding="utf-8" acceptCount="500"/>

参数说明:

  • maxThreads: 客户请求最大线程数
  • minSpareThreads: Tomcat初始化时创建的 socket 线程数
  • maxSpareThreads: Tomcat连接器的最大空闲 socket 线程数
  • prestartminSpareThreads: 在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了
  • maxQueueSize: 最大的等待队列数,超过则拒绝请求
  • enableLookups: 设为true, 则支持域名解析,可把 ip 地址解析为主机名
  • acceptAccount: 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads)
  • URIEncoding: URL统一编码

1.2 使用线程池

<Connector executor="tomcatThreadPool"
               port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="2000" disableUploadTimeout="ture"
               redirectPort="8443" />

参数说明

  • connectionTimeout: 主要是HTTP协议也有个连接过程,客户端连接到服务器上后,如果长时间没有得到处理就会被释放。如果服务器处理速度较慢,但是希望每个用户都能得到有效处理,或者网络环境不好,需要保证用户不会因为超时中断,也可以把时间加长。但是一般设置成connectionTimeout="30000"即可。太长对系统来说价值不大,反而会浪费系统资源在无谓的长连接上。
  • disableUploadTimeout: 允许Servlet容器,正在执行使用一个较长的连接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false。
  • executor: 使用executor连接器对Tomcat进行优化

1.3 session共享

基于tomcat集群的session共享

在{TOMCST_HOME}/conf/server.xml取消下面代码注释即可:

<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

此种方式目前已经很少使用了,更多的是结合redis缓存来配置Tomcat集群中的各应用节点的session共享。

1.4 错误页面自定义

站点的默认网页、自定义错误页面、禁止列目录等功能

这些功能开发会在工程的WEB-INF目录下的web.xml中设置,运维了解下就好,者遇到类似问题可以找到解决思路。

<error-page>
<error-code>404</error-code>
<location>/404.htm</location>
</error-page>

1.5 禁止列目录

<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>

1.6 管理AJP端口

AJP是为 Tomcat 与 HTTP 服务器之间通信而定制的协议,能提供较高的通信速度和效率。
如果tomcat前端放的是apache的时候,会使用到AJP这个连接器。
由于我们公司前端是由nginx做的反向代理,因此不使用此连接器,因此需要注销掉该连接器。在{TOMCST_HOME}/conf/server.xml中找到下列代码,注释即可:

<!-- <Connector port="8009" protocol="AJP/1.3"redirectPort="8443" /> -->

1.7 取消默认GC监听

如果开启了GClog,再开启GC监听,会影响GClog输出,功能重复,可以选择取消。

<!-- 内存泄露侦测,对于垃圾回收不能处理的对像,它就会做日志,开启gcc后,不需要这个功能-->
<!-- ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"gcDaemonProtection="false"/ -->

1.8 自定义代码路径

<Context docBase="/code_path/code_file"path="/code_file " reloadable="false" />

其中:
docBase这个是你代码的路径
path这个是你访问网站的URL路径,要区别path的意义,请看下面的举例
举例:访问www.aaa.com
<Context docBase="/code_path/code_file"path=" " reloadable="false" />
访问www.aaa.com/code_file
<Context docBase="/code_path/code_file"path="/code_file " reloadable="fasle" />

reloadable如果为true,会自动加载变化的动态文件,看起来挺智能的,但是,在tomcat加载变化代码的时候有可能会出现内存溢出,tomcat服务不正常等异常,建议还是false掉,更新完代码脚本重启tomcat才是王道。

1.9 屏蔽DNS查询

Web应用程序可以通过Web容器提供的getRemoteHost()方法获得访问Web应用客户的IP地址和名称,但是这样会消耗Web容器的资源,并且还需要通过IP地址和DNS服务器反查用户的名字。因此当系统上线时,可以将这个属性关闭,从而减少资源消耗,那么Web应用也就只能记录下IP地址。修改的属性是enableLoopups="false"。

1.10 文件压缩管理

tomcat作为一个应用服务器,也是支持 gzip 压缩功能的。我们可以在 server.xml 配置文件中的 Connector 节点中配置如下参数,来实现对指定资源类型进行压缩。
compression="on" # 打开压缩功能
compressionMinSize="50" # 启用压缩的输出内容大小,默认为2KB
noCompressionUserAgents="gozilla, traviata" # 对于以下的浏览器,不启用压缩
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些资源类型需要压缩
如果使用apache/nginx代理,所以tomcat自身不需要进行压缩,会给服务器增加压力

1.11 调整运行模式

tomcat的三种运行模式选择: Bio, Nio, Apr

  • Bio: 默认的模式,性能非常低下,没有经过任何优化处理和支持。
  • Nio: 利用java的异步io护理技术,no blocking IO技术.想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为 protocol="org.apache.coyote.http11.Http11NioProtocol"
  • Apr: 安装困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.。必须要安装apr和native,直接启动就支持apr。
sudo yum -y install apr apr-devel
tar zxvf tomcat-native.tar.gz //该文件在tomcat的bin目录下面
cd tomcat-native-1.1.24-src/jni/native
./configure--with-apr=/usr/bin/apr-1-config
make
make install

安装完成之后 会出现如下提示信息
Libraries have been installed in:
/usr/local/apr/lib

安装成功后还需要对tomcat设置环境变量,方法是在catalina.sh文件中增加一 行:

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
修改8080端对应的
protocol="org.apache.coyote.http11.Http11AprProtocol"

其他就是关于JVM的优化,如GCC算法,对内存大小等,请参考另外的JVM调优文档。

2、Tomcat安全加固

2.1 Tomcat版本统一(必选)

生产环境中推荐将Tomcat版本进行统一,并且隐藏掉Tomcat版本号,这样一方面能够在Tomcat出现漏洞或bug时统一处理,另外一方面也减小了因为版本问题导致应用风险的增加。同时,避免因为应用错误,将Tomcat版本暴露给用户,导致因为该版本漏洞等问题被利用和攻击。

2.2 Tomcat帐号安全(必选)

将$CATALINA_HOME\conf\tomcat-users.xml中文件的所有用户都注释掉,配置如下:

<?xmlversion='1.0' encoding='utf-8'?>
<tomcat-users>
<!--
<rolerolename="tomcat"/>
<rolerolename="role1"/>
<rolerolename="manager"/>
<rolerolename="admin"/>
<user username="tomcat"password="tomcat" roles="tomcat"/>
<userusername="both" password="tomcat"roles="tomcat,role1"/>
<userusername="role1" password="tomcat"roles="role1"/>
<userusername="admin" password="admin"roles="manager"/>
-->
</tomcat-users>

如果业务需要内置的Tomcat用户【不推荐这种方式】,则需要给其分配合理的权限,密码设置符合密码策略(随机生成包含大小写字母、数字、特殊符号在内的不少于16位的密码),Tomcat角色类型如下:
role1:具有读权限;
tomcat:具有读和运行权限;
admin:具有读、运行和写权限;
manager:具有远程管理权限。
如果使用启用了Tomcat用户,则需要设置Tomcat定时登出。

2.3 默认webapps应用清理(必选)

除了需要部署上去的应用,其余位于$CATALINA_HOME\webapps文件夹中的应用如docs、examples、host-manager、manager和ROOT。
注:若无业务必要,请执行删除上述的应用包。
加固检查:
输入:http://localhost:8080/manager/html
出现的页面空白

2.4 禁止Tomcat目录列表(可选)

确保$CATALINA_HOME\conf\web.xml中listings的值为false:
Tomcat优化及安全配置

避免项目目录及文件和配置泄漏,在早期的Tomcat版本中,该项为true,在无默认页面的情况下,用户可以浏览项目目录。新版本Tomcat该项默认是false。

2.5 配置shutdown端口(可选)

server.xml中定义了可直接关闭 Tomcat 实例的管理端口。通过 telnet 连接上该端口,输入 SHUTDOWN (此为默认关闭指令)即可关闭 Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。由于默认关闭Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。因此我们需要将关闭指令修改复杂一点。
当然,在新版的 Tomcat 中该端口仅监听在127.0.0.1上,因此该项也可以不改。除非黑客登陆到tomcat本机去执行关闭操作。

修改方法:

在$CATALINA_HOME\conf\server.xml中“”,将shutdown的值改成其他的值,如stopapp等自定义的Tomcat关闭命令。或者其他较为复杂的字符串。

<Serverport="未被占用的端口" shutdown="较为复杂的字符串">
注:配置的端口需要大于1024。
加固检查:
使用telnet 127.0.0.1 8005进入,输入“SHUTDOWN”,Tomcat不会被关闭。

2.6 隐藏Tomcat版本信息(必选)

在默认配置下,当应用出现异常时,客户端会显示Tomcat的版本信息。攻击者可以根据Tomcat版本信息选择漏洞库攻击,所以需要将Tomcat的版本信息隐藏,将$CATALINA_HOME\lib\catalina.jar\org\apache\catalina\util中的配置ServerInfo.properties如下:

server.info=需要展现的信息如SmartCity
server.number=SmartCity
server.built=20201101

加固检测:
输入一个异常的URL看看出现的异常页面是否出现类似(无Tomcat的版本信息)
Tomcat优化及安全配置

2.7 关闭war自动部署(必选)

默认的配置war放在$CATALINA_HOME\webapps中会自动部署,所以关闭war自动部署防止被植入木马等恶意程序。将$CATALINA_HOME\conf\server.xml配置如下:

<Hostname="localhost"
appBase="webapps"
unpackWARs="false"
autoDeploy="false"
xmlValidation="false"
xmlNamespaceAware="false">

加固检查:
将一个war文件放进$CATALINA_HOME\webapps,启动Tomcat后,war文件不会被部署。

2.8 Tomcat启动权限(必选)

普通用户运行java程序

2.9 配置Tomcat pid(可选)

配置tomcat启动后将进程号保存至 ./bin/tomcat.pid 文件。

修改 catalina.sh 文件,在 PRGDIR 下面一行添加 CATALINAPID 参数行,如下:

PRGDIR=dirname "$PRG"
CATALINA_PID=$PRGDIR/tomcat.pid

Tomcat优化及安全配置

启动tomcat在 ./bin 下生成PID文件tomcat.pid

[root@localhost bin]# ls tomcat.pid 
tomcat.pid
[root@localhost bin]# cat tomcat.pid 
12016
[root@localhost bin]# jps 
12016 Bootstrap
上一篇:Tomcat详解系列(3) - 源码分析准备和分析入口


下一篇:远程debug