一.简介
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>
(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" />
(3)禁用管理端
#删除默认/conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件;
#删除/webapps下默认的所有目录和文件;
#将tomcat应用根目录配置为tomcat安装目录以外的目录;
rm -f conf/tomcat-users.xml
rm -rf webapps/*
rm -rf manager/ host-manager/
(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""
(5)脚本权限回收
chmod -R 700 tomcat/bin/*
或
chmod -R 750 tomcat/bin/*
(6)文件列表访问控制
conf/web.xml
#默认展示站点目录下所有的内容
#nginx 网站文件列表功能 autoindex on;
#tomcat 关闭
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
(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做 降权 需要修改端口
(8)shutdown端口及暗号的修改
conf/server.xml
#telnet管理端口保护(强制) tomcat shutdown端口
<Server port="8527" shutdown="dangerous">
(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>
(10)注释掉8009端口
conf/server.xml
#如果使用的apache+tomcat 修改端口
#如果没有使用apache则把这一行注释
<!-- 开始 注释结束 -->
116 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
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
(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" />
参数解释
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
(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"