温馨提示×

Linux下Tomcat安全配置

小樊
39
2025-12-10 22:34:18
栏目: 智能运维

Linux下Tomcat安全配置清单

一 运行环境与最小权限

  • 使用非root专用账户运行Tomcat,创建系统用户并设置目录属主,例如:
    • 创建用户:sudo useradd -m -U -r -s /usr/sbin/nologin tomcat
    • 设置目录:sudo chown -R tomcat:tomcat /srv/tomcat
  • systemd托管,限定运行用户与权限掩码,示例:
    • 创建服务文件:/etc/systemd/system/tomcat.service
    • 关键项:User=tomcatGroup=tomcatUMask=0007Restart=always
    • 生效:systemctl daemon-reload && systemctl enable --now tomcat
  • 目录与文件权限建议:目录750、文件640,关键脚本700,如:
    • find /srv/tomcat -type d -exec chmod 750 {} \;
    • find /srv/tomcat -type f -exec chmod 640 {} \;
    • chmod 700 /srv/tomcat/bin/*.sh
  • 如启用SELinux,为日志等目录设置合适上下文(示例):
    • sudo chcon -R -t httpd_sys_content_t /srv/tomcat/webapps
    • sudo chcon -R -t httpd_sys_rw_content_t /srv/tomcat/logs
  • 版本选择建议:优先JDK 11/17(LTS);内存≤2GB的实例可考虑Tomcat 9,需Jakarta EE 9+则选Tomcat 10.1

二 服务与连接器加固

  • 关闭或限制管理接口:
    • 生产环境如无必要,直接删除或禁用webapps/managerwebapps/host-manager
    • 必须保留时,仅开放给内网/IP白名单,在webapps/manager/META-INF/context.xml添加:
      • <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1,192.168.1.0/24" />
    • 精简conf/tomcat-users.xml,仅保留必要角色(如manager-guimanager-scriptmanager-status),并为账户设置强密码
  • 禁用或移除AJP连接器(前端为Nginx/HTTP时通常不需要):
    • server.xml中注释或删除AJP Connector(典型端口8009
  • 保护8005关闭端口与命令:
    • 修改server.xml<Server port="8005" shutdown="复杂随机字符串">,避免被恶意关闭
  • 开启访问日志并优化格式(记录来源、UA等便于审计):
    • <Host>内启用AccessLogValve,示例:
      • <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b %{Referer}i %{User-Agent}i" resolveHosts="false" />
  • 隐藏版本信息:
    • 方式一:在server.xml的Connector上设置server="自定义标识"
    • 方式二:修改lib/catalina.jarorg/apache/catalina/util/ServerInfo.properties,自定义server.infoserver.number
  • 连接器安全与性能基线(示例):
    • 仅开放8080/8443,禁用明文管理端口直连公网
    • 建议配置:protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"maxThreads按规格调优,redirectPort="8443"

三 应用与Web层安全

  • 关闭目录浏览:在conf/web.xmlDefaultServlet中设置
    • <init-param><param-name>listings</param-name><param-value>false</param-value></init-param>
  • 禁用危险HTTP方法:在DefaultServlet中设置
    • <init-param><param-name>readonly</param-name><param-value>true</param-value></init-param>
  • 自定义错误页面,避免信息泄露:
    • <error-page><error-code>404</error-code><location>/404.html</location></error-page>
    • <error-page><error-code>500</error-code><location>/500.html</location></error-page>
  • 会话与Cookie安全:
    • context.xml启用:useHttpOnly="true"
    • web.xml会话配置:cookie-config中设置secure="true"(仅HTTPS传输)
  • 关闭自动部署与热部署(降低被植入风险):
    • server.xml<Host unpackWARs="false" autoDeploy="false" />
  • 删除默认示例与文档应用:清理webapps下的docs/ examples/ ROOT/等。

四 加密通信与访问控制

  • 启用HTTPS/TLS
    • 推荐将8443仅在内网开放,公网通过Nginx/Apache终止TLS
    • 使用Let’s Encrypt证书示例:
      • 转换证书:openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out /srv/tomcat/conf/keystore.p12 -name tomcat -CAfile chain.pem -password pass:YourPass
      • server.xml配置:
        • <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" scheme="https" secure="true">
        • <SSLHostConfig><Certificate certificateKeystoreFile="conf/keystore.p12" type="RSA" certificateKeystorePassword="YourPass"/></SSLHostConfig></Connector>
  • 网络层访问控制:
    • 防火墙仅放行必要来源IP与端口(如仅内网或跳板机可访问管理口/8080)
    • server.xml<Host>或管理应用的context.xml中使用RemoteAddrValve做二次白名单
  • 反向代理前置(Nginx示例要点):
    • 仅暴露80/443,代理到localhost:8080
    • 在代理层配置IP白名单、Basic认证、HSTS、TLS等,进一步降低后端暴露面。

五 审计与运维检查

  • 启动与运行身份核验:
    • ps -ef | grep tomcat 确认进程非root
    • systemctl show tomcat | grep User 与目录权限核对
  • 端口与协议核验:
    • ss -lntp | grep -E '8005|8009|8080|8443'
    • curl -I http://localhost:8080 检查响应头是否泄露版本(Server:字段)
  • 管理接口访问控制核验:
    • 非白名单来源访问/manager/html应被拒绝
    • tomcat-users.xml仅保留必要账户与最小角色
  • 日志与审计:
    • 确认localhost_access_log.*正常滚动,包含Referer/User-Agent
    • 定期审计catalina.out与业务日志的异常堆栈与访问模式
  • 变更与回滚:
    • 修改server.xml/web.xml/context.xml后先备份,滚动重启验证
    • 证书更新后同步更新keystore.p12与配置并重启

如需,我可以按你的Tomcat版本与目录结构,生成可直接替换的配置片段与systemd单元文件。

0