要让nginx日志满足等保三级要求,必须联动字段完整性、真实ip获取、敏感信息防护和日志生命周期管理:补全客户端真实ip、毫秒级时间、完整uri、http方法/状态码/响应体大小、耗时细分、referer/user-agent及上游地址;启用realip模块校验可信代理;用map脱敏敏感参数;通过logrotate+filebeat+worm实现180天防篡改留存。

要让 Nginx 日志真正满足等保三级对安全审计的合规要求,不能只改 log_format,必须把字段完整性、真实 IP 获取、敏感信息防护、日志生命周期管理四者联动起来。单独调格式,日志写得再全,也过不了现场测评。
必须包含的审计字段(缺一不可)
等保三级明确要求访问日志至少记录以下元数据,Nginx 默认配置不满足,需手动补全:
-
客户端真实 IP:禁用
$remote_addr(易被伪造),改用$http_x_forwarded_for或启用ngx_http_realip_module后使用$realip_remote_addr,并确认上游 WAF/CDN 已透传 X-Forwarded-For 头 -
毫秒级请求时间:用
$time_iso8601或$msec(配合自定义格式),避免仅用$time_local(精度不足) -
完整请求 URI(含 query):必须用
$request_uri,$uri会丢弃参数,无法回溯 SQL 注入、路径遍历等攻击痕迹 -
HTTP 方法 + 状态码 + 响应体大小:固定组合
$request_method $status $body_bytes_sent;禁用$bytes_sent(含响应头字节,不符合“实际传输内容”定义) -
耗时细分:同时记录
$request_time(总耗时)和$upstream_response_time(后端返回首字节耗时),差值可定位 Nginx 自身瓶颈 -
Referer 与 User-Agent:用于识别爬虫、恶意工具或异常终端,字段名保持标准(
$http_referer、$http_user_agent) -
上游服务地址:反向代理场景下必须加
$upstream_addr,便于故障定位与责任划分
真实 IP 解析与防伪造保障
若前端有 WAF、CDN 或 LB,仅靠 $http_x_forwarded_for 不够——它可能被客户端篡改。必须做两件事:
- 在
http块启用 realip 模块:set_real_ip_from 192.168.10.0/24;(填你可信代理网段),再设real_ip_header X-Forwarded-For;和real_ip_recursive on; - 在日志格式中优先使用
$realip_remote_addr,它经过可信链校验,比原始头更可靠 - 禁用未受信来源的
X-Real-IP或X-Cluster-Client-IP头,避免被绕过
敏感字段脱敏与防泄露机制
Nginx 原生不支持正则替换日志内容,不能靠 sub_filter 或 Lua 动态过滤。正确做法是前置静态映射:
- 用
map指令清洗$args和$request_uri,例如抹掉 token/password/id_card 参数值:
~^(.*)(token|password|id_card)=([^&]*)(.*)$ "$1$2=[REDACTED]$4";
default $args;
}
- 在
log_format中引用$safe_args,拼接为$request_uri?$safe_args - 绝对禁止开启
$request_body(需 OpenResty + 缓存配置),既影响性能,又极易漏记二进制内容或触发内存溢出 - 日志文件权限设为
640,属主root:adm,防止 Web 进程越权读取
日志留存的闭环管理(不止于 Nginx 配置)
等保三级要求日志留存 ≥180 天,且具备防篡改、可追溯能力。Nginx 本身不提供删除控制,必须靠外部机制兜底:
- 本地存储阶段:用
logrotate配置daily rotate 180+compress+postrotate kill -USR1 `cat /var/run/nginx.pid`,确保轮转后 Nginx 重开文件句柄 - 防覆盖保障:禁用
copytruncate,改用create 640 root adm,避免旧日志被意外截断 - 集中化归档:通过 Filebeat 或 Fluentd 将日志实时推送至 Kafka 或对象存储(如 MinIO/S3),再接入 ELK 或等保认证的日志审计平台
- 防篡改加固:对原始日志启用 WORM 策略(如 S3 Object Lock),或采用 SM3 哈希+链式签名存证,满足“不可否认性”要求











