【中间件安全计划】锚定Tomcat安全基线
- 前言
- Tomcat醒脑
- 1、Tomcat
- 1.1、Tomcat的缺省端口是多少?怎么修改
- 1.2、Tomcat有哪几种Connector运行模式
- 1.3、Tomcat优化方案归纳
- 1.4、Tomcat主配置文件server.xml
- 1.5、Tomcat针对JVM优化参数有哪些及其含义
- 2、基线
- 2.1、禁用Tomcat管理页面
- 2.2、隐藏Tomcat版本号
- 2.3、禁止列出目录
- 2.4、隐藏Tomcat产品信息
- 2.5、防止远程恶意关闭Tomcat服务
- 2.6、安装目录
在丰富多样的技术框架和复杂的技术选型过程中,我们通常会对中间件的产品类别以及版本等方面进行统一规划与管理。然而,对于中间件的配置,目前是否存在统一的标准呢?
以等级保护要求较高的系统中所使用的 Tomcat 为例,这会引出一系列关于统一规范的思考:
诸如此类的问题,促使我们必须进行深入且全面的思考,进而针对各类中间件、操作系统、数据库等制定出一套统一的、开发人员必须严格遵守的标准,我将其定义为基线,此亦为【中间件安全计划】的起草初衷。
Tomcat是一个Web服务器,例如,假设有一个在线购物网站,用户想查看商品列表。当他们点击“商品列表”链接时,浏览器会向Tomcat服务器发送一个请求。Tomcat接收到这个请求后,会找到对应处理这个请求的Servlet或JSP,执行它们来查询数据库中的商品信息,然后生成包含这些信息的HTML页面,并将这个页面返回给浏览器显示。这个过程就是一个典型的Tomcat处理请求的例子。
默认端口是8080。如果需要修改这个端口号,可以通过编辑配置文件/conf/server.xml
。(搜索port字段)
server.xml
后,可以通过Tomcat的bin目录下的shutdown.sh
脚本来停止Tomcat,然后使用startup.sh
脚本来重新启动它。startup.bat
和shutdown.bat
脚本来启动和停止Tomcat。更改Toct的默认端口可以帮助解决端口冲突的问题,或者是出于安全考虑,避免使用常见的默认端口。server.xml
的Connector
节点,修改protocol="org.apache.coyote.http11.Http11NioProtocol"
。
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
/>
高并发应用首选此模式,就是还需要其他依赖库。
Tomcat8.5及以后版本:进一步增加了对NIO2(Non-Blocking I/O2)的支持,NIO2是Java7中引入的一个新的I/O库,
提供了更强大的异步非阻塞/O处理能力。虽然NIO是默认设置,但Tomcat也支持NIO2和APR(Apache Portable Runtime,一种基于本地代码的高性能I/O模型)作为可配置选项。
Tomcat优化方案主要可以从配置优化、性能调优和硬件资源优化三个方面进行归纳。
# 开发环境配置
server:
# 服务器的HTTP端口,默认为8080
port: 8080
# 启用压缩可以减少通过网络发送的数据量,从而缩短响应时间
compression:
enabled: true
mime-types: application/json,application/xml,text/html,text/xml,text/plain
min-response-size: 1024
connection-timeout: 20000 # 客户端连接超时时间(以毫秒为单位)
servlet:
# 应用的访问路径
context-path: /
tomcat:
# 配置 tomcat 的访问日志
basedir: D:/KuangStudy_RuoYiFast/logs/tomcat
keep-alive-timeout: 10000 # 保持连接超时时间(以毫秒为单位)
max-keep-alive-requests: 100 # 可通过保持连接发送的最大请求
# tomcat的URI编码
uri-encoding: UTF-8
# 连接数满后的排队数,默认为100
accept-count: 1000
threads:
# tomcat最大线程数,默认为200
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
max-connections: 10000 # 可处理的最大连接数
accept-count: 1000 # 传入连接请求的最大队列长度
server.xml
是Tomcat主要的配置文件之一,位于$CATALINA HOME/conf/
目录下。这个XML格式的文件负责配置Tomcat服务器的核心组件,包括服务、连接器(Connector)、引擎(Engine)、虚拟主机(Host)和上下文(Context)。通过编辑server.xml
文件,可以对Tomcat服务器进行细致的配置,以满足不同的部署需求。以下是server.xml
文件中一些关键配置元素的作用:
Tomcat运行在Java虚拟机(JVM)之上,因此通过调整VM的启动参数可以优化Tomcat的性能。JVM参数的调整可以影响Tomcat的响应速度、吞吐量、内存使用以及稳定性。以下是一些针对Tomcat优化的常用V小M参数及其含义:
堆内存设置
-Xms
:设置JVM启动时堆内存的初始大小。例如,-Xms512m
表示设置JVM启动时的堆内存大小为512MB-Xmx1024m
表示设置JVM最大可用堆内存为1024MB。通过合理调整这两个参数,可以控制Tomcat可用的最大内存,避免内存溢出,同时提高性能。年轻代(Young Generation)大小设置
垃圾回收器设置
-XX:+UseConcMarkSweepGC
:启用CMS(并发标记-清除)垃圾回收器,适用于需要更短回收停顿时间的应用。-XX:+UseParalleIGC
:启用并行垃圾回收器,提高吞吐量。-XX:UseG1GC
:启用G1垃圾回收器,适用于大堆内存和需要更可控的停顿时间的应用。垃圾回收日志设置
-XIoggc
:设置垃圾回收日志文件的路径。例如,-xloggc:/path/to/gc.log
-XX:+PrintGCDetails
:输出详细的垃圾回收日志。-XX:+PrintGCDateStamps
:在垃圾回收日志中添加时间戳。直接内存设置
-XX:MaxDirectMemorySize
:设置JVM使用的最大直接内存大小。直接内存常用于NIO操作,通过设置可以避免元空间 Metaspace 大小设置
-XX:MetaspaceSize
和-XX:MaxMetaspaceSize
:在Java8及以后版本中,用于替代永久代(PermGen),设置元空间的初始大小和最大大小。为了防止黑客通过Tomcat管理页面对Tomcat发起攻击,例如猜解密码等控制管理页面,攻击服务器。
# 1、进入Tomcat文件夹下的 webapps 文件夹
cd D:\Develop\apache-tomcat-9.0.76\webapps
# 2、将docs 、examples、host-manager、manager、ROOT文件夹打包为 webapps_back.tar
tar -cvf webapps_back.tar docs examples host-manager manager ROOT
# 3、删除webapps 文件夹下的所有文件和文件夹
rm -rf docs examples host-manager manager ROOT
# 4、重新创建一个ROOT文件夹
mkdir -p ROOT
# 5、重启tomcat服务
在生产环境中,隐藏Tomcat的版本信息是一个重要的安全措施,可以防止潜在的攻击者获取有关服务器的信息。
# 1、进入Tomcat的lib文件
cd D:\Develop\apache-tomcat-9.0.76\lib
# 2、解压 catalina.jar 文件
unzip catalina.jar
# 3、# 进入解压后的文件夹
cd org/apache/catalina/util
# 4、修改
vi ServerInfo.properties
# 5、将 server.info 的值清空
禁止通过浏览器来访问目录。
conf/web.xml
conf/server.xml
的Connector
项中增加server配置项 <Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxParameterCount="1000"
server="appsvr"
/>
conf/server.xml
的shutdown="SHUTDOWN"
修改为shutdown="复杂字符串"
/tomcat
D:/tomcat