3.5 安全性加固


文档摘要

3.5 Tomcat 安全性加固指南 Tomcat 作为主流 Java Web 应用服务器,其安全性直接影响业务系统的稳定与数据资产安全。本指南系统梳理八大核心加固维度,涵盖访问控制、身份认证、通信加密、输入防护、版本治理、日志审计、资源防护及文件权限管理,提供可落地的配置实践与最佳实践建议,助力企业构建符合等保2.0、ISO 27001及GDPR要求的生产级安全基线。 限制管理界面访问权限 默认启用的 和 应用是高危攻击入口,必须严格限制其访问范围,杜绝暴露于公网或内网非可信区域。 关键配置实践: IP 白名单访问控制(推荐) 在 中为管理应用添加 ,仅允许可信地址访问: ✅ 说明:正则表达式中反斜杠需双写( , ), 表示整个子网;生产环境严禁使用 。

3.5 Tomcat 安全性加固指南

Tomcat 作为主流 Java Web 应用服务器,其安全性直接影响业务系统的稳定与数据资产安全。本指南系统梳理八大核心加固维度,涵盖访问控制、身份认证、通信加密、输入防护、版本治理、日志审计、资源防护及文件权限管理,提供可落地的配置实践与最佳实践建议,助力企业构建符合等保2.0、ISO 27001及GDPR要求的生产级安全基线。

1. 限制管理界面访问权限

默认启用的 managerhost-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 验证是否已失效。

2. 强化身份认证机制

弱口令是管理后台沦陷的首要原因。必须实施密码复杂度策略、角色最小化授权及多因素认证(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天强制轮换。

  • 集成外部认证(进阶)
    通过 JAASRealmJNDIRealm 对接 LDAP/AD,实现统一身份源与 MFA 集成,消除本地凭证管理风险。

3. 启用 TLS 1.2+ 全链路加密

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)。

4. 防御路径遍历与文件泄露

未校验的用户输入可能导致 ../ 路径穿越,读取 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 Request404 Not Found,而非文件内容。

5. 实施主动式版本与依赖治理

Tomcat 及其依赖库(如 commons-collectionslog4j)的历史漏洞(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>,统一依赖版本。

6. 构建可审计日志与实时监控体系

日志是安全事件溯源的唯一依据。需确保完整性、机密性、可用性及行为可追溯。

配置要点:

  • 精细化日志分级(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 &quot;%r&quot; %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 次 → 触发钉钉/企业微信告警。

7. 防御拒绝服务(DoS/DDoS)攻击

恶意连接耗尽线程、内存或文件句柄,导致服务不可用。需实施多层级资源配额。

关键防护配置:

组件 配置项 推荐值 作用
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=MemoryHeapMemoryUsage.used(堆内存使用率)
    告警阈值:currentThreadsBusy > 120HeapMemoryUsage.used > 1.8g

8. 严格管控配置与日志文件权限

配置文件(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(使用 systemdtomcat 用户启动);
  • 定期执行 find $CATALINA_HOME -type f -perm -o+w -ls 扫描越权文件。

总结:构建纵深防御安全基线

Tomcat 安全加固不是一次性配置,而是覆盖网络层→容器层→应用层→数据层的持续闭环过程。本文所列八大措施构成企业级防护矩阵:

  • 入口收敛:关闭非必要端口与管理界面,IP 白名单优先;
  • 凭证硬化:强密码 + 角色最小化 + 外部认证集成;
  • 传输加密:TLS 1.2+ 全链路加密 + 安全协议/算法白名单;
  • 输入净化:路径规范化 + 目录遍历防护 + 静态资源只读;
  • 可信供应链:自动化漏洞扫描 + 版本生命周期管理;
  • 行为可溯:结构化日志 + 集中式审计 + 实时异常告警;
  • 资源可控:连接/线程/内存硬限制 + JVM 优化;
  • 权限最小化:配置文件 600 权限 + 日志 640 权限 + 非 root 运行。

最终验证清单

  • 使用 Mozilla SSL Configuration Generator 校验 HTTPS 配置;
  • 执行 nmap -sV -p 8080,8443 your-server 确认端口服务与版本隐藏;
  • 运行 Tomcat Security Benchmark 自动检测脚本;
  • 通过 OWASP ZAP 或 Burp Suite 进行渗透测试,覆盖路径遍历、信息泄露、暴力破解场景。

遵循本指南,可显著降低 Tomcat 服务器遭受常见 Web 攻击的风险,为 Java 业务系统提供坚实的安全运行底座。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U