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>
⚠️ 生产环境注意:自签名证书只适合测试。生产环境一定要用正规CA签发的证书,比如Let's Encrypt免费证书,或者购买商业证书。浏览器不认自签名证书,用户访问时会看到红色警告。

四、访问控制与认证机制

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安全加固核心框架 Tomcat 安全加固 端口与管理后台 修改默认8080端口 禁用/限制manager后台 HTTP方法限制 禁用PUT/DELETE 禁用TRACE/OPTIONS HTTPS与SSL 配置SSL证书 强制HTTP→HTTPS跳转 访问控制与认证 JDBCRealm配置 密码加密存储 核心原则:减少攻击面 + 加密传输 + 强化认证 = 纵深防御
📌 实战建议:安全加固不是一次性工作。我建议每季度做一次安全审计,检查配置是否被改回、证书是否过期、密码策略是否合规。安全是动态的,不是静态的。

好了,Tomcat安全加固的核心内容就这些。说白了,就是改端口、禁方法、上HTTPS、强认证。这四步做完,你的Tomcat至少能挡住90%的常见攻击。剩下的10%,需要结合WAF、入侵检测等外部手段来防护。

记住,安全没有银弹。但做好基础加固,你已经赢在了起跑线上。


公众号:蓝海资料掘金营,微信deep3321