Tomcat依赖Java环境,需先安装JDK 11及以上版本(推荐OpenJDK或Oracle JDK)。通过以下命令检查Java版本:
java -version
若未安装,使用包管理器安装(如CentOS):
sudo yum install -y java-11-openjdk-devel
从Apache Tomcat官网下载最新稳定版(如9.0.x或10.1.x),解压至专用目录(如/opt/tomcat):
tar -xzf apache-tomcat-9.0.xx.tar.gz -C /opt/
mv /opt/apache-tomcat-9.0.xx /opt/tomcat
编辑/etc/profile文件,添加Tomcat环境变量:
export CATALINA_HOME=/opt/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
使变量生效:
source /etc/profile
避免以root用户运行Tomcat,创建无sudo权限的专用用户(如tomcat):
sudo useradd -r -m -d /opt/tomcat -s /bin/false tomcat
sudo passwd tomcat # 设置密码
将Tomcat目录所有权赋予tomcat用户,限制其他用户访问:
sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod -R 750 /opt/tomcat # 目录权限:所有者可读写执行,组可读执行,其他无权限
若系统启用SELinux(sestatus显示enabled),需调整上下文以允许Tomcat运行:
sudo chcon -R -t httpd_sys_content_t /opt/tomcat # 应用内容类型
sudo chcon -R -t httpd_sys_rw_content_t /opt/tomcat/logs # 日志目录需可写
持久化SELinux策略(可选):
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
sudo reboot
编辑Tomcat服务文件(/etc/systemd/system/tomcat.service),指定运行用户:
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
重新加载systemd并启动Tomcat:
sudo systemctl daemon-reload
sudo systemctl start tomcat
sudo systemctl enable tomcat
Tomcat默认包含manager(应用管理)和host-manager(主机管理)应用,生产环境需禁用:
sudo rm -rf /opt/tomcat/webapps/manager /opt/tomcat/webapps/host-manager
修改server.xml(/opt/tomcat/conf/server.xml),在Connector标签中添加server属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
server="CustomTomcat/1.0" /> # 掩盖真实版本
生成自签名证书(或从CA获取)并配置HTTPS连接器:
# 生成私钥和证书(有效期3650天)
sudo keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -validity 3650 \
-keystore /opt/tomcat/conf/tomcat.keystore -storepass changeit -keypass changeit
编辑server.xml,添加HTTPS连接器:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true"
scheme="https" secure="true"
keystoreFile="/opt/tomcat/conf/tomcat.keystore"
keystorePass="changeit"
clientAuth="false" sslProtocol="TLS" />
重启Tomcat使配置生效:
sudo systemctl restart tomcat
编辑manager/META-INF/context.xml(/opt/tomcat/webapps/manager/META-INF/context.xml),通过RemoteAddrValve限制IP访问:
<Context antiResourceLocking="false" privileged="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.1\.\d+|127\.0\.0\.1" /> # 仅允许内网IP或本地访问
</Context>
编辑tomcat-users.xml(/opt/tomcat/conf/tomcat-users.xml),定义角色和用户:
<tomcat-users>
<!-- 管理员角色:可访问管理界面 -->
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<!-- 应用角色:可访问特定应用 -->
<role rolename="app-user"/>
<!-- 用户分配角色 -->
<user username="admin" password="SecurePass123!" roles="admin-gui,manager-gui"/>
<user username="app_user" password="AppPass456!" roles="app-user"/>
</tomcat-users>
在应用的WEB-INF/web.xml中添加安全约束(如限制/admin/*路径):
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Admin Area</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name> <!-- 需匹配tomcat-users.xml中的角色 -->
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee> <!-- 强制HTTPS -->
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method> <!-- 基本认证 -->
<realm-name>Tomcat Application Realm</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
server.xml中的AJP连接器:<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
server.xml,关闭autoDeploy和unpackWARs:<Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false">
server.xml,添加AccessLogValve:<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b %D" /> # 记录IP、用户、时间、请求、状态、响应时间
catalina.out和localhost_access_log,查找异常访问(如大量404、403错误)。关注Apache Tomcat官网的安全公告,及时升级至最新稳定版,修复已知漏洞:
# 备份旧版本
sudo tar -czf /opt/tomcat_backup_$(date +%F).tar.gz /opt/tomcat
# 下载并解压新版本
tar -xzf apache-tomcat-9.0.yy.tar.gz -C /opt/
mv /opt/apache-tomcat-9.0.yy /opt/tomcat
# 重启服务
sudo systemctl restart tomcat
定期备份conf/(配置文件)、webapps/(应用)、logs/(日志)目录,存储至安全位置:
sudo tar -czf /backup/tomcat_$(date +%F).tar.gz /opt/tomcat/conf /opt/tomcat/webapps /opt/tomcat/logs
通过以上步骤,可显著提升Linux环境下Tomcat的安全性,降低被攻击的风险。需根据实际业务需求调整配置(如IP白名单、角色权限),并定期进行安全审计。