一、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)
五、应急响应措施
当发现攻击迹象时:
- 立即隔离受影响实例
# 快速关闭Tomcat(Linux环境)
ps -ef | grep tomcat | grep -v grep | awk '{print $2}' | xargs kill -9
- 保留现场证据
# 打包关键日志
tar -czvf forensic_$(date +%Y%m%d).tar.gz \
/var/log/tomcat/ /etc/tomcat/ /webapps/
- 漏洞修复流程:
- 分析攻击路径
- 升级受影响组件
- 安全配置复查
- 监控系统加固
六、持续安全维护
建议建立检查清单:
每月检查项:
- 证书有效期
- 用户账户状态
- 依赖库版本
季度检查项:
- 安全策略复审
- 渗透测试
- 备份恢复演练
自动化监控脚本示例:
#!/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穿上防弹衣吧!
评论