需定义结构化JSON日志格式,分离审计/异常/静态/认证日志流,并在Nginx层实时脱敏敏感字段,实现可追溯、可分类、可脱敏、可联动的主动风控体系。

要构建 Nginx 全方位访问记录与深度运维审计体系,关键不是堆字段、也不是开日志就完事,而是围绕“可追溯、可分类、可脱敏、可联动”四个目标,把日志从被动记录变成主动风控工具。
结构化日志格式是审计的基石
默认 combined 格式缺失真实 IP、请求 ID、上游状态等核心审计字段。必须在 http 块中定义专用 log_format:
- 用 $realip_remote_addr 替代 $remote_addr,配合 set_real_ip_from 和 real_ip_header 正确还原客户端真实地址
- 加入 $request_id 实现全链路追踪,所有下游服务(如后端 API、WAF)需透传 X-Request-ID
- 记录上游行为:$upstream_addr、$upstream_status、$upstream_response_time,明确故障是否出在后端
- 对敏感操作打标:用 map 指令标记 /admin/、/api/v1/users、POST /login 等路径为 $is_sensitive,便于后续过滤
- 推荐 JSON 格式输出,方便 ELK 或 Loki 解析:log_format audit '{ "@timestamp": "$time_iso8601", "clientip": "$realip_remote_addr", "req_id": "$request_id", "method": "$request_method", "uri": "$uri", "status": $status, "upstream": "$upstream_addr", "upstream_status": $upstream_status, "is_sensitive": $is_sensitive }';
按场景分离日志,避免信息淹没
所有请求混写一个文件会极大增加分析成本。应基于目的拆分日志流:
- 审计专用日志:只记录高风险操作,例如 location ^~ /admin/ { access_log /var/log/nginx/audit.log audit if=$is_sensitive; }
- 异常流量日志:捕获 4xx/5xx 响应,用 map $status $is_error_traffic { ~^[45] 1; default 0; } 控制落盘
- 静态资源独立日志:location ~* \.(js|css|png|woff2?)$ { access_log /var/log/nginx/static.log main; log_not_found off; }
- 认证失败归档:auth_basic 触发的 401 单独写入 /var/log/nginx/auth_fail.log,便于识别暴力破解
实时脱敏与敏感内容管控
明文记录 token、手机号、用户名等违反《个人信息保护法》。Nginx 可在日志生成阶段完成字段级掩码:
- 用 map 提取并掩码 URL 中手机号:map $request_uri $masked_phone { ~(?
- 截取 token 前 4 位:map $arg_token $masked_token { ~^([a-zA-Z0-9]{4}).* "$1****"; default "-"; }
- 登录类请求体需谨慎记录:仅对 401/403 响应启用 $request_body,且必须配置 client_body_buffer_size 和 client_body_in_single_buffer
- 日志文件权限设为 640,属主 nginx:audit,禁止普通用户读取
闭环分析与系统级防护增强
日志写出来只是第一步,真正形成审计闭环还需轻量分析与操作监控:
- 用 awk + sort + uniq 快速筛查异常:统计一分钟内 404 超 50 次的 IP;筛选含 sqlmap/nmap 的 User-Agent
- 接入 Prometheus:编译加载 nginx-module-vts,通过 /status/format/json 暴露 requests、resp_5xx、response time 分位值
- 用 auditd 监控日志本身:-w /etc/nginx/ -p wa -k nginx_conf;-w /var/log/nginx/ -p wa -k nginx_logs,防篡改、防删除
- 日志加密(生产必需):通过管道 + OpenSSL 实现实时加密落盘,避免磁盘泄露风险











