21、Web中间件安全加固
Categories:
5 分钟阅读
定位:Nginx 1.18
1.28 与 Apache Tomcat 710.1 等保三级安全加固手册:先给出通用核查表,再按 Nginx(版本隐藏、目录列表、敏感路径、TLS 与请求限制、日志)与 Tomcat(管理台、shutdown 端口、Server 信息、AJP 连接器、目录列表与会话)分节,每节附配置片段与验证命令。适用:Nginx 1.18
1.28 / Tomcat 710.1;WebLogic、IIS 等按厂商基线与 [02~06 号设备篇] 思路套用。 版本线:Nginx TLS 1.3 需 1.13+ 且 OpenSSL 1.1.1+;Tomcat AJPsecretRequired需 7.0.100 / 8.5.51 / 9.0.31+(更老版本应注释 AJP 或升级);Tomcat 10.1(jakarta.* 包名变更)对本篇配置项无影响。 配套测评:Nginx 安全审计见 35、等保2.0-nginx中间件测评-安全审计;管理台与版本隐藏是测评高频项。使用说明:
- 本文为加固操作手册:所有命令都会修改配置,可能中断服务、断开当前会话或需要重启。实施前必须完成变更审批、确认业务窗口、备份原配置(设备
save与copy running-config/backup startup-configuration,主机备份/etc、注册表与关键业务数据),并准备可执行的回滚预案。- 先在测试环境或单台设备灰度验证,确认无业务影响后再批量推广;每完成一项立即用文中「验证」命令核验生效——配置已下发不等于策略已生效(如 H3C 未
password-control enable、Linux 未对存量账户chage、Windows 未gpupdate /force)。- 示例中的地址、账户名、口令、路径均为演示值(如
PleaseChange@123、192.168.10.20、admin123),现场须替换为符合本单位口令策略与网络规划的真实值,严禁直接沿用文中示例口令;对外发布或归档时须对个人信息与内网管理地址脱敏。- 命令不存在、视图名或参数与本文不一致时,先用
display version/show version/winver确认版本与部署形态,再查阅对应版本官方文档换用等效命令;版本差异不得直接作为「无法整改」的结论,须给出替代措施并评估其实际效果。- 涉及账户、锁定、超时、防火墙与端口收敛的变更存在锁死自身风险:务必保留一条已验证的恢复通道(Console 口、带外管理口、堡垒机会话或另一管理员账户)后再实施。
- 加固完成后按「16、安全评估加固记录表3.0」逐项留痕(整改前后回显、操作人、时间、验证结论、回退情况),并纳入复测;测评判定口径以 GB/T 28448-2019 与《高风险判定指引》为准,本文的「加固要点」不构成最终测评结论。
不适用标识说明:
- 使用
【不适用】明确标记现场可判定为不适用的控制点,并写明判定依据与承载该能力的上位组件。- 依据 GB/T 28448-2019「按测评对象实际承载功能与数据处理范围判定」原则:控制能力由统一认证平台、堡垒机、日志审计系统、终端管理系统、虚拟化平台或云托管平台承载时,应注明测评单元边界后判定不适用或转由上位组件核查,不得机械按缺失判不符合。
- 产品版本确实不提供该能力(如老旧设备无 SNMPv3、无可信根、社区版无审计模块、已停止官方支持的操作系统)时,须核查替代措施并按替代措施的实际效果定档,不得直接判不适用;已停止支持的版本应同时提出升级或补偿控制建议。
一、通用核查表(两款对照)
对应控制点:覆盖 GB/T 22239-2019 8.1.4 安全计算环境各控制点(设备自身管理);承载边界功能时另覆盖 8.1.3 安全区域边界
加固要点:按控制点建立中间件核查基线并逐台比对:先记录不符合项(版本、暴露的管理台、目录列表、Server 响应头、明文端口、AJP 连接器、日志留存),再确定整改项、影响面与回退方式并与运维确认变更窗口;实施前备份
nginx.conf与conf.d/、server.xml/web.xml/tomcat-users.xml与部署目录,实施后逐项用nginx -t/nginx -T、curl -I、ss -tlnp核验,并完整走一遍业务访问与管理台登录流程,确认未中断服务。验证方法:基线核查表逐项结论与回显截图、整改前后配置 diff、配置备份文件、变更审批单与窗口记录、业务连通性验证记录、整改后复测记录与加固记录表归档。
| 核查项 | 判定标准 |
|---|---|
| 版本信息隐藏 | 响应头/错误页不暴露中间件名称与版本号 |
| 管理台 | 不存在弱口令管理台;无用的管理台已删除/禁用并限制来源 |
| 传输加密 | 对外服务启用 TLS 1.2+,证书有效 |
| 日志 | 访问日志与错误日志开启,含来源 IP/时间/URL/状态码,留存 ≥6 个月 |
| 目录列表 | 自动索引(autoindex/listings)关闭 |
| 会话超时 | 管理会话空闲超时 ≤10~30 分钟 |
| 运行账户 | 非管理员/非 root 运行 |
| 版本维护 | 无已知高危漏洞(如 Tomcat AJP Ghostcat CVE-2020-1938) |
二、Nginx 加固
2.1 隐藏版本与错误页收敛
对应控制点:GB/T 22239-2019 8.1.4.4 入侵防范 a)~f)(组件与端口最小化、版本与已知漏洞修补、危险接口关闭)
加固要点:收敛中间件暴露面与已知漏洞:隐藏或改写版本标识(Nginx
server_tokens off;、Tomcatserver.xml的<Server>与 Connectorserver属性、错误页统一为自定义页面),关闭目录列表(autoindex off;、TomcatDefaultServlet的listings=false),关闭或严格限制危险接口(Tomcat AJP 连接器对应 CVE-2020-1938 Ghostcat,须升级到 7.0.100/8.5.51/9.0.31+ 并设secretRequired="true"与secret,不用时直接注释;shutdown 端口 8005 须改口令或设为 -1 关闭;示例应用examples、docs一律删除),限制请求体大小与速率(client_max_body_size、limit_req/limit_conn),建立版本台账并跟踪官方安全公告按窗口升级。验证方法:
curl -sI http://<host>/与错误页响应头(应无Server: nginx/1.xx、X-Powered-By)、nginx -T | grep -E "server_tokens|autoindex|limit_req|client_max_body_size"、server.xml中 AJP<Connector>与<Server port=>配置片段、部署目录下webapps/examples、webapps/docs不存在的核验、版本与漏洞台账及升级记录。
Tomcat AJP 连接器(默认 8009)对外开放且版本低于 7.0.100/8.5.51/9.0.31,可被 CVE-2020-1938(Ghostcat)读取 WEB-INF 下配置文件(含数据库口令)或在特定条件下写入 JSP 获得代码执行,按《高风险判定指引》可直接判高风险;中间件版本存在已公开的高危漏洞且未按窗口修补、又无补偿控制时同样按高风险处理。
判定口径详见 22、高风险判定指引与加固对照表。
http {
server_tokens off; # 隐藏版本号
# 自定义错误页,避免默认页泄露版本与路径
error_page 404 /error404.html;
error_page 500 502 503 504 /error50x.html;
}
验证:curl -I http://站点,Server 头应只有 nginx 无版本;访问不存在路径返回自定义页。
2.2 目录列表与敏感路径
对应控制点:GB/T 22239-2019 8.1.4.2 访问控制 a)~g)(中间件管理面、目录与路径访问控制、运行账户与来源限制)
加固要点:管理面与敏感路径必须受控:Tomcat 的
manager/host-manager生产环境应删除应用而非仅改口令(保留时须用RemoteAddrValve限制到运维网段、启用强口令与 HTTPS、收敛tomcat-users.xml的角色分配),Nginx 的stub_status、备份文件、.git/.svn/.env/配置文件等敏感路径用location显式拒绝并返回 403/404;中间件运行账户最小权限(不得为 root 或 Administrator,部署目录不可被运行账户之外的账户改写);反向代理场景须防止路径穿越与 Host 头伪造导致的越权。验证方法:
curl -s -o /dev/null -w "%{http_code}" http://<host>/manager/html(应为 403/404 而非可爆破的 401/200)、tomcat-users.xml内容与文件权限、RemoteAddrValve配置、Nginx 敏感路径location规则与实测响应码、运行账户核验(ps -ef | grep -E "nginx|java")。
Tomcat manager/host-manager 管理台对办公终端区或互联网可访问,且存在默认或弱口令(tomcat/tomcat、admin/admin)、或未删除示例应用,攻击者可直接上传 WAR 包获得服务器控制权,按《高风险判定指引》可直接判高风险;Nginx 开放目录列表且可下载备份文件、配置文件或 .git 目录导致源码与口令泄露,同样按高风险处理。
判定口径详见 22、高风险判定指引与加固对照表。
server {
autoindex off; # 禁止目录列表(默认 off,确认未显式打开)
location ^~ /admin/ { # 管理路径限制来源
allow 192.168.10.0/24;
deny all;
}
location ~ /\. { deny all; } # 禁止访问隐藏文件(.git/.env)
location ~* \.(sql|bak|log|conf)$ { deny all; }
}
2.3 传输加密与请求限制
对应控制点:GB/T 22239-2019 8.1.4.7 数据完整性 a)、8.1.4.8 数据保密性 a)、8.1.2.2 通信传输 a)b)(对外与管理面的 HTTPS/TLS)
加固要点:对外与内部管理面均启用 HTTPS:Nginx 配置
listen 443 ssl;与ssl_certificate/ssl_certificate_key,ssl_protocols TLSv1.2 TLSv1.3;(TLS1.3 需 Nginx 1.13+ 且 OpenSSL 1.1.1+),禁用 SSLv3/TLS1.0/TLS1.1 与弱套件,启用ssl_session_cache与 HSTS(Strict-Transport-Security),HTTP 80 全量 301 跳转 HTTPS;Tomcat 侧启用 Connector 的SSLEnabled="true"或由 Nginx/负载均衡终结 TLS(终结时须确认后端链路与X-Forwarded-Proto传递正确,避免会话 Cookie 的Secure属性失效)。证书须在有效期内并由可信 CA 签发、域名匹配。验证方法:
nginx -T | grep -E "ssl_protocols|ssl_ciphers|ssl_certificate|Strict-Transport"、openssl s_client -connect <host>:443 -tls1_2(与-tls1应握手失败)确认协商结果、证书有效期与链(openssl s_client -showcerts)、curl -sI http://<host>/返回 301 且Location为 https、server.xml的 TLS Connector 片段。
承载登录鉴别、个人身份信息或支付等敏感数据的站点全程 HTTP 明文(未部署证书、未强制跳转、仍支持 TLS1.0/1.1),鉴别信息与会话 Cookie 可被链路嗅探或中间人劫持时,按《高风险判定指引》可直接判高风险。
判定口径详见 22、高风险判定指引与加固对照表。
server {
listen 443 ssl;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
client_max_body_size 20m; # 按业务限制,防超大请求
limit_req zone=perip burst=20 nodelay; # 限速(配合 limit_req_zone 定义)
if ($request_method !~ ^(GET|POST|HEAD)$) { return 405; }
}
2.4 日志与运行安全
对应控制点:GB/T 22239-2019 8.1.4.3 安全审计 a)~d)(访问日志与运行日志的启用、内容、留存与保护)
加固要点:启用并保护访问与运行日志:Nginx 配置
access_log与error_log(log_format含时间、客户端 IP、请求方法、URI、状态码、响应字节、Referer、User-Agent,并附$request_time/$upstream_response_time便于异常关联),Tomcat 保留AccessLogValve(pattern含%h %l %u %t "%r" %s %b)与catalina.out/localhost.*.log;日志按天或按大小轮转、保留期不少于 6 个月,日志目录权限收敛防止运行账户之外的账户改写,并外送日志审计系统统一留存(中间件本地日志可被清除)。验证方法:日志配置片段(
nginx -T | grep -E "access_log|error_log|log_format"、server.xml的<Valve className="org.apache.catalina.valves.AccessLogValve">)、实际日志样例一行(含全部要素)、日志轮转配置(logrotate或logging.properties)与保留期核验、日志目录权限、外送日志审计系统的接入配置与接收记录。
对外提供服务的 Web 中间件未启用访问日志,或日志留存不足 6 个月、日志可被运行账户以外的普通账户删除改写,安全事件发生后无法还原访问链条时,按高风险线索记录。
判定口径详见 22、高风险判定指引与加固对照表。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_user_agent"';
access_log /var/log/nginx/access.log main;
- 日志经 logrotate 保留 ≥6 个月并转发集中日志服务器;
- 运行账户:
ps -ef | grep nginx应为 nginx/www-data 而非 root(master 除外); - 版本核查与升级:
nginx -v,对照官方安全通告。
三、Tomcat 加固
3.1 管理台处置(高频不符合项)
对应控制点:GB/T 22239-2019 8.1.4.2 访问控制 a)~g)(中间件管理面、目录与路径访问控制、运行账户与来源限制)
# 不使用管理台:直接删除
rm -rf $CATALINA_HOME/webapps/manager $CATALINA_HOME/webapps/host-manager
rm -f $CATALINA_HOME/conf/tomcat-users.xml
保留管理台时:强口令 + 角色最小化(tomcat-users.xml)+ RemoteAddrValve 限制来源 IP + 22 节点改端口。
验证:浏览器访问 http://host:8080/manager/html 应 404/403。
3.2 shutdown 端口与 Server 信息
对应控制点:GB/T 22239-2019 8.1.4.4 入侵防范 a)~f)(组件与端口最小化、版本与已知漏洞修补、危险接口关闭)
<!-- conf/server.xml -->
<Server port="-1" shutdown="SHUTDOWN"> <!-- 8005 关闭口port 改 -1 禁用远程 shutdown -->
<Connector port="8080" protocol="HTTP/1.1"
server="Apache" ... /> <!-- 隐藏版本:server 属性 -->
3.3 AJP 连接器(Ghostcat CVE-2020-1938)
对应控制点:GB/T 22239-2019 8.1.4.4 入侵防范 a)~f)(组件与端口最小化、版本与已知漏洞修补、危险接口关闭)
不用 AJP 时直接注释删除 AJP Connector;必须使用时(9.0.31+):
<Connector port="8009" protocol="AJP/1.3"
secretRequired="true" secret="YourAjpSecret"
address="127.0.0.1" redirectPort="8443" />
3.4 目录列表与会话
对应控制点:GB/T 22239-2019 8.1.4.1 身份鉴别 b)(配置并启用结束会话、登录连接超时自动退出)
加固要点:统一配置会话空闲超时与并发限制:Tomcat 在
web.xml设<session-timeout>(建议 10~30 分钟,不得为 0 或负数),会话 Cookie 启用HttpOnly与Secure(<cookie-config>),按需启用SameSite;Nginx 侧对代理的管理台配置空闲断开与超时(proxy_read_timeout、keepalive_timeout),并对会话 Cookie 属性做统一收敛。会话固定与超时后仍可访问受保护资源属常见缺陷,须实测而非仅看配置。验证方法:
web.xml的<session-config>片段、响应头Set-Cookie中的HttpOnly/Secure/SameSite属性、nginx -T | grep -E "keepalive_timeout|proxy_read_timeout"、实测:登录后静置至阈值再访问受保护路径应被重定向到登录页。
管理台或业务系统会话无空闲超时(session-timeout 为 0 或负数)、会话 Cookie 缺少 HttpOnly/Secure,运维离岗后会话可被接管或 Cookie 可被 XSS 窃取时,按高风险线索记录。
判定口径详见 22、高风险判定指引与加固对照表。
<!-- conf/web.xml:禁止目录列表 -->
<init-param><param-name>listings</param-name><param-value>false</param-value></init-param>
<!-- 会话超时(分钟)与 Cookie 属性 -->
<session-config>
<session-timeout>30</session-timeout>
<cookie-config><http-only>true</http-only><secure>true</secure></cookie-config>
</session-config>
3.5 日志与运行安全
对应控制点:GB/T 22239-2019 8.1.4.3 安全审计 a)~d)(访问日志与运行日志的启用、内容、留存与保护)
- 访问日志:server.xml 中 AccessLogValve 保持开启(含
%a %t %r %s); catalina.out经 logrotate 留存 ≥6 个月,转发集中日志服务器;- 运行账户:以专用 tomcat 用户运行(
ps -ef | grep tomcat); - 版本升级:8.5.x/9.0.x 最新小版本,消除 CVE-2020-1938 等已知漏洞;
$CATALINA_HOME/bin/version.sh核查。
四、测评项对照表
| 控制点 | 对应章节 |
|---|---|
| 身份鉴别:管理台账户与口令、会话超时 | 三.1、三.4 |
| 访问控制:管理路径来源限制 | 二.2 |
| 入侵防范:版本隐藏、关闭多余组件与端口、漏洞修复 | 二.1、二.3、三.2、三.3 |
| 安全审计:日志与留存 | 二.4、三.5 |
| 通信完整性/保密性:TLS | 二.3 |
参考依据
- GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》(8.1.4 安全计算环境各控制点(Web 中间件自身安全);对外提供服务时另涉 8.1.3 安全区域边界与 8.1.2 安全通信网络):http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=BAFB47E8874764186BDB7865E8344DAF
- GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》(测评对象边界认定、单元测评实施与结果判定:符合/部分符合/不符合/不适用):http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7E736CDF4502B6FF1258DD250AA3EC8C
- GB/T 22240-2020《信息安全技术 网络安全等级保护定级指南》、GB/T 25070-2019《安全设计技术要求》、GB/T 28449-2018《测评过程指南》,可在全国标准信息公共服务平台检索:http://openstd.samr.gov.cn/bzgk/gb/
- nginx 官方文档(Module Index / ngx_http_ssl_module / ngx_http_limit_req_module):https://nginx.org/en/docs/
- Apache Tomcat 官方文档(Security Considerations / Configuration Reference):https://tomcat.apache.org/
- 《网络安全等级保护测评高风险判定指引》(中关村信息安全测评联盟团体标准)——高风险情形判定口径,站内对照表:22、高风险判定指引与加固对照表
- 命令核验说明:Nginx 指令以 nginx 官方文档(Module Index)核验,Tomcat 配置以 Apache Tomcat 官方 Configuration Reference 与 Security Considerations 核验(核验日期 2026-09-02)。五处须留意:① TLS1.3 需 Nginx 1.13.0 及以上且底层 OpenSSL 1.1.1 及以上,
nginx -V输出的 OpenSSL 版本才是实际依据,只升级 Nginx 二进制而 OpenSSL 仍为 1.0.2 时ssl_protocols TLSv1.3;会导致nginx -t报错;② Tomcat AJP 连接器对应 CVE-2020-1938(Ghostcat),修复要求版本不低于 7.0.100/8.5.51/9.0.31 并显式设置secretRequired="true"与secret,仅升级版本而不设 secret 仍不完整,不使用 AJP 时应直接注释整个<Connector port="8009" protocol="AJP/1.3">;③ Tomcat 管理台manager/host-manager生产环境应删除应用目录而非仅改口令,保留时须叠加RemoteAddrValve来源限制 + 强口令 + HTTPS,三者缺一即为高风险线索;④ shutdown 端口 8005 的shutdown="SHUTDOWN"口令若保持默认,本机任一低权限账户可直接关停服务,改为随机口令或port="-1"关闭,改后须用ss -tlnp确认端口不再监听;⑤ 由 Nginx/负载均衡终结 TLS 时,后端 Tomcat 须正确接收X-Forwarded-Proto(配置RemoteIpValve),否则会话 Cookie 的Secure属性与重定向会失效,核查时以浏览器实际下发的Set-Cookie属性为准。