nginx日志脱敏首选log_format内变量预处理,通过map精准掩码敏感参数、分段/哈希脱敏ip、禁用高危变量并显式声明安全字段,兼顾合规与可调试性。

直接在 log_format 中结合变量预处理,是 Nginx 日志脱敏最轻量、最可控的起点。它不依赖额外模块或外部工具,改完配置即可生效,从源头避免敏感字段写入日志,既满足《个人信息保护法》《GDPR》对“最小必要”采集的要求,又保留调试所需结构信息。
用 map 指令条件性替换 URL 参数
不建议直接删掉 $args,否则丢失请求路径和参数结构,影响问题定位。推荐用 map 对含敏感关键词的值做精准掩码:
- 在
http块中定义映射规则,只匹配并替换特定参数,其余保持原样 - 例如:密码类参数(
password、token、api_key)统一替换成"***" - 手机号类(
mobile、phone)也按同样逻辑处理
配置示例:
map $args $sanitized_args {
default $args;
~*(password|pwd|token|api_key|access_token)=([^&\s]+) "***";
~*(mobile|phone|tel)=([^&\s]+) "***";
}
然后在 log_format 中引用 $sanitized_args,而非原始 $args。
分段或哈希处理客户端 IP
完整 IP 属于个人信息,直接记录有合规风险。但全删又损失地域分析能力。可用内置变量灵活控制:
- 仅保留前两段:用正则提取
$remote_addr的前缀,如192.168.x.x → 192.168.0.0 - 哈希后截取(需启用
ngx_http_map_module):先哈希再取前 8 位,确保不可逆且无碰撞 - 避免简单截取或 base64 编码,这类方式仍可能被反推
示例(分段):
map $remote_addr $anonymized_ip {
default $remote_addr;
~^(\d+\.\d+)\. "$1.0.0";
}
禁用高危变量,显式声明安全字段
最稳妥的做法不是“过滤”,而是“只留可信字段”。默认 combined 格式包含多个高风险变量,应主动剔除:
- 移除
$http_cookie、$http_authorization、$http_user_agent(部分 UA 含设备 ID 或手机号) - 禁用所有
$upstream_http_*类变量,防止后端注入的敏感响应头(如Set-Cookie、X-User-ID)意外落盘 - 只显式列出结构化、低风险字段,例如:
$time_iso8601、$status、$uri、$body_bytes_sent、$upstream_response_time
示例格式:
log_format strict '$time_iso8601 | $status | $request_method | $uri | $body_bytes_sent | $upstream_response_time | $http_x_forwarded_for';
针对内网管理流量做 IP 占位脱敏
运维或后台系统常暴露在内网,管理员真实出口 IP 不应出现在日志中。可用正则匹配常见内网段,统一替换为占位符:
- 覆盖
192.168.0.0/16、10.0.0.0/8、172.16.0.0/12等典型地址段 - 使用
~^行首匹配,避免误判(如192.168.100.x不会被192.168.10.错误匹配) - 替换为
[internal]或127.0.0.1,既隐去身份,又不影响时间、状态码等排障信息
配置片段:
map $remote_addr $filtered_ip {
default $remote_addr;
~^192\.168\. "[internal]";
~^10\. "[internal]";
~^172\.(1[6-9]|2[0-9]|3[0-1])\. "[internal]";
}
再在 log_format 中使用 $filtered_ip 替代 $remote_addr。











