一、Tomcat安全加固的重要性

作为Java生态中最流行的Web容器之一,Tomcat承载着大量企业级应用。但默认安装的Tomcat就像没上锁的家门,黑客可以轻松找到入口。去年某电商平台就因Tomcat配置不当,导致百万用户数据泄露。我们不仅要会使用Tomcat,更要懂得如何保护它。

二、基础安全配置

1. 修改默认端口和关闭无关协议

<!-- server.xml配置示例 -->
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxThreads="150" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/keystore.jks"
                     type="RSA" />
    </SSLHostConfig>
</Connector>
<!-- 禁用AJP协议(除非明确需要) -->
<!-- <Connector protocol="AJP/1.3" redirectPort="8443" /> -->

注释说明:

  • 将默认8080端口改为非常用端口
  • 启用HTTPS并配置SSL证书
  • 注释掉AJP连接器减少攻击面

2. 强化管理员账户

# conf/tomcat-users.xml示例
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="UniqueAdmin" password="Zxcv@1234!" 
      roles="manager-gui,admin-gui"/>

密码复杂度要求:

  • 长度至少12位
  • 包含大小写字母、数字和特殊符号
  • 定期更换(建议90天)

三、防护常见攻击手段

1. 阻止目录遍历攻击

<!-- conf/web.xml添加配置 -->
<init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
</init-param>
<security-constraint>
    <web-resource-collection>
        <url-pattern>/</url-pattern>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

防护原理:

  • 禁用目录列表功能
  • 对根路径添加安全约束

2. 防CSRF攻击

// 自定义过滤器示例(Java技术栈)
public class CsrfFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, 
                        FilterChain chain) {
        HttpServletRequest request = (HttpServletRequest) req;
        if (!request.getMethod().equalsIgnoreCase("POST")) {
            chain.doFilter(req, res);
            return;
        }
        
        String sessionToken = (String) request.getSession()
                               .getAttribute("CSRF_TOKEN");
        String requestToken = request.getParameter("csrfToken");
        
        if (sessionToken == null || !sessionToken.equals(requestToken)) {
            throw new ServletException("CSRF验证失败");
        }
        chain.doFilter(req, res);
    }
}

实现要点:

  • 对POST请求强制验证token
  • token需存储在服务端session中
  • 前端表单需携带隐藏token字段

四、高级防护策略

1. 使用安全管理器

# catalina.sh启动参数
export CATALINA_OPTS="-Djava.security.manager \
                     -Djava.security.policy=/path/to/security.policy"

安全策略文件示例:

// security.policy内容
grant {
    permission java.net.SocketPermission "db.example.com:3306", "connect";
    permission java.io.FilePermission "/var/log/tomcat/-", "read,write";
};

权限控制维度:

  • 文件系统访问权限
  • 网络连接权限
  • 类加载权限

2. 日志审计强化

<!-- conf/logging.properties配置示例 -->
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
    2localhost.org.apache.juli.FileHandler
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = audit.

关键日志内容:

  • 所有认证尝试记录
  • 敏感操作日志(如文件上传)
  • 异常请求日志(包含源IP)

五、应急响应措施

当发现攻击迹象时:

  1. 立即隔离受影响实例
# 快速关闭Tomcat(Linux环境)
ps -ef | grep tomcat | grep -v grep | awk '{print $2}' | xargs kill -9
  1. 保留现场证据
# 打包关键日志
tar -czvf forensic_$(date +%Y%m%d).tar.gz \
    /var/log/tomcat/ /etc/tomcat/ /webapps/
  1. 漏洞修复流程:
    • 分析攻击路径
    • 升级受影响组件
    • 安全配置复查
    • 监控系统加固

六、持续安全维护

建议建立检查清单:

  1. 每月检查项:

    • 证书有效期
    • 用户账户状态
    • 依赖库版本
  2. 季度检查项:

    • 安全策略复审
    • 渗透测试
    • 备份恢复演练
  3. 自动化监控脚本示例:

#!/bin/bash
# 检查Tomcat异常连接
netstat -antp | grep java | awk '{print $5}' | cut -d: -f1 | \
    sort | uniq -c | sort -nr | head -10

# 检查内存泄漏
jstat -gcutil $(pgrep java) 1000 5

记住:安全不是一次性的工作,而是持续的过程。就像汽车需要定期保养,Tomcat也需要持续的安全维护。从今天开始,给你的Tomcat穿上防弹衣吧!