Tomcat作为轻量级Java Servlet容器,其安全配置需覆盖身份鉴别、访问控制、传输加密、系统权限、应用防护等多个维度。以下是针对CentOS系统的具体安全措施:
webapps目录下的所有默认应用(如docs、examples、host-manager、manager、ROOT),避免暴露不必要的页面和功能。rm -rf /opt/tomcat/webapps/*
conf/tomcat-users.xml中的所有用户及角色定义,防止未授权访问管理界面。<!-- <tomcat-users>...</tomcat-users> -->
conf/server.xml中的Connector节点,添加server属性,掩盖Tomcat版本,降低针对性攻击风险。<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
server="CustomTomcat/1.0" />
tomcat),并赋予Tomcat目录所有权,禁止以root身份运行。useradd -r -m -d /opt/tomcat -s /sbin/nologin tomcat
chown -R tomcat:tomcat /opt/tomcat
/etc/systemd/system/tomcat.service,在[Service]部分指定用户和组,确保进程以低权限运行。[Service]
User=tomcat
Group=tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
tomcat-users.xml中添加用户时,设置强口令(长度≥8位,包含大小写字母、数字、特殊字符),并为不同角色分配最小必要权限。<tomcat-users>
<role rolename="admin-gui"/> <!-- 仅管理界面权限 -->
<role rolename="manager-gui"/> <!-- 仅应用管理权限 -->
<user username="admin" password="ComplexPwd123!" roles="admin-gui,manager-gui"/>
</tomcat-users>
firewalld开放Tomcat端口(如8080、8443),并限制访问源IP(如仅允许内网IP)。sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8443/tcp --permanent
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8080" protocol="tcp" accept' --permanent
sudo firewall-cmd --reload
conf/server.xml的<Host>节点内添加RemoteAddrValve,限制管理界面的访问IP。<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|192\.168\.1\.\d+" />
conf/server.xml中的AJP Connector,减少攻击面。<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
openssl req -newkey rsa:2048 -nodes -keyout /etc/pki/tls/private/tomcat.key \
-x509 -days 365 -out /etc/pki/tls/certs/tomcat.crt
conf/server.xml,添加SSL Connector,强制HTTPS访问。<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" scheme="https" secure="true"
keystoreFile="/etc/pki/tls/certs/tomcat.crt"
keystorePass="your_keystore_password"
clientAuth="false" sslProtocol="TLS" />
conf/web.xml中添加安全约束,强制所有流量通过HTTPS。<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Context</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
conf/server.xml中的<Host>节点,禁用自动部署,防止恶意WAR文件上传。<Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false">
conf/web.xml,将DefaultServlet的listings参数设为false,避免目录结构泄露。<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
context.xml中为会话Cookie添加HttpOnly和Secure属性,防止XSS窃取会话。<Context sessionCookieHttpOnly="true" sessionCookieSecure="true">
conf/server.xml的<Host>节点内添加AccessLogValve,记录访问源IP、时间、请求方法等信息。<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log."
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
logrotate工具定期归档日志,通过grep、awk等命令分析异常访问(如频繁的404错误、异地IP登录)。# 示例:查找24小时内失败的登录尝试
grep "401" /opt/tomcat/logs/catalina.out | grep "$(date -d '1 day ago' '+%d/%b/%Y')" | awk '{print $11}' | sort | uniq -c | sort -nr
permissive模式(生产环境建议保持enforcing并配置正确策略)。setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
yum update tomcat # 若通过yum安装
# 或手动下载最新版本替换旧文件
以上措施覆盖了Tomcat在CentOS环境中的核心安全需求,需根据实际业务场景调整(如管理界面IP白名单、证书有效期等)。安全配置需定期复查,确保应对新的威胁。