Tomcat常用设置及安全管理规范

1. 概述

1.1 安全规范的重要性

随着企业使用Tomcat作为Web应用服务器的规模越来越大,Tomcat安全配置规范成为保障系统安全的关键环节。合理的安全配置可以防止信息泄露、恶意攻击,确保生产环境的稳定运行。

安全规范的价值

  • 防止信息泄露:隐藏版本信息、错误信息
  • 防止恶意攻击:限制访问、禁用危险功能
  • 合规要求:满足等保、合规审计要求
  • 运维规范:统一配置标准,便于管理

1.2 安全规范分类

强制规范:必须执行,不执行会导致安全风险

  • telnet管理端口保护
  • 禁用管理端
  • 降权启动
  • 文件列表访问控制
  • 版本信息隐藏

推荐规范:建议执行,提升安全性和性能

  • AJP连接端口保护
  • Server header重写
  • 访问限制
  • 起停脚本权限回收
  • 访问日志格式规范

可选规范:根据业务需求选择

  • 访问限制(IP白名单)
  • 压缩管理

1.3 本文内容结构

本文将从以下几个方面详细介绍Tomcat安全配置规范:

  1. Tomcat安装规范:用户设置、安装、配置
  2. 安全设置规范:12项安全配置规范
  3. 配置示例:完整的配置模板
  4. 安全检查清单:安全配置检查项
  5. 故障排查:常见问题和解决方案
  6. 生产环境最佳实践:运维安全建议

2. Tomcat安装规范

2.1 Tomcat用户设置

2.1.1 创建专用用户

安全原则:不要使用root用户运行Tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建Tomcat专用用户
useradd -d /tomcat -u 501 tomcat

# 设置密码
passwd tomcat

# 切换到tomcat用户
su - tomcat

# 验证用户信息
id tomcat

# 查看当前目录
pwd

输出示例

1
2
uid=501(tomcat) gid=501(tomcat) groups=501(tomcat)
/tomcat

2.1.2 用户权限设置

1
2
3
4
5
# 设置用户主目录权限
chown -R tomcat.tomcat /tomcat

# 设置目录权限
chmod 755 /tomcat

最佳实践

  • 使用专用用户运行Tomcat
  • 用户ID建议使用固定值(如501)
  • 设置强密码
  • 限制用户登录权限(使用nologin shell)

2.2 Tomcat安装

2.2.1 下载和验证

1
2
3
4
5
6
7
8
9
10
11
# 切换到tomcat用户
su - tomcat

# 下载Tomcat
wget ftp://10.6.9.111/soft/apache-tomcat-6.0.35.tgz

# 下载MD5校验文件
wget ftp://10.6.9.111/soft/apache-tomcat-6.0.35.tgz.md5

# 验证文件完整性
md5sum -c apache-tomcat-6.0.35.tgz.md5

输出示例

1
apache-tomcat-6.0.35.tgz: OK

2.2.2 安装JDK

1
2
3
4
5
6
7
8
9
10
11
12
# 下载JDK
wget ftp://10.6.9.111/soft/jdk1.6.0_22.tgz

# 下载MD5校验文件
wget ftp://10.6.9.111/soft/jdk1.6.0_22.tgz.md5

# 验证文件完整性
md5sum -c jdk1.6.0_22.tgz.md5

# 解压
tar xzf apache-tomcat-6.0.35.tgz
tar xzf jdk1.6.0_22.tgz

安全建议

  • 验证文件MD5值,确保文件完整性
  • 从官方或可信源下载
  • 使用固定版本,避免随意升级

2.3 Tomcat配置

2.3.1 环境变量配置

编辑.bash_profile

1
vim ~/.bash_profile

添加以下内容

1
2
3
4
export JAVA_HOME=/tomcat/jdk1.6.0_22
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/tomcat/apache-tomcat-6.0.35

使环境变量生效

1
2
3
4
source ~/.bash_profile

# 验证Java环境
java -version

输出示例

1
2
3
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

2.3.2 目录权限设置

1
2
3
4
5
6
7
# 设置Tomcat目录所有者
chown -R tomcat.tomcat /tomcat/apache-tomcat-6.0.35

# 设置目录权限
chmod 755 /tomcat/apache-tomcat-6.0.35
chmod 750 /tomcat/apache-tomcat-6.0.35/bin
chmod 640 /tomcat/apache-tomcat-6.0.35/conf/*.xml

2.4 应用程序配置

2.4.1 应用目录结构

1
2
3
4
5
6
# 创建应用目录
mkdir -p /tomcat/webapps

# 创建应用子目录(示例)
mkdir -p /tomcat/webapps/wmw_tuan # 团购应用
mkdir -p /tomcat/webapps/wmw_static # 静态化应用

2.4.2 修改server.xml配置

编辑server.xml

1
vim /tomcat/apache-tomcat-6.0.35/conf/server.xml

配置Context

1
2
3
4
5
6
7
8
9
10
11
12
13
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- 团购应用 -->
<Context path="/tuan"
docBase="/tomcat/webapps/wmw_tuan"
reloadable="false"/>

<!-- 静态化应用 -->
<Context path="/static"
docBase="/tomcat/webapps/wmw_static"
reloadable="false"/>
</Host>

2.5 启动Tomcat

2.5.1 启动命令

1
2
3
# 使用tomcat用户启动
su - tomcat
/tomcat/apache-tomcat-6.0.35/bin/startup.sh

启动输出

1
2
3
4
5
Using CATALINA_BASE:   /tomcat/apache-tomcat-6.0.35
Using CATALINA_HOME: /tomcat/apache-tomcat-6.0.35
Using CATALINA_TMPDIR: /tomcat/apache-tomcat-6.0.35/temp
Using JRE_HOME: /tomcat/jdk1.6.0_22
Using CLASSPATH: /tomcat/apache-tomcat-6.0.35/bin/bootstrap.jar

2.5.2 验证启动

1
2
3
4
5
6
7
8
# 检查进程
ps -ef | grep [j]ava

# 检查端口
netstat -tunlp | grep java

# 查看日志
tail -f /tomcat/apache-tomcat-6.0.35/logs/catalina.out

3. 安全设置规范

3.1 Telnet管理端口保护(强制)

3.1.1 风险说明

风险

  • Tomcat默认使用8005端口作为shutdown端口
  • 可以通过telnet连接该端口发送shutdown命令关闭Tomcat
  • 如果端口暴露,可能被恶意关闭服务

3.1.2 配置方法

编辑server.xml

1
2
3
4
5
<!-- 修改前(默认配置) -->
<Server port="8005" shutdown="SHUTDOWN">

<!-- 修改后(安全配置) -->
<Server port="8527" shutdown="dangerous">

配置说明

  • port:修改为非常用端口(如8527)
  • shutdown:修改为复杂字符串(如”dangerous”)

3.1.3 防火墙保护

1
2
3
4
5
6
7
8
# 只允许本地访问shutdown端口
iptables -A INPUT -p tcp --dport 8527 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 8527 -j DROP

# 或使用firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="8527" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="8527" drop'
firewall-cmd --reload

3.1.4 验证方法

1
2
3
4
5
6
# 测试shutdown端口(应该失败)
telnet localhost 8527
echo "dangerous" | telnet localhost 8527

# 检查防火墙规则
iptables -L -n | grep 8527

3.2 AJP连接端口保护(推荐)

3.2.1 风险说明

风险

  • AJP端口(默认8009)用于与Apache等Web服务器集成
  • 如果不需要AJP,应该禁用或限制访问

3.2.2 配置方法

方法1:禁用AJP(如果不需要)

1
2
3
4
<!-- 注释掉AJP Connector -->
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->

方法2:限制AJP访问IP

1
2
3
4
5
<!-- 只允许本地访问 -->
<Connector port="8528"
protocol="AJP/1.3"
address="127.0.0.1"
redirectPort="8443" />

方法3:修改端口和协议

1
2
3
4
<!-- 修改为非常用端口 -->
<Connector port="8528"
protocol="AJP/1.3"
redirectPort="8443" />

3.2.3 防火墙保护

1
2
3
# 只允许本地访问AJP端口
iptables -A INPUT -p tcp --dport 8528 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 8528 -j DROP

3.3 禁用管理端(强制)

3.3.1 风险说明

风险

  • Manager和Host Manager应用可能被利用
  • 可以上传WAR包、部署应用
  • 可能泄露服务器信息

3.3.2 配置方法

方法1:删除管理应用(推荐)

1
2
3
4
5
6
# 删除Manager应用
rm -rf /tomcat/apache-tomcat-6.0.35/webapps/manager
rm -rf /tomcat/apache-tomcat-6.0.35/webapps/host-manager

# 删除管理用户配置
rm -f /tomcat/apache-tomcat-6.0.35/conf/tomcat-users.xml

方法2:限制访问IP

1
2
# 编辑Manager应用的context.xml
vim /tomcat/apache-tomcat-6.0.35/webapps/manager/META-INF/context.xml

配置内容

1
2
3
4
<Context antiResourceLocking="false" privileged="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.1\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>
</Context>

同样配置Host Manager

1
vim /tomcat/apache-tomcat-6.0.35/webapps/host-manager/META-INF/context.xml

3.4 降权启动(强制)

3.4.1 风险说明

风险

  • 使用root用户运行Tomcat存在安全风险
  • 如果被攻击,可能获得root权限

3.4.2 配置方法

创建专用用户

1
2
3
4
5
6
7
8
# 创建tomcat用户
useradd -r -s /sbin/nologin -d /tomcat tomcat

# 设置目录所有者
chown -R tomcat.tomcat /tomcat

# 使用tomcat用户启动
su - tomcat -c "/tomcat/apache-tomcat-6.0.35/bin/startup.sh"

使用systemd服务(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建systemd服务文件
cat > /etc/systemd/system/tomcat.service << 'EOF'
[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/tomcat/jdk1.6.0_22"
Environment="CATALINA_HOME=/tomcat/apache-tomcat-6.0.35"
ExecStart=/tomcat/apache-tomcat-6.0.35/bin/startup.sh
ExecStop=/tomcat/apache-tomcat-6.0.35/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl start tomcat
systemctl enable tomcat

3.5 文件列表访问控制(强制)

3.5.1 风险说明

风险

  • 默认情况下,访问目录会显示文件列表
  • 可能泄露目录结构和文件信息

3.5.2 配置方法

编辑web.xml

1
vim /tomcat/apache-tomcat-6.0.35/conf/web.xml

修改DefaultServlet配置

1
2
3
4
5
6
7
8
9
<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>
<load-on-startup>1</load-on-startup>
</servlet>

或在应用WEB-INF/web.xml中配置

1
2
3
4
5
6
7
8
<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>

3.5.3 验证方法

1
2
# 访问目录(应该返回403或404,而不是文件列表)
curl http://localhost:8080/

3.6 版本信息隐藏(强制)

3.6.1 风险说明

风险

  • 默认错误页面会显示Tomcat版本信息
  • 攻击者可以根据版本信息查找对应的漏洞

3.6.2 配置方法

方法1:修改server.xml(隐藏Server信息)

1
2
3
4
5
6
7
<!-- 修改前 -->
<Connector port="8080" protocol="HTTP/1.1">

<!-- 修改后 -->
<Connector port="8080"
protocol="HTTP/1.1"
server="webserver">

方法2:自定义错误页面

编辑web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 配置错误页面 -->
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>

<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>

<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>

创建错误页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 创建错误页面目录
mkdir -p /tomcat/webapps/ROOT

# 创建403错误页面
cat > /tomcat/webapps/ROOT/forbidden.jsp << 'EOF'
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<h1>403 Forbidden</h1>
<p>Access Denied</p>
</body>
</html>
EOF

# 创建404错误页面
cat > /tomcat/webapps/ROOT/notfound.jsp << 'EOF'
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
<p>The requested resource was not found.</p>
</body>
</html>
EOF

# 创建500错误页面
cat > /tomcat/webapps/ROOT/systembusy.jsp << 'EOF'
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>500 Internal Server Error</title>
</head>
<body>
<h1>500 Internal Server Error</h1>
<p>System is busy, please try again later.</p>
</body>
</html>
EOF

注意:每个项目工程目录下都要各自建立相应的错误页面。

3.7 Server Header重写(推荐)

3.7.1 风险说明

风险

  • HTTP响应头中的Server字段会暴露Tomcat版本信息
  • 攻击者可以根据版本信息查找漏洞

3.7.2 配置方法

编辑server.xml

1
2
3
<Connector port="8080" 
protocol="HTTP/1.1"
server="webserver">

配置说明

  • server属性:自定义Server响应头
  • 可以设置为任意字符串,如”webserver”、”nginx”等

3.7.3 验证方法

1
2
3
4
5
6
7
# 查看响应头
curl -I http://localhost:8080/

# 应该显示
# Server: webserver
# 而不是
# Server: Apache-Coyote/1.1

3.8 访问限制(可选)

3.8.1 配置说明

适用场景

  • 内网应用,只允许特定IP访问
  • 管理接口,限制访问来源

3.8.2 配置方法

Tomcat 6配置

1
2
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.1\.\d+|127\.\d+\.\d+\.\d+"/>

Tomcat 8配置

1
2
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.234\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>

配置说明

  • allow:允许访问的IP正则表达式
  • 支持IPv4和IPv6
  • 可以使用deny拒绝特定IP

完整示例

1
2
3
4
5
6
7
<!-- 允许本地回环地址及192.168.234.0网段访问 -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.234\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>

<!-- 或拒绝特定IP -->
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
deny="192\.168\.1\.100"/>

3.9 起停脚本权限回收(推荐)

3.9.1 风险说明

风险

  • 起停脚本如果权限过大,可能被恶意利用
  • 其他用户不应该有执行权限

3.9.2 配置方法

1
2
3
4
5
6
7
8
# 设置bin目录权限
chmod 750 /tomcat/apache-tomcat-6.0.35/bin

# 设置脚本权限(只有所有者可执行)
chmod 744 /tomcat/apache-tomcat-6.0.35/bin/*.sh

# 或使用递归方式
chmod -R 744 /tomcat/apache-tomcat-6.0.35/bin/*

权限说明

  • 744:所有者可读可写可执行,组用户和其他用户只读
  • 750:所有者可读可写可执行,组用户可读可执行,其他用户无权限

3.10 访问日志格式规范(推荐)

3.10.1 配置说明

标准日志格式

  • 包含客户端IP、访问时间、请求方法、状态码、响应大小
  • 包含Referer和User-Agent
  • 包含响应时间

3.10.2 配置方法

编辑server.xml

1
2
3
4
5
6
<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 %D"
resolveHosts="false"/>

日志格式说明

  • %h:远程主机名或IP
  • %l:远程逻辑用户名(通常为-)
  • %u:远程用户(通常为-)
  • %t:访问时间
  • %r:请求的第一行
  • %s:HTTP状态码
  • %b:发送的字节数
  • %{Referer}i:Referer头
  • %{User-Agent}i:User-Agent头
  • %D:处理请求的时间(微秒)
  • resolveHosts="false":不解析主机名,提高性能

日志示例

1
192.168.1.100 - - [23/Mar/2019:10:15:32 +0800] "GET /index.jsp HTTP/1.1" 200 1234 "http://example.com" "Mozilla/5.0" 12345

3.11 屏蔽DNS查询

3.11.1 配置说明

enableLookups参数

  • 如果为true,调用request.getRemoteHost()会执行DNS查询
  • 如果为false,直接返回IP地址
  • 建议设置为false,提高性能

3.11.2 配置方法

编辑server.xml

1
2
3
<Connector port="8080" 
protocol="HTTP/1.1"
enableLookups="false"/>

配置说明

  • enableLookups="false":禁用DNS查询
  • 提高性能,减少DNS查询开销
  • 直接返回IP地址

3.12 压缩管理

3.12.1 配置说明

压缩功能

  • Tomcat支持gzip压缩
  • 可以减少网络传输量
  • 如果前端使用Nginx,一般不需要启用Tomcat压缩

3.12.2 配置方法

编辑server.xml

1
2
3
4
5
6
<Connector port="8080" 
protocol="HTTP/1.1"
compression="on"
compressionMinSize="50"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>

参数说明

  • compression="on":启用压缩
  • compressionMinSize="50":最小压缩大小(字节)
  • noCompressionUserAgents:不压缩的User-Agent
  • compressableMimeType:可压缩的MIME类型

建议

  • 如果使用Nginx作为反向代理,在Nginx层启用压缩
  • Tomcat层不启用压缩,减少CPU消耗

4. 附录:建议配置及标准执行方案

4.1 server.xml标准配置

完整server.xml配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?xml version='1.0' encoding='utf-8'?>
<Server port="8527" shutdown="dangerous">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>

<Service name="Catalina">
<!-- HTTP Connector -->
<Connector port="8080"
protocol="HTTP/1.1"
server="webserver"
enableLookups="false"
connectionTimeout="20000"
redirectPort="8443" />

<!-- AJP Connector (可选,如果不需要可以注释) -->
<Connector port="8528"
protocol="AJP/1.3"
address="127.0.0.1"
redirectPort="8443" />

<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- 访问日志 -->
<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 %D"
resolveHosts="false"/>

<!-- 访问限制(可选) -->
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.1\.\d+|127\.\d+\.\d+\.\d+"/>
-->

<!-- Context配置 -->
<Context path=""
docBase="/home/work/local/tomcat_webapps"
debug="0"
reloadable="false"
crossContext="true"/>
</Host>
</Engine>
</Service>
</Server>

4.2 web.xml标准配置

完整web.xml配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

<!-- 禁用文件列表 -->
<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>
<load-on-startup>1</load-on-startup>
</servlet>

<!-- 错误页面配置 -->
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>

<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>

<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>

<!-- Session配置 -->
<session-config>
<session-timeout>30</session-timeout>
<cookie-config>
<http-only>true</http-only>
<secure>false</secure>
</cookie-config>
</session-config>

<!-- 安全配置 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
</security-constraint>
</web-app>

4.3 删除默认文件和目录

4.3.1 删除默认应用

1
2
3
4
5
6
7
8
# 删除示例应用
rm -rf /tomcat/apache-tomcat-6.0.35/webapps/examples
rm -rf /tomcat/apache-tomcat-6.0.35/webapps/docs
rm -rf /tomcat/apache-tomcat-6.0.35/webapps/manager
rm -rf /tomcat/apache-tomcat-6.0.35/webapps/host-manager

# 删除ROOT默认页面(如果不需要)
# rm -rf /tomcat/apache-tomcat-6.0.35/webapps/ROOT

4.3.2 删除管理用户配置

1
2
3
4
5
# 删除tomcat-users.xml(如果不需要管理功能)
rm -f /tomcat/apache-tomcat-6.0.35/conf/tomcat-users.xml

# 或清空内容
cat /dev/null > /tomcat/apache-tomcat-6.0.35/conf/tomcat-users.xml

4.4 权限设置

4.4.1 目录权限

1
2
3
4
5
6
7
8
9
# 设置目录所有者
chown -R tomcat.tomcat /tomcat/apache-tomcat-6.0.35

# 设置目录权限
chmod 755 /tomcat/apache-tomcat-6.0.35
chmod 750 /tomcat/apache-tomcat-6.0.35/bin
chmod 750 /tomcat/apache-tomcat-6.0.35/conf
chmod 640 /tomcat/apache-tomcat-6.0.35/conf/*.xml
chmod 640 /tomcat/apache-tomcat-6.0.35/conf/*.properties

4.4.2 脚本权限

1
2
3
4
5
# 设置脚本权限(只有所有者可执行)
chmod 744 /tomcat/apache-tomcat-6.0.35/bin/*.sh

# 或使用递归方式
chmod -R 744 /tomcat/apache-tomcat-6.0.35/bin/*

5. 安全检查清单

5.1 安装规范检查

  • 使用专用用户运行Tomcat(非root)
  • 用户主目录权限正确设置
  • 环境变量正确配置
  • 应用目录结构规范

5.2 安全配置检查

  • Shutdown端口已修改并保护
  • AJP端口已限制或禁用
  • 管理端已禁用或限制访问
  • 文件列表访问已禁用
  • 版本信息已隐藏
  • Server header已重写
  • DNS查询已禁用
  • 访问日志格式规范

5.3 权限检查

  • 目录权限正确设置
  • 配置文件权限正确设置
  • 脚本权限正确设置
  • 日志文件权限正确设置

5.4 文件检查

  • 默认应用已删除
  • 管理用户配置已删除或清空
  • 错误页面已配置

5.5 防火墙检查

  • Shutdown端口已限制访问
  • AJP端口已限制访问
  • HTTP端口访问控制(如需要)

6. 故障排查

6.1 常见问题

6.1.1 权限问题

问题:Tomcat无法启动或无法写入日志

排查

1
2
3
4
5
6
7
8
# 检查目录权限
ls -ld /tomcat/apache-tomcat-6.0.35

# 检查文件权限
ls -l /tomcat/apache-tomcat-6.0.35/bin/*.sh

# 检查日志目录权限
ls -ld /tomcat/apache-tomcat-6.0.35/logs

解决

1
2
3
4
# 设置正确的权限
chown -R tomcat.tomcat /tomcat/apache-tomcat-6.0.35
chmod 755 /tomcat/apache-tomcat-6.0.35
chmod 750 /tomcat/apache-tomcat-6.0.35/bin

6.1.2 端口冲突

问题:Tomcat启动失败,提示端口被占用

排查

1
2
3
# 检查端口占用
netstat -tunlp | grep 8080
lsof -i:8080

解决

1
2
# 修改server.xml中的端口
# 或停止占用端口的进程

6.1.3 配置错误

问题:Tomcat启动失败,配置文件错误

排查

1
2
3
4
5
# 检查配置文件语法
/tomcat/apache-tomcat-6.0.35/bin/catalina.sh configtest

# 查看错误日志
tail -f /tomcat/apache-tomcat-6.0.35/logs/catalina.out

7. 生产环境最佳实践

7.1 安全最佳实践

  1. 最小权限原则:使用专用用户,最小权限
  2. 定期更新:及时更新Tomcat版本,修复安全漏洞
  3. 监控告警:配置监控和告警,及时发现异常
  4. 日志审计:保留访问日志,定期审计
  5. 备份恢复:定期备份配置和数据

7.2 性能最佳实践

  1. JVM调优:根据服务器资源合理配置JVM参数
  2. 连接器优化:根据并发量调整线程数
  3. 压缩配置:如果使用Nginx,在Nginx层启用压缩
  4. 静态资源分离:使用Nginx处理静态资源

7.3 运维最佳实践

  1. 配置管理:使用配置管理工具(Ansible、Puppet)
  2. 版本控制:配置文件纳入版本控制
  3. 标准化部署:统一部署流程和配置标准
  4. 文档维护:维护配置文档和变更记录

8. 总结

8.1 核心要点

  1. 安装规范:使用专用用户,规范目录结构
  2. 安全配置:12项安全配置规范
  3. 权限管理:最小权限原则
  4. 日志配置:规范日志格式
  5. 错误处理:自定义错误页面

8.2 架构师建议

  1. 安全第一:所有强制规范必须执行
  2. 定期审计:定期进行安全检查
  3. 持续改进:根据安全威胁更新配置
  4. 文档维护:维护安全配置文档

8.3 最佳实践

  1. 标准化:统一配置标准
  2. 自动化:使用自动化工具部署
  3. 监控化:配置监控和告警
  4. 文档化:维护完整的配置文档

相关文章