nginx代理承担安全审计职责需四要素协同:自定义log_format记录真实ip、请求、状态、上游耗时及request_id;启用$request_body需配置proxy_pass与缓冲参数;按路径或状态分级记录并脱敏敏感字段;统一x-request-id实现跨组件攻击链追溯。

记录真实请求与响应上下文
默认 access_log 只记头信息,远不够审计。必须自定义 log_format,至少包含:$realip_remote_addr(还原真实 IP)、$request(含方法、URI、参数)、$status、$upstream_response_time、$request_id(全链路锚点)。示例:
log_format audit '{ "@timestamp": "$time_iso8601", "clientip": "$realip_remote_addr", "req": "$request", "status": $status, "upstream_time": $upstream_response_time, "req_id": "$request_id" }';
启用时注意:单独存放日志文件(如 /var/log/nginx/audit.log),并确保 nginx worker 对该路径有写权限。
可靠获取并控制请求体内容
$request_body 不是随时可用的变量。它只在 Nginx 主动读取并缓存请求体后才有效,且默认不启用。需同时满足:
- location 中必须配置
proxy_pass(或fastcgi_pass等)——静态响应或 return 指令不会触发读取 - 设置
client_body_buffer_size 512k和client_body_in_single_buffer on,确保常见 JSON 或表单数据驻留内存 - 禁用临时文件缓存:
client_body_in_file_only off - 限制大小防爆:
client_max_body_size 1m(根据业务调整)
按需记录 + 敏感字段脱敏
全量记录 body 风险高、成本大。应分级处理:
- 仅对 4xx/5xx 错误或指定路径(如
/login、/api/auth)启用 body 记录,用map控制开关 - 日志格式中使用
escape=json防止乱码或注入 - 密码、token、手机号等字段必须脱敏:通过 OpenResty 的
log_by_lua_block解析 JSON,匹配 key 后替换值为"***" - 生产环境建议截断 body,例如只保留前 2048 字节,避免日志膨胀
统一 ID 实现跨组件攻击链还原
单靠 Nginx 日志无法闭环。必须让 WAF、限流模块、后端应用都共享同一标识:
- 用
$request_id作为唯一请求 ID,在请求入口生成 - 透传至下游:
proxy_set_header X-Request-ID $request_id; - 所有组件(ModSecurity、应用日志、error_log)均以
X-Request-ID字段落盘,格式严格一致 - 发现一次 SQL 注入拦截?直接用该 ID 在 access.log、WAF log、应用 error.log 中交叉检索,还原完整攻击路径











