[TOC]



修订控制页

版本 |修订日期 |修订人 |修订摘要
—|—|—|—
1.0| 2019年9月10日 09点00分 |经伟 |初稿


1.引言

1.1 目的

为了更好的指导部署Tomcat应用容器,保证服务的安全稳定高性能的运行,需要对其进行加固和优化;
本次进行Tomcat容器调优加固主要从以下几个部分:

  • 性能参数优化
  • 安全加固配置
1.2 目标范围

本文档仅供内部使用,禁止外传,帮助研发人员,运维人员对系统长期稳定的运行提供技术文档参考。

1.3 读者对象

1) 项目经理
2) 开发人员
3) 测试人员
4) 运维人员
5) 相关领导


2.参考说明

2.1 帮助参考

Apache Tomcat是美国Apache软件基金会的一款轻量级Web应用服务器,该程序实现了对Servlet和JSP的支持。
目前是Apache开源软件组织的一个软件项目它的官网 :http://tomcat.apache.org , 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选

Tomcat8配置帮助文档: http://tomcat.apache.org/tomcat-8.0-doc/config/
Security Manage: http://tomcat.apache.org/tomcat-8.0-doc/security-manager-howto.html


Tomcat初始目录结构

/usr/local/tomcat #主目录即安装的目录
├── bin #存放启动和关闭Tomcat的脚本文件
├── conf #存放Tomcat服务器的各种配置文件(后面单介绍)
├── lib #存放tomcat服务器支撑的jar包
├── logs #存放Tomcat的日志文件
├── temp #存放Tomcat运行时产生的临时文件
├── webapps #web应用虽在目录,即供外界访问的web资源的存放目录,就是Web发布目录
│   ├── docs #帮助文档目录
│   ├── examples #Servlet and JSP Examples案例目录
│   ├── host-manager #主机管理目录
│   ├── manager #应用程序管理目录
│   └── ROOT #应用程序放置地址
└── work #Tomcat的工作目录,存放jsp编译后产生的class文件


Tomcat全局配置目录结构:

[root@master conf]# tree
├── catalina.policy #权限控制配置文件
├── catalina.properties #Tomcat属性配置文件
├── context.xml #上下文配置文件(selinux)
├── jaspic-providers.xml
├── jaspic-providers.xsd
├── logging.properties #日志log相关配置文件
├── server.xml #主配置文件(如修改监听端口,开启关闭额外的服务,设置网站根目录,虚拟主机,开启https等功能)
├── tomcat-users.xml #manager-gui管理用户配置文件(Tomcat安装后生成的管理界面,该文件可开启访问)
├── tomcat-users.xsd
└── web.xml #Tomcat的servlet,servlet-mapping,filter,MIME等相关配置


Tomcat的JavaWeb应用的组成结构:

mail--- #-Web应用所在目录
|---- #html、jsp、css、js等文件,根目录下的文件外界可以直接访问
|---- #WEB-INF目录 (应用配置文件存放)
|---------classes目录 #(java类)
|---------lib目录 #(java类运行所需的jar包)
|---------conf目录 #(数据库以及其他配置文件存放目录)
|---------web.xml #(web应用的配置文件)
#注意:WEB-INF 这个目录下的文件外界无法直接访问,由web服务器负责调用


3.性能优化

描述: 由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优自身调优两类来描述。

3.1 外部环境调优

主要调整Tomcat运行环境的操作系统参数和运行Tomcat的java虚拟机参数。

3.1.1 JAVA虚拟机性能优化

Tomcat需要依赖Java虚拟机运行,根据客户选用的主机的操作系统选择对应的JDK的版本建议使用最新的版本。

Tomcat的使用内存配置实质上是JVM的内存配置编辑 catalina.[sh / bat]配置文件,注意这里区分Windows和Linux;

VM调优内存生产配置参数列表:

参数 描述 备注
-server 模式启动应用慢,但是极大程度提高运行性能
-Xms 堆内存初始大小,单位m、g
-Xmx 堆内存最大允许大小,一般不要大于物理内存的80%
-XX:PermSize 非堆内存初始大小,一般应用设置初始化200m,最大1024m support was removed in 8.0
-XX:MaxPermSize 非堆内存最大允许大小 support was removed in 8.0
-XX:+UseParallelGCThreads=8 并行收集器线程数,同时有多少个线程进行垃圾回收,一般与CPU数量相等 support was removed in 8.0
-XX:+UseParallelOldGC 指定老年代为并行收集 tomcat 8.0 报警告
-XX:+UseConcMarkSweepGC CMS收集器(并发收集器)
-XX:+UseCMSCompactAtFullCollection 开启内存空间压缩和整理,防止过多内存碎片 tomcat 8.0 报警告
Headless=true windows系统可不用设置,适用于Linux系统与图形操作有关,如生成验证码含义是当前的是无显示器的服务器,应用中如果获取系统显示有关的参数会抛出异常


Tomcat默认可以使用的内存为128MB,在较大型的应用项目中内存是不够的所以需要调大,一般设置初始化内存为256MB,可以使用的最大内存为512MB

#Linux#
$vim /usr/local/tomcat8/bin/catalina.sh
#在OS specific support. $var _must_ be set to either true or false.110行下面添加
JAVA_OPTS="-server
-Xms512m
-Xmx2048m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=80
-XX:-PrintGC
-XX:-PrintGCDetails
-XX:-PrintGCTimeStamps"


#Windows#
$vim /usr/local/tomcat8/bin/catalina.bat
#在/bin目录下的catalina.bat可以直接通过Tomcat设置JVM内存参数
set "JAVA_OPTS=%JAVA_OPT% -server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"

WeiyiGeek.

注意事项:

  • java8开始,PermSize被MetaspaceSize代替,MetaspaceSize共享heap不会再有java.lang.OutOfMemoryError:PermGen space可以不设置
  • java8开始,MaxPermSize/UseParallelGCThreads=8已经移除
  • 另外需要考虑的是Java提供的垃圾回收机制,虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度并且收集垃圾可以接受的速度与应用有关
    • 如果堆(heap)的空间很大,那么完全垃圾收集(FULL GC)就会很慢,但是频度会降低。
    • 如果在客户系统中把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。
    • 推荐把-Xms设置为应用所需的最小值,这样会产生高效的垃圾回收


3.1.2 Tomcat与web服务器整合

描述: 虽然tomcat也可以作web服务器但其处理静态html的速度比不上Nginx服务,并且为了更好的进行设置负载均衡,还是得和Nginx进行联用;

因此我们可以把 Nginx 和 Tomcat 集成起来, 将html与jsp的功能部分进行明确分工, 让tomcat只处理jsp部分,或者也可以由其它的由 apache, IIS 等这些 web服务器处理,由此大大节省了tomcat有限的工作线程。


3.2 自身调优

(1)Connector元素属性优化

禁用DNS查询

  • 描述: 消除DNS查询对性能的影响我们可以关闭DNS查询
  • 优化: enableLookups="false"
  • 结果: 节省了网络带宽、查询时间和内存,而且更小的流量会使日志数据也会变得更少,显而易见也节省了硬盘空间

调整线程数(需要根据压力测试进行调整)

  • 描述: 可通过应用程序的连接器(Connector)进行性能控制的参数是创建的处理请求的线程数。在Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。但是应防止流量不可控制(或者恶意的服务攻击),从而导致超出了虚拟机使用内存的大小;web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。
  • 优化: 修改 minProcessorsmaxProcessors 的值来控制线程数
  • 结果: 它们共享相同的地址空间。多线程帮助程序员写出CPU最大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

NIO 配置

  • 描述:NIO (No-blocking I/O)从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供非阻塞I/O操作的API被引入[LD6];TOMCAT可以支持高并发的企业级应用,配置良好的tomcat都会使用APR(Apache Portable Runtime),APR是Apache HTTP Server2.x的核心,它是高度可移植的本地库,它使用高性能的UXIN I/O操作,低性能的java io操作。
  • 优化: protocol="org.apache.coyote.http11.Http11NioProtocol"
  • 结果: NIO使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe或者队列里的请求。只要OS可以接受TCP的连接,web服务器就可以处理该请求。大大提高了web服务器的可伸缩性。

描述:修改server.xml 文件中的Connector元素得各个属性值;

$vim ./conf/server.xml

<Connector port="8080"
#NIO提高并发处理能力
protocol="HTTP/1.1"

#当前可以同时处理的最大用户访问数最大连接数配置(并发能力)
maxThreads="1000"

#当所有的线程以分配,仍然允许连接进来,但是出于等待状态的用户数。
#等待线程数+工作线程数=总的可最大连接数,超过这个数的请求将不予处理。
acceptCount="200"

#Tomcat初始化时创建的线程数。最小空闲线程连接数用于优化线程池
minSpareThreads="100"
#一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
maxSpareThreads="200"

#网络连接超时,单位:毫秒。设置为0表示永不超时(不推荐))
connectionTimeout="20000"
disableUploadTimeout="true"

#为了消除DNS查询对性能的影响我们可以关闭DNS查询,关闭该功能在一定程度上提高了Tomcat服务器的性能;
enableLookups="false"
/>


(3)启用外部连接池

#去掉注释并修改maxThreads:
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="300" minSpareThreads="4"/>
-->

#删除俩参数:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"/>

#这是删除后的 <Connector executor="tomcatThreadPool"下面添加:
port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="200"
acceptCount="1000"
disableUploadTimeout="true"
connectionTimeout="20000"
URIEncoding="UTF-8"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
redirectPort="8443" />


3.禁用自动检测更新加载
Context元素reloadable属性会监视在 web-inf/classes 和 web-inf/lib 目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载web应用。

  • 在开发和调试阶段,将其改为true但是一般像Eclipse等开发环境都会默认改为true
  • 在正式发布阶段,应将其该为false可以降低Tomcat的运行负荷,提高Tomcat的运行性能
    $vim conf/server.xml
    #在</Host>之前加入类似以下内容:(重启生效)
    <context path="/bbs" docbase="bbs" reloadable="false"/>

4.安全加固

描述:加固依然分为身份鉴别、访问控制、安全审计、资源控制和入侵防范5个方面;
大部分加固基于xml配置文件进行修改,也应根据实际需求制定方案。

#寻找配置文件目录
find /-name *tomcat*
#配置文件目录存放目录
${tomcat_home}/conf/...


4.1 身份鉴别

0.口令复杂度,不同用户不同账号
描述:口令要求:长度至少8位,并包括数字、小写字母、大写字母和特殊符号4类中至少3类。
修改tomcat配置文件/conf/tomcat-users.xml配置文件,要求usr1密码必须满足复杂度要求。

<user username="Tomcat1" password="12345qwe" roles="manager-gui">
<user username="Tomcat2" password="12345qwe" roles="admin-gui">


1.安全配置manager登录页面并且删除多余账号
描述:Tomcat的主要管理界面被称为Manager应用程序

  • 如果不使用manager来管理部署应用,建议修改tomcat配置文件/conf/tomcat-users.xml配置文件来禁用或者删除manager文件夹
  • 如果使用该功能我们需要进行配置口令以及强密码包括访问控制,删除与工作无关的帐号以及应用。
    #1.配置强密码登录manager后面
    $vim tomcat_user.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <tomcat-users xmlns="http://tomcat.apache.org/xml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
    version="1.0">

    #角色如下并且要记得只赋予最小权限:
    # manager-gui:可以访问web界面
    # manager-status:只可以访问“Server Status”页面
    # manager-script:可以脚本文本界面和“Server Status”页面
    # manager-jmx:可以访问JMX代理界面和“Server Status”页面
    <role rolename="manager-gui"/>
    #host-manager页面
    <role rolename="admin-gui"/>
    <!--密码复杂度需要满足等保要求-->
    <user username="admin" password="@weiyigeek@" roles="manager-gui,admin-gui"/>
    </tomcat-users>

    #2.访问控制设定(其实默认只能本机访问)
    $/opt/tomcat/apache-tomcat-8.5.45/webapps/manager/META-INF/
    #采用正则添加匹配
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

WeiyiGeek


2.Tomcat虚拟主机管理器安全配置并且删除多余账号
描述:与manager管理一样如果使用的话进需要进行安全配置

  • 不使用的话建议删除webapps应用目录下的host-manager
  • 使用需要进行安全配置
    #登录密码配置
    $vim conf/tomcat-users.xml
    <role rolename="admin-gui"/>
    <user username="tomcat" password="s3cret" roles="admin-gui"/>

    #访问配置(其实默认只能本机访问)
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.\d+\.\d+\.\d+" />

WeiyiGeek.


3.非root启动服务
描述:建议使用专用用户 tomcat 或者 nobody 用户来启动 Tomcat,为了防止 Tomcat 被植入 web shell 程序后,可以修改项目文件。因此我们要将 Tomcat 和项目的属主做分离,这样子,即便被搞,他也无法创建和编辑项目文件。

$ps -ef | grep tomcat|grep -v "grep"
tomcat 13243 1 0 10:27 pts/0 00:00:02 /opt/tomcat/jdk8/jre/bin/java -Djava.util.logging.config.file=/opt/tomcat//apache-tomcat-8.5.45/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms1024m -Xmx2048m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/tomcat//apache-tomcat-8.5.45/bin/bootstrap.jar:/opt/tomcat//apache-tomcat-8.5.45/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat//apache-tomcat-8.5.45 -Dcatalina.home=/opt/tomcat//apache-tomcat-8.5.45 -Djava.io.tmpdir=/opt/tomcat//apache-tomcat-8.5.45/temp org.apache.catalina.startup.Bootstrap start


4.2 安全审计

0.增加记录日志功能
描述:编辑tomcat配置文件server.xml配置文件将以下内容的注释标记:

<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />

属性解释:

  • Directory:日志文件放置的目录,在tomcat下面有个logs文件夹,那里面是专门放置日志文件的,也可以修改为其他路径;
  • Prefix:这个是日志文件的名称前缀,日志名称为localhost_access_log.2008-10-22.txt,前面的前缀就是这个localhost_access_log。
  • Suffix: 文件后缀名。
  • Pattern:common方式时,将记录访问源IP、本地服务器IP、记录日志服务器IP、访问方式、发送字节数、本地接收端口、访问URL地址等相关信息在日志文件中。
  • resolveHosts:值为true时,tomcat会将这个服务器IP地址通过DNS转换为主机名,如果是false,就直接写服务器IP地址。

4.3 资源控制

0.移除默认应用程序
描述:Tomcat可能自带一些默认的web应用程序。如果不是一定需要,必须将它们移除。
移除${tomcat_home}/webapps中所有的默认的web应用程序有:ROOT、Documentation、Examples、Host Manager和Manager

#果不是一定需要,必须将它们移除。
rm -rf /opt/tomcat/apache-tomcat-8.5.45/webapps/*


1.错误页面重定向
描述:编辑tomcat配置文件/conf/web.xml文件,在最后一行之前加入以下内容,然后需要重新启动tomcat服务;

<error-page>
<!-- 配置实现了将404未找到jsp网页的错误导向noFile.htm页面,还可以添加其多的错误代码导向页面,如403,500 -->
<error-code>404</error-code>
<location>/noFile.htm</location>
</error-page>
<error-page>
<!--配置实现了当jsp网页出现java.lang.NullPointerException导常时,转向error.jsp错误页面 -->
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error.jsp</location>
</error-page>

当出现NullPointerException异常时tomcat会把网页导入到error.jsp,且会打印出出错信息。

<%@ pageerrorPage="/error.jsp" %>
典型的error.jsp错误页面的程序写法如下:
<%@ pagecontentType="text/html;charset=GB2312"%>
<%@ pageisErrorPage="true"%>
<html>
<head>
<title>错误页面</title>
</head>

<body>出错了:</p>错误信息:<%= exception.getMessage() %>
<br>
Stack Trace is :
<pre>
<font color="red"><%
java.io.CharArrayWritercw = new java.io.CharArrayWriter();
java.io.PrintWriterpw = new java.io.PrintWriter(cw,true);
exception.printStackTrace(pw);
out.println(cw.toString());
%>
</font>
</pre>
</body>
</html>

补充事项:

  • 如果Manager应用程序没被移除,必须手动将位于 CATALINA_HOME/webapps/manager/WEB-INF/jsp/ 的错误页面里的Tomcat版本信息移除。


3.限制访问Tomcat文件夹

描述:Tomcat文件夹只能由tomcat用户本身访问,尤其是对于目录${tomcat_home}/conf /和${tomcat_home}/webapps
当不需要通过应用程序服务器自动部署时,标准配置就是将所有Tomcat文件的所有者设置为root,并且所属群组设置为Tomcat,然后用chmod 740仅允许root用户编辑文件并允许Tomcat用户读取文件。

#(注意点)例外是临时和工作目录的所有者应该是Tomcat用户而不是root用户。
whown root:tomcat /opt/tomcat
chmod 740 ${tomcat_home}/conf
chmod 740 ${tomcat_home}/webapps


4.会话超时
描述:所有的web应用程序的会话超时必须设置为20分钟可通过编辑 CATALINA_HOME/conf/web.xml 文件并做以下配置来实现:

<!-- Tomcat8默认的超时时间是半个小时 -->
<session-config>
<session-timeout>20</session-timeout>
</session-config>


4.4 访问控制

描述: Tomcat提供了防止恶意攻击或禁止某些机器访问的设置,限制手段来防止恶意的服务攻击;
可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的在Apache的httpd文件里有对每个目录的允许/拒绝指定。

1.Context.xml访问控制设置
Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
例如: 你可以把Admin Web application设置成只允许本地访问设置如下:

<Context path="/path/to/secret_files" >
#如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="10.0.172.109" deny="" />
</Context>


4.5 入侵防范

0.防止缓慢的http拒绝服务攻击与限制监听网络接口
描述:不要让连接器(connector)监听服务器上所有可用的网络接口和IP地址,而要让连接器监听指定的网络接口和IP地址采用address属性,防止应用程序意外地运行在某个开放的网络接口上。

#将默认值20000改成10000即可单位ms注意需要根据实际需求更改
$vim conf/server.xml
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="10000"
redirectPort="8443"
address="127.0.0.1" />


1.禁用tomcat的AJP协议

#  编辑server.xml进行注释配置
$vim conf/server.xml
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->


2.禁用非法HTTP请求方法
描述:readonly参数默认是true即不允许delete和put操作
编辑web.xml文件查看org.apache.catalina.servlets.DefaultServlet是否存在如下配置

$vim conf/web.xml
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>


3.禁止目录列出

描述:设置DefaultServlet的listings为false
这不仅仅是因为允许显示目录列表被认为是不安全的,而且还因为生成具有数千个文件的目录列表会消耗大量的CPU资源,相当于被DDoS攻击。
注意:Tomcat8默认是false并且更改后需要重新启动tomcat服务;

$vim conf/web.xml
<!-- 同样也是在下面进行添加-->
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>


4.防止恶意关闭服务
描述:编辑tomcat配置文件conf/server.xml配置文件,shutdown的值为复杂的字符串:

#随机生成密码
$cat /dev/urandom | tr -dc '_a-zA-Z0-9' | head -c 12
r02BPRnHyq89
#配置如下:将默认的SHUTDOWN变成r02BPRnHyq89
<Serverport="8005" shutdown="r02BPRnHyq89">

#如果不需要该功能,必须要将其停用,设置如下:
<Server port="-1" shutdown="SHUTDOWN"> #本地管理脚本可将服务器关闭,即使在关闭端口被禁用的情况下。


5.修改Banner掩盖真实信息
描述:修改以掩饰真实版本信息防止攻击者以版本的漏洞进行攻击,影响错误页面和响应头;

##(1)修改/lib/catalina.jar中org/apache/catalina/util/Serverinfo.properties问津中的以下参数 (推荐方式)
$unzip catalina.jar
$vim catalina/org/apache/catalina/util/Serverinfo.properties
server.info=Nginx
server.number=0.0.0.0
server.built=Apr 2 2017 07:25:00 UTC
#将修改后的信息压缩回jar包
jar uvf catalina.jar org/apache/catalina/util/ServerInfo.properties

WeiyiGeek.

#(2)修改web.xml中国Connector链接器
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
server="Microsoft-IIS/6.5"/> #关键点

WeiyiGeek.


6.关闭自动部署
描述:Tomcat允许在Tomcat运行时自动部署应用程序。为了防止被植入木马等恶意程序,因此我们要关闭自动部署。

$vim server.xml
#将unpackWARs与autoDeploy的true值改成false;
<Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false">

补充:在托管环境中Web应用程序可能不受信任,也可以设置deployXML属性为false来忽略context.xml以防给该web应用程序提高权限。


7.配置HTTPS加密协议
描述:采用HTTPS协议加密可以防止中间人攻击,以及数据的拦截和修改的验证导致攻击无效;

#(1)用JDK自带的keytool工具生成一个证书,默认三个月的有效期;
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -keystore /tmp/keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: Tomcat
What is the name of your organizational unit?
[Unknown]: CQ
What is the name of your organization?
[Unknown]: CQ
What is the name of your City or Locality?
[Unknown]: BEIJING
What is the name of your State or Province?
[Unknown]: XIZHIMEN
What is the two-letter country code for this unit?
[Unknown]: 408119
Is CN=Tomcat, OU=CQ, O=CQ, L=BEIJING, ST=XIZHIMEN, C=408119 correct?
[no]: Y

Enter key password for <tomcat>
(RETURN if same as keystore password):
Re-enter new password:

#(2)修改tomcat安装目录下/conf/server.xml配置文件,更改为使用HTTPS方式,增加如下行:
<Connector classname="org.apache.catalina.http.HttpConnector"
port="443" protocol="HTTP/1.1" minProcessors="5"
SSLEnabled="true"
maxprocessors="100"
enableLookups="true" acceptCount="10" debug="0"
scheme="https"
Factory_classname="org.apache.catalina.SSLServerSocketFactory"
secure="true"
clientAuth="false"
keystoreFile="/tmp/keystore"
keystorePass="weiyigeek"
sslProtocol="TLS" />
#SSL Connector来指定可用的SSL加密方式:
ciphers="SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"

也可以通过 https://10.10.107.222/manager/html/sslConnectorCerts 查看证书情况

WeiyiGeek.

补充:为了使托管在Tomcat上的所有web应用程序强制使用HTTPS,必须在每个 CATALINA_HOME/webapps/$WEBAPP/WEB-INF/web.xml 文件里每个security-constraint标签关闭(标签)之前包含以下内容:

<user-data-constraint> 
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
<user-data-constraint>


8.HttpOnly标记
描述:对会话cookie自动启用HttpOnly的cookie标记,查看配置以确保该选项为被禁用。

#要启用HttpOnly设置使之全局应用于所有应用程序:
<Context useHttpOnly='true'>
...
<Context>

补充:如果应用程序需要通过JavaScript访问HttpOnly cookie,可以在METAINF/context.xml中一个单独的Context中定义一个异常。


9.CSRF防护
描述:为保护应用程序必须启用Tomcat的跨站请求伪造防护。Tomcat8~9提供了基本的CSRF防护。可以在 CATALINA_BASE/conf/web.xml 中配置一个全局过滤器。

#该过滤器可以被每个使用 WEB-INF/web.xml 文件的应用程序覆盖。
<filter-mapping>
<filter-name>CSRFPreventionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

补充:使用CSRF防护可能会影响程序功能,必须要牢记这一点,尤其是在应用程序大量使用异步请求的情况下。


4.6 默认设置

描述:以下是常规的默认配置并且默认情况下这些设置被认为是安全的,如有在项目中进行更改的建议进行整改和调整;

1.server.xml中默认安全配置

$vim $CATALINA_HOME/conf/server.xml
<Connector
#1.设置为空或者false
allowTrace="false"
/>


2.context.xml中默认安全配置

$vim $CATALINA_HOME/conf/server.xml
<Context
#1.将privileged属性设置为false,除非像Manager应用程序那样需要权限:
privileged="false"

#2.确保crossContext值为空或被设为false,
#crossContext值为true可能会导致允许恶意应用程序向受限应用程序发送请求。
crossContext="false"

#3.确保allowLinking值为空或被设为false。
#allowLinking值为true可能会导致目录遍历和源代码泄露漏洞的产生。
allowLinking="false"
/>


3.Tomcat启动参数

#1.当RECYCLE_FACADES选项设置为true时,Tomcat会回收请求间会话外观(session facade),将导致请求间的信息泄漏
#默认情况下,此参数未被设置(确保使用的启动脚本不包含以下内容)
Dorg.apache.catalina.connector.RECYCLE_FACADES = false

#2.允许在Tomcat上指定不同的路径分隔符,可能会允许攻击者访问应用程序,该行为本该被代理程序(比如mod_proxy)阻止
#默认情况下,此参数未被设置(确保使用的启动脚本不包含以下内容)
Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH = FALSE
Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = FALSE

#3.允许自定义header状态消息,使攻击者也能够插header。
#可能会导致XSS漏洞的产生。默认情况下此参数未被设置。
Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = false
Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH= FALSE
Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER = false


4.7 可选操作

1.Java SecurityManager
描述:可用Java SecurityManager限制单个应用程序的功能。

  • $CATALINA_HOME/conf/catalina.policy 文件包含了Java SecurityManager使用的安全策略的配置
  • 一旦配置了catalina.policy 文件,便可以使用SecurityManager和–security选项启Tomcat。

注意事项:

  • 因为基本上所有的权限类型(比如访问单个文件和目录或Java包)都应该根据每个应用程序进行单独配置,所以这会大大增加操作成本。另外,限制过于严格的策略文件会影响应用程序的功能。


2.访问Java包控制
描述:Tomcat可限制对某些Java包的访问。如果检测到受限制的包被访问,将抛出安全异常。
对Java包做访问限制,打开 $CATALINA_BASE/conf/catalina.properties 文件并添加不允许访问的包至package.access列表。

分析Java import可以列出哪些应用程序需要哪些包。在Unix系统上,可以使用以下例子来实现:

grep –R import ${tomcat_home}/webapps/WEBAPP


附录

(1)生产配置实例

server.xml配置文件下:

[root@tomcat1 ~]# vim /usr/local/tomcat8/conf/server.xml

<!-- 修改Connector元素 -->
<Connector executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
address="127.0.0.1"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="200"
acceptCount="1000"
disableUploadTimeout="true"
connectionTimeout="20000"
URIEncoding="UTF-8"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
redirectPort="8443"
server="SecWAF/1.9" />

#参数说明:
org.apache.coyote.http11.Http11NioProtocol:调整工作模式为Nio
address:绑定监听地址
maxThreads:最大线程数默认150表示最多同时处理150个连接,增大值避免队列请求过多,导致响应缓慢。
minSpareThreads:最小空闲线程数。
maxSpareThreads:最大空闲线程数,如果超过这个值,会关闭无用的线程。
acceptCount:当处理请求超过此值时,将后来请求放到队列中等待,如果超过这个连接的则直接返回拒绝连接。
disableUploadTimeout:禁用上传超时时间
connectionTimeout:连接超时,单位毫秒,0代表不限制
URIEncoding:URI地址编码使用UTF-8
enableLookups:关闭dns解析,提高响应时间
compression:启用压缩功能
compressionMinSize:最小压缩大小,单位Byte
compressableMimeType:压缩的文件类型
server:设置server响应头;

总结