3.5 Tomcat 安全性加固指南 Tomcat 作为主流 Java Web 应用服务器,其安全性直接影响业务系统的稳定与数据资产安全。本指南系统梳理八大核心加固维度,涵盖访问控制、身份认证、通信加密、输入防护、版本治理、日志审计、资源防护及文件权限管理,提供可落地的配置实践与最佳实践建议,助力企业构建符合等保2.0、ISO 27001及GDPR要求的生产级安全基线。 限制管理界面访问权限 默认启用的 和 应用是高危攻击入口,必须严格限制其访问范围,杜绝暴露于公网或内网非可信区域。 关键配置实践: IP 白名单访问控制(推荐) 在 中为管理应用添加 ,仅允许可信地址访问: ✅ 说明:正则表达式中反斜杠需双写( , ), 表示整个子网;生产环境严禁使用 。
Tomcat 作为主流 Java Web 应用服务器,其安全性直接影响业务系统的稳定与数据资产安全。本指南系统梳理八大核心加固维度,涵盖访问控制、身份认证、通信加密、输入防护、版本治理、日志审计、资源防护及文件权限管理,提供可落地的配置实践与最佳实践建议,助力企业构建符合等保2.0、ISO 27001及GDPR要求的生产级安全基线。
默认启用的 manager 和 host-manager 应用是高危攻击入口,必须严格限制其访问范围,杜绝暴露于公网或内网非可信区域。
关键配置实践:
IP 白名单访问控制(推荐)
在 conf/context.xml 中为管理应用添加 RemoteAddrValve,仅允许可信地址访问:
<Context path="/manager" docBase="manager" debug="0" privileged="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1|::1|192\.168\.10\.0/24" /> </Context> <Context path="/host-manager" docBase="host-manager" debug="0" privileged="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1|::1|192\.168\.10\.0/24" /> </Context>
✅ 说明:正则表达式中反斜杠需双写(
\.,\.),192.168.10.0/24表示整个子网;生产环境严禁使用allow=".*"。
物理移除非必要管理应用(强推荐)
若无需 Web 管理界面,直接删除对应目录(重启后生效):
rm -rf $CATALINA_HOME/webapps/manager rm -rf $CATALINA_HOME/webapps/host-manager rm -rf $CATALINA_HOME/webapps/examples rm -rf $CATALINA_HOME/webapps/docs
⚠️ 注意:删除前确认未依赖其 API(如 CI/CD 自动部署脚本),建议通过
curl -I http://localhost:8080/manager/status验证是否已失效。
弱口令是管理后台沦陷的首要原因。必须实施密码复杂度策略、角色最小化授权及多因素认证(MFA)支持。
配置与实践:
基于角色的最小权限模型
在 conf/tomcat-users.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"> <!-- 禁用默认注释中的示例用户 --> <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <role rolename="admin-gui"/> <role rolename="admin-script"/> <!-- 生产环境专用账户:密码需满足8位以上、大小写字母+数字+特殊字符 --> <user username="ops-admin" password="$2y$10$AbCdefGhIjKlMnOpQrStUvWxYz1234567890" roles="manager-gui,manager-status,admin-gui"/> </tomcat-users>
🔐 安全要求:密码须使用 BCrypt 加密(Tomcat 9.0.31+ 支持),禁用明文存储;禁止复用其他系统密码;每90天强制轮换。
集成外部认证(进阶)
通过 JAASRealm 或 JNDIRealm 对接 LDAP/AD,实现统一身份源与 MFA 集成,消除本地凭证管理风险。
HTTP 明文传输导致凭据、会话 ID、敏感业务数据完全暴露。必须强制 HTTPS 并禁用不安全协议。
安全配置(conf/server.xml):
<!-- 禁用 HTTP 明文端口(生产环境应注释或删除此 Connector) --> <!-- <Connector port="8080" protocol="HTTP/1.1" ... /> --> <!-- 启用 TLS 1.2+ HTTPS 端口 --> <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="200" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2,TLSv1.3" ciphers="TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256" keystoreFile="${catalina.base}/conf/keystore.p12" keystoreType="PKCS12" keystorePass="YourSecureKeystorePassword" keyAlias="tomcat"/>
✅ 证书最佳实践:
- 使用由可信 CA(如 Let’s Encrypt、DigiCert)签发的证书,禁用自签名证书;
- 私钥权限设为
600,属主为tomcat用户;- 配置 HTTP 重定向(在
conf/web.xml中添加<security-constraint>强制 HTTPS)。
未校验的用户输入可能导致 ../ 路径穿越,读取 conf/、logs/ 或系统文件(如 /etc/passwd)。
双重防护策略:
应用层过滤(Web 应用自身)
在 WEB-INF/web.xml 中配置 DefaultServlet 安全参数:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>readonly</param-name> <param-value>true</param-value> <!-- 禁止 PUT/DELETE --> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> <!-- 禁用目录列表 --> </init-param> <init-param> <param-name>fileEncoding</param-name> <param-value>UTF-8</param-value> </init-param> </servlet>
容器层路径规范化(Tomcat 9.0.33+)
在 conf/catalina.properties 中启用严格路径解析:
# 启用路径规范化与非法字符拦截 org.apache.catalina.connector.REJECT_UNSAFE_CHARS=true org.apache.catalina.connector.REJECT_EMPTY_PATH=true
🛡️ 验证方法:发送请求
GET /..%2fconf%2ftomcat-users.xml,响应应为400 Bad Request或404 Not Found,而非文件内容。
Tomcat 及其依赖库(如 commons-collections、log4j)的历史漏洞(CVE-2017-12615、CVE-2021-44228)表明,过期版本是重大风险源。
自动化治理流程:
| 环节 | 工具/方法 | 频率 | 输出 |
|---|---|---|---|
| 漏洞扫描 | OWASP Dependency-Check、Trivy、Snyk | 每日 CI 流水线 | 生成 dependency-report.html,阻断高危漏洞构建 |
| 版本升级 | 官方发布页订阅(https://tomcat.apache.org/) | 每季度 | 升级至最新稳定版(如 10.1.x LTS),禁用 EOL 版本(如 8.5.x) |
| 补丁验证 | 自动化测试套件(JUnit + Selenium) | 升级后立即执行 | 验证管理功能、业务接口、会话一致性 |
📌 关键策略:
- 使用容器化部署(Docker),基础镜像固定 SHA256 值,杜绝“漂移”;
- 在
pom.xml中声明<properties><tomcat.version>10.1.26</tomcat.version></properties>,统一依赖版本。
日志是安全事件溯源的唯一依据。需确保完整性、机密性、可用性及行为可追溯。
配置要点:
精细化日志分级(conf/logging.properties)
# 全局日志级别:生产环境禁用 DEBUG .level = INFO # Catalina 核心日志(含启动/关闭/异常) 1catalina.org.apache.juli.AsyncFileHandler.level = INFO 1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. 1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90 # 访问日志(启用 NCSA 格式,含关键字段) 2localhost.org.apache.juli.AsyncFileHandler.level = INFO 2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost_access_log. 2localhost.org.apache.juli.AsyncFileHandler.maxDays = 30
增强型访问日志(conf/server.xml)
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%t %h %l %u "%r" %s %b %D %{User-Agent}i %{X-Forwarded-For}i" resolveHosts="false" buffered="true" maxDays="30"/>
✅ 字段说明:
%D(响应毫秒)、%{User-Agent}i(客户端指纹)、%{X-Forwarded-For}i(真实 IP,需前置 Nginx 配置proxy_set_header X-Forwarded-For $remote_addr;)
集中化日志(推荐)
集成 ELK(Elasticsearch + Logstash + Kibana)或 Loki + Grafana,设置告警规则:
🔔 规则示例:5 分钟内
401 Unauthorized请求 > 10 次 → 触发钉钉/企业微信告警。
恶意连接耗尽线程、内存或文件句柄,导致服务不可用。需实施多层级资源配额。
关键防护配置:
| 组件 | 配置项 | 推荐值 | 作用 |
|---|---|---|---|
| HTTP 连接器 | maxConnections |
200(单节点) |
限制最大 TCP 连接数 |
maxThreads |
150 |
限制处理请求的线程池上限 | |
connectionTimeout |
20000(20秒) |
防止慢速攻击(Slowloris) | |
acceptCount |
100 |
全连接队列长度,超限返回 503 |
|
| AJP 连接器(如启用) | secretRequired="true" + secret="YourAjpSecret" |
强制密钥认证 | 防止未授权 AJP 协议滥用 |
| JVM 层 | -Xms2g -Xmx2g -XX:+UseG1GC |
固定堆内存 | 避免 GC 晃动引发响应延迟 |
📊 监控指标:
org.apache.catalina:type=ThreadPool,name="http-nio-8080"→currentThreadsBusy(忙线程数)java.lang:type=Memory→HeapMemoryUsage.used(堆内存使用率)
告警阈值:currentThreadsBusy > 120或HeapMemoryUsage.used > 1.8g。
配置文件(server.xml, tomcat-users.xml)和日志包含敏感信息,必须遵循最小权限原则。
操作系统级加固命令:
# 设置 conf 目录:仅 tomcat 用户可读写 sudo chown -R tomcat:tomcat $CATALINA_HOME/conf/ sudo chmod 700 $CATALINA_HOME/conf/ sudo chmod 600 $CATALINA_HOME/conf/*.xml sudo chmod 600 $CATALINA_HOME/conf/*.properties # 设置 logs 目录:tomcat 可写,组用户可读(审计员所属组) sudo chown -R tomcat:auditgroup $CATALINA_HOME/logs/ sudo chmod 750 $CATALINA_HOME/logs/ sudo chmod 640 $CATALINA_HOME/logs/*.log # 验证权限(应无 world 可写权限) ls -ld $CATALINA_HOME/conf/ $CATALINA_HOME/logs/
🔒 合规要求:
- 符合等保2.0“安全计算环境”中“访问控制”条款(8.1.4.2);
- 禁止
root用户直接运行 Tomcat(使用systemd以tomcat用户启动);- 定期执行
find $CATALINA_HOME -type f -perm -o+w -ls扫描越权文件。
Tomcat 安全加固不是一次性配置,而是覆盖网络层→容器层→应用层→数据层的持续闭环过程。本文所列八大措施构成企业级防护矩阵:
✅ 最终验证清单:
- 使用 Mozilla SSL Configuration Generator 校验 HTTPS 配置;
- 执行
nmap -sV -p 8080,8443 your-server确认端口服务与版本隐藏;- 运行 Tomcat Security Benchmark 自动检测脚本;
- 通过 OWASP ZAP 或 Burp Suite 进行渗透测试,覆盖路径遍历、信息泄露、暴力破解场景。
遵循本指南,可显著降低 Tomcat 服务器遭受常见 Web 攻击的风险,为 Java 业务系统提供坚实的安全运行底座。