21、Web中间件安全加固

Web 中间件等保三级安全加固:Nginx server_tokens off 隐藏版本、autoindex off 关闭目录列表、敏感路径(.git/.svn/.env/备份文件)location 显式拒绝、ssl_protocols TLSv1.2 TLSv1.3(TLS1.3 需 Nginx 1.13+ 且 OpenSSL 1.1.1+)与 HSTS、HTTP 全量 301 跳转 HTTPS、client_max_body_size 与 limit_req/limit_conn、access_log/error_log 与 log_format 要素、keepalive_timeout;Tomcat 删除 manager/host-manager 与 examples/docs 示例应用、shutdown 端口 8005 改口令或设 -1、Connector server 属性与错误页收敛、AJP 连接器 CVE-2020-1938 Ghostcat(须 7.0.100/8.5.51/9.0.31+ 且将 secretRequired 设为 true)、web.xml session-timeout 与 Cookie HttpOnly/Secure、AccessLogValve 与 catalina.out 留存、RemoteAddrValve 限制管理来源、以低权限账户运行。

定位:Nginx 1.181.28 与 Apache Tomcat 710.1 等保三级安全加固手册:先给出通用核查表,再按 Nginx(版本隐藏、目录列表、敏感路径、TLS 与请求限制、日志)与 Tomcat(管理台、shutdown 端口、Server 信息、AJP 连接器、目录列表与会话)分节,每节附配置片段与验证命令。

适用:Nginx 1.181.28 / Tomcat 710.1;WebLogic、IIS 等按厂商基线与 [02~06 号设备篇] 思路套用。 版本线:Nginx TLS 1.3 需 1.13+ 且 OpenSSL 1.1.1+;Tomcat AJP secretRequired 需 7.0.100 / 8.5.51 / 9.0.31+(更老版本应注释 AJP 或升级);Tomcat 10.1(jakarta.* 包名变更)对本篇配置项无影响。 配套测评:Nginx 安全审计见 35、等保2.0-nginx中间件测评-安全审计;管理台与版本隐藏是测评高频项。

使用说明:

  • 本文为加固操作手册:所有命令都会修改配置,可能中断服务、断开当前会话或需要重启。实施前必须完成变更审批、确认业务窗口、备份原配置(设备 savecopy running-configbackup startup-configuration,主机备份 /etc、注册表与关键业务数据),并准备可执行的回滚预案
  • 先在测试环境或单台设备灰度验证,确认无业务影响后再批量推广;每完成一项立即用文中「验证」命令核验生效——配置已下发不等于策略已生效(如 H3C 未 password-control enable、Linux 未对存量账户 chage、Windows 未 gpupdate /force)。
  • 示例中的地址、账户名、口令、路径均为演示值(如 PleaseChange@123192.168.10.20admin123),现场须替换为符合本单位口令策略与网络规划的真实值,严禁直接沿用文中示例口令;对外发布或归档时须对个人信息与内网管理地址脱敏。
  • 命令不存在、视图名或参数与本文不一致时,先用 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.confconf.d/server.xml/web.xml/tomcat-users.xml 与部署目录,实施后逐项用 nginx -t/nginx -Tcurl -Iss -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;、Tomcat server.xml<Server> 与 Connector server 属性、错误页统一为自定义页面),关闭目录列表(autoindex off;、Tomcat DefaultServletlistings=false),关闭或严格限制危险接口(Tomcat AJP 连接器对应 CVE-2020-1938 Ghostcat,须升级到 7.0.100/8.5.51/9.0.31+ 并设 secretRequired="true"secret,不用时直接注释;shutdown 端口 8005 须改口令或设为 -1 关闭;示例应用 examplesdocs 一律删除),限制请求体大小与速率(client_max_body_sizelimit_req/limit_conn),建立版本台账并跟踪官方安全公告按窗口升级。

验证方法curl -sI http://<host>/ 与错误页响应头(应无 Server: nginx/1.xxX-Powered-By)、nginx -T | grep -E "server_tokens|autoindex|limit_req|client_max_body_size"server.xml 中 AJP <Connector><Server port=> 配置片段、部署目录下 webapps/exampleswebapps/docs 不存在的核验、版本与漏洞台账及升级记录。

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")。

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_keyssl_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 片段。

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_logerror_loglog_format 含时间、客户端 IP、请求方法、URI、状态码、响应字节、Referer、User-Agent,并附 $request_time/$upstream_response_time 便于异常关联),Tomcat 保留 AccessLogValvepattern%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">)、实际日志样例一行(含全部要素)、日志轮转配置(logrotatelogging.properties)与保留期核验、日志目录权限、外送日志审计系统的接入配置与接收记录。

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 启用 HttpOnlySecure<cookie-config>),按需启用 SameSite;Nginx 侧对代理的管理台配置空闲断开与超时(proxy_read_timeoutkeepalive_timeout),并对会话 Cookie 属性做统一收敛。会话固定与超时后仍可访问受保护资源属常见缺陷,须实测而非仅看配置。

验证方法web.xml<session-config> 片段、响应头 Set-Cookie 中的 HttpOnly/Secure/SameSite 属性、nginx -T | grep -E "keepalive_timeout|proxy_read_timeout"、实测:登录后静置至阈值再访问受保护路径应被重定向到登录页。

<!-- 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 属性为准。

关联文章