Tomcat安全加固需构建操作系统、JVM、应用三层隔离沙箱:系统层通过systemd限制权限与网络;JVM层启用SecurityManager并配置细粒度策略;应用层精简组件、强制认证、隐藏版本、禁用远程关闭端口,并实施用户分离与多实例隔离。

Tomcat 服务的安全加固,不是简单关掉几个端口或删掉示例应用,而是构建一套分层隔离的权限沙箱环境——从操作系统级进程沙箱,到 JVM 级 SecurityManager 控制,再到应用层访问约束,三者协同才能真正堵住常见攻击路径。
系统级:用 systemd 实现最小权限启动
即使 Tomcat 进程以 root 启动,也不意味着它该拥有全部系统权限。通过 systemd 单元配置可强制其“视而不见”关键路径:
- ProtectSystem=strict:让 /usr、/boot、/etc 只读,防止恶意覆盖二进制或配置文件
- PrivateTmp=yes:为 Tomcat 分配独立 /tmp 和 /var/tmp,避免临时文件被其他进程窥探或污染
- NoNewPrivileges=yes:禁止 execve() 提权(如运行 setuid 程序),切断本地提权链
- PrivateNetwork=yes:启用独立网络命名空间,仅保留 lo 接口,真实网卡和主机端口对其不可见
- RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6:显式放行所需协议族,禁用 AF_NETLINK 等高危类型
- CapabilityBoundingSet=CAP_NET_BIND_SERVICE:若需监听 80/443,只授此能力,不给 CAP_SYS_ADMIN
JVM 级:启用 SecurityManager 限制代码行为
当部署不可信 Web 应用(如允许用户上传 JSP 或 Servlet)时,SecurityManager 是最后一道防线:
- 在 catalina.sh 中添加:
JAVA_OPTS="$JAVA_OPTS -Djava.security.manager -Djava.security.policy==/path/to/catalina.policy" - 策略文件中按需授权,例如:
permission java.net.SocketPermission "example.com:80", "connect"; - 禁止危险操作:
permission java.lang.RuntimePermission "exitVM";阻止System.exit(1)类攻击 - 限制文件访问:
permission java.io.FilePermission "/opt/tomcat/webapps/-", "read";,禁止写入或遍历上级目录
应用级:精简默认组件 + 强制认证 + 隐藏信息
生产环境必须剥离所有非必要暴露面,并确保剩余接口受控:
- 清空 webapps/ 下的 docs、examples、manager、host-manager 目录(或重命名后移出 webapps)
- 修改 conf/tomcat-users.xml,仅保留最小必需角色与强密码用户,禁用默认 admin/admin
- 在 conf/web.xml 中配置安全约束,例如限制 /manager/* 必须有 manager-gui 角色
- 隐藏版本号:修改 conf/server.xml 的 Server 标签,设
server=" " protocol=" ";并修改 lib/catalina.jar 中的ServerInfo.properties - 关闭远程关闭端口:
<server port="-1" shutdown="SHUTDOWN"></server>(port 设为 -1 即禁用)
运行时隔离:用户分离与多实例隔离
避免单点失陷导致全局沦陷,关键在于资源归属与边界清晰:
- 创建专用低权限用户(如 tomcat:tomcat),不赋予 shell 登录权限,所有 Tomcat 文件属主设为此用户
- 项目 war 包解压后的 webapps/ 目录属主应与 Tomcat 运行用户不同(如 app:app),防止 webshell 修改自身代码
- 多应用部署推荐多实例模式:每个实例独占 conf、logs、work、temp 目录,server.xml 中修改 Server port、Connector port、AJP port,避免端口冲突与配置混用

















