一.简介

tomcat安全优化包括安全优化和性能优化。

1.tomcat安全优化

1版本信息隐藏

修改tomcat报错页面,报错不显示版本信息

2web服务隐藏/修改tomcat http响应头的内容

connector 8080部分  增加Server信息

3禁用管理端

关闭管理端的功能并且清除相关文件和目录

4配置完整的访问日志格式

记录全面的访问日志内容

5脚本权限回收

700或750

6文件列表访问控制

tomcat已默认关闭

7禁止root启动 (监牢模式keep in jail)

普通用户运行与管理tomcat

8shutdown端口及暗号的修改

8005 SHUTWODN(暗号)

9访问限制

allow deny

10注释掉8009端口

8.5以后默认注释掉

(1)版本信息隐藏

conf/web.xml  修改错误页

<error-page>
    <error-code>403</error-code>
    <location>/forbidden.jsp</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/notfound.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/systembusy.jsp</location>
</error-page>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

(2)web服务隐藏/修改tomcat http响应头的内容

conf/server.xml  增加server="nginx/1.24",这样就对方可能认为是nginx中间件

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
           server="nginx/1.24"
           connectionTimeout="20000"
           redirectPort="8443" />
  • 1.
  • 2.
  • 3.
  • 4.

(3)禁用管理端

#删除默认/conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件;
#删除/webapps下默认的所有目录和文件;
#将tomcat应用根目录配置为tomcat安装目录以外的目录;
rm -f   conf/tomcat-users.xml
rm -rf  webapps/*
rm -rf  manager/ host-manager/
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

(4)配置完整的访问日志格式

conf/server.xml 

<Valve className="org.apache.catalina.valves.AccessLogValve"
                 directory="logs" prefix="localhost_access_log." suffix=".txt"
                 pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/>
#说明:
%{Referer}i 用户从哪里跳转过来的
%{User-Agent}i 用户客户端(浏览器)
pattern="%h %l %u %t "%r" %s %b %D "%{Referer}i" "%{User-Agent}i""
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

(5)脚本权限回收

chmod -R 700 tomcat/bin/*
或
chmod -R 750 tomcat/bin/*
  • 1.
  • 2.
  • 3.

(6)文件列表访问控制

conf/web.xml

#默认展示站点目录下所有的内容
#nginx 网站文件列表功能 autoindex on;
#tomcat 关闭

<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

(7)禁止root启动 (监牢模式keep in jail)

降权启动/监牢模式:让服务通过普通用户运行,普通用户管理维护tomcat。

#添加用户 tomcat
useradd tomcat
#修改 tomcat 所有者
chown -R tomcat.tomcat /app/tools/tomcat/ /code/ /var/log/tomcat/
#通过普通用户管理
su - tomcat
/app/tools/tomcat/bin/startup.sh

#systemctl需要sudo 授权

#添加用户 tomcat
useradd tomcat
#修改 tomcat 所有者
chwon -R tomcat.tomcat /app/tomcat/
#通过普通用户管理
su - tomcat
#开机自启动 通过tomcat 用户
su - tomcat -c "/app/tomcat/bin/startup.sh"
            -c 执行命令 后面只接普通命令

#注意事项:
#如果给nginx配置 端口在1-1024之间 端口叫特权端口 只能root管理维护
#给nginx做 降权 需要修改端口
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

(8)shutdown端口及暗号的修改

conf/server.xml 

#telnet管理端口保护(强制) tomcat shutdown端口
<Server port="8527" shutdown="dangerous">
  • 1.
  • 2.

(9)访问限制

conf/server.xml    allow="x.x.x.x,x.x.x.*  可以是IP,可以是网段

<Context path="" docBase="/home/work/tomcat" debug="0" reloadable="false" crossContext="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="x.x.x.x,x.x.x.*"
deny="*.*.*.*"/>
</Context>
  • 1.
  • 2.
  • 3.
  • 4.

(10)注释掉8009端口

conf/server.xml 

#如果使用的apache+tomcat 修改端口
#如果没有使用apache则把这一行注释
<!-- 开始 注释结束 -->
116 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
  • 1.
  • 2.
  • 3.
  • 4.

2.tomcat性能优化

参数数值调整方式:

参考值基准,不设置数值,通过压力测试软件观察tomcat性能

增加优化参数,通过压力测试软件观察tomcat性能

压力测试工具:

ab/webbench

http压力测试

stress

cpu内存测试

jmeter

java(tomcat)压力测试

dd/fio

磁盘性能测试

mysqlslap

mysql压力测试

loadrunner

专业测试工具

(1)java启动参数jvm优化

bin/catalina.sh

#设置 jvm初始内存大小(物理内存1/64)jvm最大内存大小(物理内存的1/4)
#修改 catalina.sh文件
JAVA_OPTS='-Xms1024m -Xmx2048m -Xloggc:/var/log/tomcat_gc.log'
#-Xms jvm 初始内存,-Xmx max 最大jvm最大内存,一般 -Xmx 是 -Xms 2倍

#gc---garbage collect 垃圾回收,定期清理jvm内存
#-Xloggc 执行gc的时候日志出现故障tomcat崩溃、挂了,catalaina.out gc日志
#配置自动dump功能,java发生异常,自动导出jvm内存镜像  #OOM 故障
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof

#扩展:
java程序代码方式:
#war包 扔到 tomcat/webapps目录下

#jar包 相当于里面集成了1个tomcat java -jar xxx.jar
#如果是 java命令 运行 jar包 配置参数,加在 java 命令后面即可
java -jar xxxx.jar -Xms1024m -Xmx2028m -Xloggc:/var/log/tomcat_gc.log
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

(2)tomcat配置参数优化

conf/server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="500"
           acceptCount="500"
           acceptorThreadCount="2"
           minSpareThreads="10"
           enableLookups="false"
           compression="on"
           compressionMinSize="2048"

compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/xfont-ttf,application/x-font-otf"
           disableUploadTimeout="true"
           connectionTimeout="20000"
           redirectPort="8443" />
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

参数解释

maxThreads="500" #最大的线程数量 200-400之间
acceptCount="500" #当达到最大线程数量的时候队列长度,一般与maxThreads 一致
acceptorThreadCount="2" #分为几对与cpu核心总数一致或2倍默认是1
minSpareThreads="10" #空闲时候最小的线程数量,不忙的时候,最少留几个服务员
enableLookups="false" #禁止DNS逆向查询 ip--->域名 route -n /arp -n
compression="on" #开启 tomcat压缩功能 静态文本资源 html js css
compressionMinSize="2048" #压缩文件 最小2048字节
compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf" #压缩哪些类型的文件 文本类型 js,css,html
disableUploadTimeout="true" #关闭上传文件超时时间,tomcat因为用户网络问题 Read timed out
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

(3)io模型优化

优化建议,默认异步非阻塞NIO即可,决定tomcat如何处理数据,类似nginx同步,异步模型

BIO

同步模型,阻塞,老版本tomcat7及以前的版本

NIO(NIO1 NIO2)

异步模型,非阻塞,tomcat8之后默认NIO

APR

高并发场景

/conf/server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

#修改8080&8009端口对应的server.xml
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
#把Nio2 修改为Apr,apr需要安装
protocol="org.apache.coyote.http11.Http11AprProtocol"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.