Nginx日志脱敏首选log_format变量隐藏,通过map指令条件性替换敏感参数、分段或哈希处理IP、禁用高危变量并显式声明安全字段,兼顾合规性与调试价值。

直接在 Nginx 的 log_format 中做变量隐藏,是最轻量、最可控的日志脱敏起点。它不依赖模块编译或外部工具,只要改格式定义就能从源头过滤敏感字段,符合“最小日志”原则,也满足 GDPR、个保法等对日志中个人数据最小化采集的要求。
哪些变量容易泄露敏感信息
Nginx 默认 log_format combined 会记录多个高风险变量,例如:
-
$http_cookie:可能含 SessionID、Token、用户身份标识 -
$args或$request_uri:URL 参数中常见password=xxx、token=yyy、id_card=110... -
$http_referer:第三方跳转时可能携带参数,含手机号或邮箱 -
$http_user_agent:某些 SDK 或测试客户端会把设备 ID、手机号拼进 UA 字符串
用 map 指令预处理敏感字段
单纯删掉变量太粗暴,丢失调试价值;全量保留又违规。推荐用 map 实现条件性脱敏——只对含敏感关键词的值做替换,其余保持原样:
map $args $sanitized_args {
default $args;
~*(password|pwd|token|api_key|access_token)=([^&\s]+) "***";
~*(mobile|phone|tel)=([^&\s]+) "***";
}再在 log_format 中引用:
log_format secure '$remote_addr - $remote_user [$time_local] '
'"$request_method $uri?$sanitized_args $http_version" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';这样既保留了请求结构(方法、路径、协议),又抹掉了 URL 中的明文凭证。
隐藏 IP 地址但保留地域可分析性
完整 IP 属于个人信息,直接记录有合规风险。可用内置变量分段处理:
- 仅保留前两段(如
192.168→192.168.0.0/16):"$remote_addr" ~ "^(\d+\.\d+)\." "$1.0.0" - 或哈希后截取(需配合
ngx_http_map_module和md5):map $remote_addr $anonymized_ip { default md5($remote_addr); },再取前 8 位
注意:哈希方式需确保不可逆且无碰撞风险,避免用简单 base64 或截取原始 IP 字符串。
禁用高危变量 + 显式声明安全字段
最稳妥的做法是彻底移除不可控变量,只显式列出可信字段:
log_format strict '$time_iso8601 | $status | $request_method | $uri | '
'$body_bytes_sent | $upstream_response_time | '
'$http_x_forwarded_for';其中:
- 去掉
$http_cookie、$args、$http_referer等全部 HTTP 头变量 - 保留
$http_x_forwarded_for仅用于链路追踪(前提是反向代理已校验并清洗过该头) - 用
$time_iso8601替代$time_local,提升时区一致性
这种写法适合金融、政务等强合规场景,日志体积小、内容清晰、审计友好。

















