Tomcat安全加固:从默认配置到生产级防护
说实话,Tomcat作为Java应用最常用的Servlet容器,很多团队拿过来就用,默认配置一跑就是好几年。我见过太多生产事故,都是因为Tomcat裸奔导致的。今天咱们就聊聊,怎么给Tomcat穿上防弹衣。
一、默认端口与管理后台修改
Tomcat装好后,默认监听8080端口,管理后台在/manager/html。这两个信息,黑客闭着眼睛都知道。我当年第一次做安全审计时,扫描内网,发现超过60%的Tomcat都用的默认配置,简直像在门上贴了张纸条:「欢迎光临」。
1. 修改默认端口
打开conf/server.xml,找到Connector配置:
<!-- 原配置 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- 修改后 -->
<Connector port="8088" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
我个人习惯把端口改成5位数,比如18080、19090这种,避开常见端口段。为什么要改?你想想看,自动化扫描工具第一个扫的就是8080,改了端口至少能挡住90%的脚本小子。
2. 禁用管理后台
生产环境我建议直接干掉管理后台。在conf/tomcat-users.xml里,把manager相关角色和用户全部注释掉:
<!-- 注释掉所有manager相关配置 -->
<!--
<role rolename="manager-gui"/>
<user username="admin" password="admin123" roles="manager-gui"/>
-->
如果实在需要管理后台,那就限制IP访问。在META-INF/context.xml里加上:
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.1.*|127.0.0.1" />
二、禁用HTTP危险方法(PUT/DELETE)
Tomcat默认开启了所有HTTP方法,包括PUT、DELETE、TRACE这些危险分子。PUT方法允许上传文件,DELETE允许删除资源,这要是被利用了,后果不堪设想。
我记得有个金融客户,他们的Tomcat允许PUT方法,黑客直接上传了一个JSP木马到webapps目录,然后远程执行命令,整个服务器沦陷。嗯,这个案例后来成了我培训时的经典反面教材。
配置方法
在conf/web.xml中,添加如下配置:
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Application</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>TRACE</http-method>
<http-method>OPTIONS</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
配置完后,重启Tomcat,用curl验证一下:
# 测试PUT方法
curl -X PUT http://localhost:8080/test.txt -d "hello"
# 应该返回 403 Forbidden
# 测试DELETE方法
curl -X DELETE http://localhost:8080/test.txt
# 应该返回 403 Forbidden
curl -X OPTIONS http://localhost:8080/ -v查看当前允许的HTTP方法。如果看到PUT、DELETE还在,说明配置没生效。
三、配置HTTPS与SSL证书
明文传输的HTTP,就像在明信片上写密码。HTTPS加密是底线要求,不是可选项。我见过太多开发人员觉得「内网环境不需要HTTPS」,结果被中间人攻击窃取了敏感数据。
1. 生成自签名证书(测试环境)
keytool -genkey -alias tomcat -keyalg RSA -keystore /opt/tomcat/conf/keystore.jks
# 输入密钥库密码:changeit
# 输入名字与姓氏:localhost
# 其他信息可以回车跳过
2. 配置server.xml
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/keystore.jks"
certificateKeystorePassword="changeit"
type="RSA" />
</SSLHostConfig>
</Connector>
3. 强制HTTP跳转HTTPS
在conf/web.xml中添加:
<security-constraint>
<web-resource-collection>
<web-resource-name>All Resources</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
四、访问控制与认证机制
Tomcat的认证机制其实挺灵活的,支持多种Realm实现。我一般推荐使用JDBCRealm,把用户信息存在数据库里,方便统一管理。
1. 配置JDBCRealm
在conf/server.xml的Engine或Host下添加:
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/tomcat_auth?useSSL=false"
connectionName="tomcat_user"
connectionPassword="tomcat_pass"
userTable="users"
userNameCol="username"
userCredCol="password"
userRoleTable="user_roles"
roleNameCol="role_name" />
2. 数据库表结构
CREATE TABLE users (
username VARCHAR(50) NOT NULL PRIMARY KEY,
password VARCHAR(100) NOT NULL
);
CREATE TABLE user_roles (
username VARCHAR(50) NOT NULL,
role_name VARCHAR(50) NOT NULL,
PRIMARY KEY (username, role_name)
);
3. 密码加密存储
千万别存明文密码!用SHA-256或bcrypt加密。Tomcat支持多种摘要算法,配置方式:
<Realm className="org.apache.catalina.realm.JDBCRealm"
...
digest="SHA-256" />
- 密码必须加密存储,推荐bcrypt
- 使用HTTPS传输,防止密码被截获
- 定期更换密码,设置密码复杂度策略
- 最小权限原则:只给应用所需的最小角色
知识体系总览
下面这张图,是我梳理的Tomcat安全加固核心逻辑。说白了,就是围绕「减少攻击面、加密传输、强化认证」这三个维度展开。
好了,Tomcat安全加固的核心内容就这些。说白了,就是改端口、禁方法、上HTTPS、强认证。这四步做完,你的Tomcat至少能挡住90%的常见攻击。剩下的10%,需要结合WAF、入侵检测等外部手段来防护。
记住,安全没有银弹。但做好基础加固,你已经赢在了起跑线上。
公众号:蓝海资料掘金营,微信deep3321