35、Nginx中间件安全审计测评
Categories:
4 分钟阅读
定位:Nginx 中间件「安全审计」控制点的核查方法与判定口径(等保 2.0 安全计算环境 8.1.4.3)。 配套测评:中间件与容器 · Nginx(完整核查命令单);配套加固:21、Web中间件安全加固;高风险口径:22、高风险判定指引与加固对照表。 适用版本:Nginx 1.18~1.27(
log_format与access_log语法自 1.10 起稳定;error_log/access_log默认值与安装方式相关,源码编译默认为logs/error.log、logs/access.log combined,发行版包常见/var/log/nginx/)。使用说明:
- 本文所有命令均为只读取证命令,不修改配置、不重启服务、不执行清除类操作;确需变更由被测单位运维方在授权下实施。
- 命令回显本身即证据,须连同命令行一起截图;示例中的地址、账户、路径均为演示值,现场须替换为真实取证结果,并对个人信息与内网管理地址脱敏后再入报告。
- 命令不存在或输出与示例差异较大时,先确认产品版本与部署形态(物理机/虚拟机/容器/集群),再换用等效命令或转入配置文件、管理控制台取证,不得据命令缺失直接判不符合。
- 文中「默认」「一般」等表述均为初判倾向,须经上机核查 + 访谈 + 配置/制度核对三方印证后定论,并在报告中写明取证来源。
不适用标识说明:
- 使用
【不适用】明确标记现场可判定为不适用的控制点,并写明判定依据与承载该能力的上位组件。- 依据 GB/T 28448-2019「按测评对象实际承载功能与数据处理范围判定」原则:控制能力由上层应用、统一认证平台、前置代理、堡垒机、日志审计系统、虚拟化平台或云托管平台承载时,应注明测评单元边界后判定不适用或转由上位组件核查,不得机械按缺失判不符合。
- 产品版本确实不提供该能力(如设备无可信根、社区版无审计模块)时,须核查替代措施并按替代措施的实际效果定档,不得直接判不适用。
一、测评对象与核查入口
Nginx 是自由的、开源的高性能 HTTP 服务器与反向代理服务器,常见两种部署角色,测评时主要功能一栏须分清:
| 角色 | 说明 | 审计取证重点 |
|---|---|---|
| HTTP 服务器 | 直接发布网站/静态资源 | access_log 记录用户请求 |
| 反向代理 | 负载均衡、转发至后端应用 | 除自身日志外,还须核查后端应用日志是否留存(Nginx 日志不能替代应用审计) |
核查入口:Nginx 主目录下的 conf/nginx.conf(源码安装)或 /etc/nginx/nginx.conf(发行版包)。


二、安全审计 a) 应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计
对应测评项:GB/T 22239-2019 8.1.4.3 安全审计 a)
判定要点:审计功能已启用且覆盖每个用户与重要安全事件(登录注销、权限变更、审计策略变更、系统异常)、记录含日期时间/用户/事件类型/成败四要素、审计记录受保护并定期备份、留存不少于 6 个月、审计进程受保护且非审计管理员不可中断 → 符合;开关已开但子类别不全、留存不足、仅本地存储无外发 → 部分符合;审计完全未启用且无日志审计系统或堡垒机替代 → 不符合(高风险)。
取证要求:审计策略配置与生效截图(auditd 规则 / auditpol / 高级审核策略)、审计记录抽样(脱敏)、日志存放路径与权限、日志外发到 syslog/日志审计系统/SOC 的配置与收端截图、最早记录时间清单、清理与转存任务配置。
访问日志与错误日志未启用或留存不足 6 个月,且无日志外发与集中审计措施,属高风险;日志文件权限过宽致任意本地用户可读写删,或日志中记录了明文口令、完整身份证号等敏感信息时按高风险线索记录。
判定口径详见 22、高风险判定指引与加固对照表。
核查方法
# 定位配置文件
nginx -V 2>&1 | grep -o 'conf-path=[^ ]*' # 编译时指定的配置路径
nginx -t # 校验配置并输出配置文件路径
# 查看生效的日志配置(排除注释行)
grep -nE "^\s*(error_log|access_log|log_format)" /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf
# 关注的配置项
error_log /var/log/nginx/error.log warn; # 路径 + 级别
access_log /var/log/nginx/access.log main; # 路径 + 格式名
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

- 预期现象:
error_log与access_log均已显式配置或沿用默认值;日志级别合理。
error_log / access_log 参数说明
error_log 路径 级别
- 配置段:
main、http、server、location - 默认值:
error_log logs/error.log error; - 关闭:
error_log off(测评视为不符合) - 级别由低到高:
debug(信息最多)、info、notice、warn、error、crit——设为某一级别时,记录该级别及以上的日志
access_log 路径 [格式名 [buffer=大小 [flush=时间]]]
- 配置段:
http、server、location、if in location、limit_except - 默认值:
access_log logs/access.log combined;(部分发行版默认格式名为main) - 关闭:
access_log off(测评视为不符合) buffer:日志写入缓存大小,默认 64kgzip:写入前压缩,1~9,默认 1flush:缓存最长保留时间if:条件判断,计算结果为 0 或空串时关闭该作用域的访问日志
判定标准
| 结论 | 条件 |
|---|---|
| 符合 | error_log 与 access_log 均已启用且级别合理(error 或 warn,不建议 crit/off),日志实际有内容产生 |
| 部分符合 | 仅启用其中一类日志;或级别设为 crit 导致错误信息基本不落盘 |
| 不符合 | access_log off / error_log off,或日志文件为空且无外送 |
反向代理场景的额外判据:若 Nginx 仅作反向代理,其访问日志只能证明「转发层有审计」, 后端应用自身的审计日志仍需单独取证;反之亦然。两侧缺一,本项最多判部分符合。
证据留存:nginx.conf 日志配置段截图、ls -l 日志目录清单、日志内容抽样截图。
三、安全审计 b) 审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息
对应测评项:GB/T 22239-2019 8.1.4.3 安全审计 b)
核查方法
# 日志文件位置(示例为源码安装目录,发行版常见 /var/log/nginx/)
ls -l logs/
tail -n 5 logs/access.log


Nginx 默认的 combined(或发行版预置的 main)格式已包含时间、来源地址、请求、状态码等要素。

192.168.21.176 - - [28/Sep/2020:14:34:48 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
日志字段与等保要素对照
| 日志字段 | 说明 | 示例 | 对应等保要素 |
|---|---|---|---|
$remote_addr | 客户端地址 | 192.168.21.176 | 主体(来源) |
$remote_user | 客户端用户名称(需开启认证才有值) | - | 用户 ⚠ |
$time_local | 访问时间与时区 | [28/Sep/2020:14:34:48 +0800] | 日期和时间 ✔ |
$request | 请求的 URI 与 HTTP 协议 | "GET /favicon.ico HTTP/1.1" | 事件类型 ✔ |
$status | HTTP 状态码 | 404 | 事件是否成功 ✔ |
$body_bytes_sent | 发送给客户端的响应字节数 | 555 | 其他相关信息 |
$http_referer | URL 跳转来源 | - | 其他相关信息 |
$http_user_agent | 客户端浏览器/终端信息 | "Mozilla/5.0 …" | 其他相关信息 |
$http_x_forwarded_for | 代理场景下的真实客户端地址(需上游同步配置) | - | 主体(代理场景必配) |
$request_time | 请求总耗时 | 0.165 | 其他相关信息 |
$upstream_addr | 后端 upstream 地址 | 10.36.10.80:80 | 其他相关信息(反向代理场景) |
$ssl_protocol / $ssl_cipher | SSL 协议版本与算法 | TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 | 传输加密佐证 |

$remote_user 仅在启用 HTTP 基本认证(auth_basic)时才有值。若被测系统通过应用层会话识别用户
(绝大多数 Web 应用的做法),则 Nginx 访问日志中的用户字段恒为 -,无法单独满足"用户"要素。
取证与判定建议:
- 应用层以会话/令牌识别用户时,应核查应用自身的审计日志是否记录用户与时间/事件/结果;
- 若应用层审计记录用户而 Nginx 仅记录来源 IP,则本项按"Nginx + 应用"组合取证判定;
- 两侧均无用户标识(仅 IP)→ 判部分符合,并要求在
log_format中追加用户字段或在应用层补审计。
补充核查:日志时间准确性
date # 操作系统时间
date -u # UTC 时间,核对时区
timedatectl status # systemd 系:NTP 同步状态
- 中间件日志时间跟随操作系统时钟,操作系统时间不正确则审计记录时间不可溯源 → 本项至少部分符合。
判定标准
| 结论 | 条件 |
|---|---|
| 符合 | log_format 已含时间、事件类型、事件结果等要素,且用户要素($remote_user 或应用层审计)可追溯 |
| 部分符合 | 缺用户要素且应用层无审计可关联($remote_user 恒为 - 的典型情形);或日志时间未与 NTP 同步 |
| 不符合 | 仅记录来源 IP 与请求行,无用户、时间或结果要素,且无应用层审计补充 |
用户要素的取证口径:Nginx 默认日志的
$remote_user仅在启用 HTTP 基本认证时才有值;以应用层会话/令牌识别用户的 Web 应用,须与应用层审计组合取证,两侧均无用户标识时按部分符合定档(见上文警示)。
证据留存:log_format 配置截图、access.log 抽样截图(含字段)、应用层审计记录(组合取证时)、时间同步状态截图。
四、安全审计 c) 应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等
对应测评项:GB/T 22239-2019 8.1.4.3 安全审计 c)
核查方法
- 日志文件权限——确认仅管理员(属主/管理组)具有读写权限,其他组无修改权限。
# Linux(推荐 ≤640,属主 root 或 nginx 运行用户)
ls -l /var/log/nginx/
stat -c '%A %U:%G %n' /var/log/nginx/access.log /var/log/nginx/error.log
# Windows
icacls <nginx安装目录>\logs\access.log


- 预期现象:属主为 root(或 nginx 运行用户)、权限
640/600,users/other组无写权限。
- 定期备份——核查是否配置日志外送(syslog/日志采集代理)或定期备份至备份服务器。
# Nginx 原生支持 syslog 外送(1.7.1+),配置示例
# access_log syslog:server=10.0.0.10:514,facility=local7,tag=nginx,severity=info main;
# error_log syslog:server=10.0.0.10:514,facility=local7,tag=nginx,severity=error warn;
grep -nE "syslog" /etc/nginx/nginx.conf /etc/nginx/conf.d/*.conf
- 留存 ≥6 个月——核查 logrotate 配置与备份服务器留存策略。
cat /etc/logrotate.d/nginx
logrotate 留存 ≥6 个月配置示例
/var/log/nginx/*.log {
daily
rotate 180
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
daily + rotate 180 ≈ 180 天,满足「不少于 6 个月」的留存要求。
判定标准
| 结论 | 条件 |
|---|---|
| 符合 | 日志权限受限(其他用户不可改)+ 有定期备份或外送 + 留存 ≥6 个月 |
| 部分符合 | 仅满足其中两项(常见情形:权限合规但无备份,或本地轮转 7 天) |
| 不符合 | 任意用户可删改日志;或无备份且留存明显不足 |
Nginx 自身不提供定时备份能力,实践中依赖 logrotate 本地轮转 + FTP/rsync/日志采集代理外送。 仅有 logrotate 本地轮转(通常保留 7~14 天)不足以满足 6 个月留存,须有外送或异地备份佐证。
证据留存:权限截图、logrotate 配置或备份任务截图、备份服务器留存策略截图/制度文件。
五、安全审计 d) 应对审计进程进行保护,防止未经授权的中断
对应测评项:GB/T 22239-2019 8.1.4.3 安全审计 d)
核查方法:确认日志写入由 Nginx 工作进程完成,无独立审计进程可被单独停止; 并核查非授权用户是否具备停止 Nginx 服务或删除日志的权限。
ps -ef | grep -E "nginx" | grep -v grep # 观察 master/worker 进程属主
systemctl status nginx # 服务管理权限归属
判定标准
- 符合:日志写入与中间件主进程绑定,非授权账户无法停止服务或删除日志(服务管理权限受限、日志目录权限受限);
- 部分符合:日志权限受限但任意运维账户均可
systemctl stop nginx(无变更管控); - 不符合:审计功能可被普通账户关闭(如任意用户可修改配置并执行
access_log off后 reload)。
nginx -s reload 可在不中断服务的情况下使 access_log off 立即生效。
因此本项的实质是配置文件本身的访问控制:应确保 nginx.conf 仅管理员可写
(建议 644 且属主 root),并对配置变更纳入变更管理与审计。
六、常见不符合项(测评高频)
| 不符合情形 | 出现频率 | 整改要点 |
|---|---|---|
access_log off 或注释掉 access_log 且无外送 | 高 | 启用访问日志并配置 logrotate |
error_log 级别设为 crit,错误信息基本不落盘 | 中 | 调整为 error 或 warn |
| 日志仅本地轮转 7~14 天,无备份无外送 | 最高 | 配置 syslog 外送或采集代理,留存 ≥6 个月 |
访问日志无用户标识($remote_user 恒为 -) | 高 | 应用层补审计,或在 log_format 追加用户/会话字段 |
日志文件 666/777,普通用户可删改 | 中 | 收紧至 640,属主 root |
| 反向代理场景只提供 Nginx 日志,后端应用无审计 | 高 | 补齐后端应用审计记录 |
| 日志时间未与时区/NTP 同步 | 中 | 启用 chrony/ntp 并核对时区 |
版本适用性对照
| 项 | Nginx 1.18 | Nginx 1.20~1.24 | Nginx 1.25+ | 说明 |
|---|---|---|---|---|
log_format / access_log 语法 | 一致 | 一致 | 一致 | 自 1.10 起稳定 |
syslog 外送(syslog: 目标) | 支持(1.7.1+) | 支持 | 支持 | 建议用于满足外送与留存要求 |
| 默认日志格式名 | combined(源码编译)/ main(多数发行版预置) | 同左 | 同左 | 以现场 nginx.conf 实际为准 |
| 默认日志路径 | logs/(源码编译)或 /var/log/nginx/(发行版包) | 同左 | 同左 | 用 nginx -V 的 conf-path 定位配置后确认 |
error_log 级别取值 | debug|info|notice|warn|error|crit|alert|emerg | 同左 | 同左 | 记录该级别及以上 |
测评项对照表
| 控制点 | 核查命令 / 配置项(Nginx) |
|---|---|
| 安全审计 a) | nginx -t 定位配置 → grep -nE "^\s*(error_log|access_log)" nginx.conf;两类日志均启用且级别合理 |
| 安全审计 b) | tail -n 5 access.log;核对 time/request/status 等要素;重点核查用户标识($remote_user) |
| 安全审计 c) | stat -c '%A %U:%G %n' *.log(权限)+ cat /etc/logrotate.d/nginx(留存)+ syslog 外送配置(备份) |
| 安全审计 d) | ps -ef | grep nginx + 配置文件写权限核查(防 access_log off 后 reload) |
| 时间同步 | timedatectl status / date -u(审计时间可溯源的前置条件) |
参考依据
- GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》(8.1.4.3 安全审计 a)~d)(Web 中间件自身)):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 官方文档·ngx_http_log_module:https://nginx.org/en/docs/http/ngx_http_log_module.html
- NGINX 官方文档入口:https://docs.nginx.com/
- 《网络安全等级保护测评高风险判定指引》(中关村信息安全测评联盟团体标准)——高风险情形判定口径,站内对照表:22、高风险判定指引与加固对照表
- 命令核验说明:Nginx 配置指令以 nginx.org 官方
ngx_http_log_module文档核验(核验日期 2026-09-02)。四处须留意:① Nginx 自身无「审计」子系统,8.1.4.3 的核查对象是access_log/error_log与其字段完备性,判定时须写明这是以访问日志承载审计能力,并核查是否有日志审计系统/SOC 做集中留存;② 默认combined日志格式不含请求体、响应状态明细与耗时,且「用户」维度通常只能取到$remote_user(仅在启用 HTTP 认证时有值)或$remote_addr,若业务鉴别由后端应用承载,须转由应用侧审计取证并注明测评单元边界;③access_log syslog:server=...自 Nginx 1.7.11 起支持,商用版 NGINX Plus 另有实时指标接口,社区版与 Plus 的能力差异须在判定前确认;④ 8.1.4.3 d) 审计进程保护在 Linux 下体现为运行账户最小化(user指令)、日志目录权限、systemd单元保护与是否可被普通用户nginx -s stop,须逐项取证而非仅看进程是否存在。