Nginx 安全日志需通过 log_format 同时记录 $remote_addr 与 $request,并配合 real_ip 模块和 X-Forwarded-For 还原真实客户端 IP;配置 set_real_ip_from、real_ip_header 等指令,启用 access_log 指向专用文件,可扩展 $args、$request_uri 等字段提升审计效果。

在 Nginx 中,通过 log_format 自定义日志格式,可以将客户端真实 IP($remote_addr)与完整请求行($request)同时记录,为安全审计提供关键线索。但需注意:若前端有代理(如 CDN、LB),$remote_addr 默认是代理 IP,需配合 real_ip 模块和可信头(如 X-Forwarded-For)才能还原真实源 IP。
基础安全日志格式定义
在 http 块中定义专用日志格式,明确包含审计必需字段:
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';说明:
• $remote_addr 记录直连 IP(无代理时即真实客户端)
• $request 包含请求方法、URI、HTTP 版本(如 GET /admin.php?cmd=cat%20/etc/passwd HTTP/1.1),便于识别恶意路径或注入参数
• 补充 $request_time 和 $upstream_response_time 可辅助发现慢速攻击或后端异常响应
还原真实客户端 IP(关键步骤)
当 Nginx 前置了反向代理或 CDN 时,必须启用 ngx_http_realip_module 并配置可信来源,否则 $remote_addr 无法用于溯源:
- 确认模块已编译(执行
nginx -V 2>&1 | grep -o with-http-realip-module) - 在
http或server块中添加:set_real_ip_from 192.168.1.0/24; # 替换为你的可信代理网段 set_real_ip_from 2001:db8::/32; real_ip_header X-Forwarded-For; real_ip_recursive on;
- 确保上游代理正确设置了
X-Forwarded-For(且不被客户端伪造)
启用并验证审计日志
在 server 或 location 块中指定使用该格式,并建议单独存放日志文件以便集中分析:
access_log /var/log/nginx/security.log security;
# 可选:对高风险路径单独记录(如管理后台)
location ^~ /admin/ {
access_log /var/log/nginx/admin_access.log security;
}验证是否生效:
• 发起测试请求:curl -H "X-Forwarded-For: 1.2.3.4" http://your-site.com/test
• 查看日志输出是否显示 1.2.3.4 而非代理 IP
• 检查 $request 是否完整包含 URI 和查询参数(特别注意 URL 编码是否保留)
增强审计可用性的建议
单纯记录 $request 可能因长度截断或编码干扰影响分析,可补充以下字段提升实用性:
-
$request_uri:原始未解码 URI(不含参数,更清晰) -
$args:单独记录查询参数(便于规则匹配,如检测cmd=、phpinfo()) -
$http_x_forwarded_for:保留原始转发链(调试代理配置时有用) -
$binary_remote_addr:二进制格式 IP,节省空间且避免日志解析歧义
例如扩展格式:log_format security_extended '$binary_remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time "$args" $http_x_forwarded_for';










