Tomcat 安全加固实战指南
在生产环境中,Tomcat 的默认配置往往存在诸多安全隐患。作为运维或开发人员,我们需要从端口、权限、信息泄露及访问控制等多个维度进行加固,构建纵深防御体系。
1. 端口暴露面收敛
关闭或修改管理端口 8005 端口是 TCP 的管理端口,用于接收关闭指令。默认端口容易被扫描到,建议修改为不易猜测的高位端口(大于 1024)。
<Server port="8527" shutdown="SHUTDOWN">
AJP 协议保护 8009 端口用于 AJP 协议连接,若未受控可能引发远程代码执行漏洞。优化策略包括修改默认端口并结合防火墙限制访问来源。
<Connector port="8528" protocol="AJP/1.3" redirectPort="8443" secretRequired="true" />
注意:生产环境务必设置
secret属性,防止未授权访问。
2. 管理端与权限控制
清理默认应用与用户
默认安装会包含示例应用和测试账户,应予以移除。删除 conf/tomcat-users.xml 后重启,Tomcat 会生成空配置文件,需手动添加必要的管理员账号并设置强密码。
同时,清理 webapps 目录下所有非必要的目录和文件,减少攻击面。
最小化启动权限 Tomcat 绝不应以 root 用户启动。请创建专用普通用户运行服务,并严格限制该用户对系统目录的读写权限。一旦服务被攻破,可避免黑客直接获取服务器最高权限。
<!-- server.xml 中 Context 配置示例 -->
<Context path="" docBase="/usr/local/tomcat_webapps" debug="0" reloadable="false" crossContext="false"/>
3. 信息泄露防护
禁用目录列表功能
在 conf/web.xml 中,DefaultServlet 的 listings 参数默认为 true,这会导致目录结构暴露。必须将其设置为 false。
<servlet>
<servlet-name>default</servlet-name>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
隐藏版本信息 Tomcat 报错页面常包含版本号,便于攻击者定位漏洞。通过自定义错误页面重定向,可以屏蔽敏感信息。
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/errors/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/jsp/errors/error.jsp</location>
</error-page>
重写响应头 修改 HTTP 响应头中的 Server 字段,避免直接暴露 Tomcat 标识。
server=WebServer
4. 访问控制与审计
IP 白名单限制 对于管理后台或特定接口,建议通过 Valve 组件限定访问 IP 来源,仅允许内网或特定网段访问。
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.*|192.168.10.*" deny="" />
完善日志记录 开启访问日志并记录 Referer 和 User-Agent,有助于后续的安全审计与异常分析。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
通过以上步骤,我们可以显著提升 Tomcat 的基础安全性。当然,安全是一个持续的过程,还需结合 WAF、定期补丁更新等策略共同维护。
