在 Debian 上配置 Tomcat 安全,通常从 系统层面 + Tomcat 自身配置 + 应用层面 三个维度来做。下面以 Tomcat 9(Debian 11/12) 为例,给出一套生产环境常用安全配置清单。
Tomcat 绝对不要用 root 启动。
sudo useradd -r -m -U -d /opt/tomcat -s /bin/false tomcat
sudo chown -R tomcat:tomcat /opt/tomcat
启动方式:
sudo -u tomcat /opt/tomcat/bin/startup.sh
✅ 使用 systemd 时自动生效(见下文)
/etc/systemd/system/tomcat.service 示例:
[Unit]
Description=Apache Tomcat
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_BASE=/opt/tomcat"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
# 安全限制
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now tomcat
默认示例应用存在漏洞风险:
rm -rf /opt/tomcat/webapps/ROOT
rm -rf /opt/tomcat/webapps/docs
rm -rf /opt/tomcat/webapps/examples
rm -rf /opt/tomcat/webapps/host-manager
rm -rf /opt/tomcat/webapps/manager
✅ 若不需要管理后台,全部删除
编辑:
vim /opt/tomcat/conf/server.xml
注释或删除:
<!--
<Connector protocol="AJP/1.3"
port="8009"
redirectPort="8443" />
-->
✅ 现代环境(Nginx / 直接 HTTPS)基本不需要 AJP
避免暴露 8080:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
改为:
<Connector port="18080" ... />
编辑 conf/web.xml:
<servlet>
<servlet-name>default</servlet-name>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
如果必须保留 manager:
编辑:
vim /opt/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<user username="admin" password="强密码" roles="manager-gui"/>
限制 IP(编辑 context.xml):
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1|192\.168\.1\.\d+"/>
示例(Let’s Encrypt):
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateFile="/etc/letsencrypt/live/example.com/fullchain.pem"
certificateKeyFile="/etc/letsencrypt/live/example.com/privkey.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
HTTP 自动跳转 HTTPS:
<SecurityConstraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</SecurityConstraint>
server.xml:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="access_log"
suffix=".txt"
pattern="combined" />
bin/setenv.sh(没有就新建):
export CATALINA_OPTS="$CATALINA_OPTS \
-Djava.security.egd=file:/dev/./urandom \
-Djdk.tls.ephemeralDHKeySize=2048 \
-Xms512m -Xmx1024m"
sudo apt install ufw
sudo ufw allow 22
sudo ufw allow 443
sudo ufw enable
Tomcat 不对公网直接暴露 8080
apt update && apt upgrade| 项目 | 是否 |
|---|---|
| 非 root 运行 | ✅ |
| 删除默认应用 | ✅ |
| 禁用 AJP | ✅ |
| 禁用目录浏览 | ✅ |
| 使用 HTTPS | ✅ |
| 限制 Manager 访问 | ✅ |
| systemd 安全限制 | ✅ |
| 防火墙 | ✅ |
如果你愿意,我可以:
直接告诉我你的 Tomcat 版本 + Debian 版本 + 是否对外网开放 即可。