最有效、最可控的防泄露手段是直接改日志格式;需精简log_format,移除$request_body、$http_cookie等高危变量,禁用查询参数,启用脱敏、权限管控与TLS传输等多重防护。

直接改日志格式是最有效、最可控的防泄露手段。Nginx 默认的 combined 格式会记录 $request(含完整 URL 和查询参数)、$http_cookie、$http_authorization 等,极易把 Token、密码、身份证号等明文写进日志文件。
精简并重定义 log_format
在 http 块中删除所有高风险变量,只保留必要字段:
- 坚决移除
$request_body(请求体,常见于 POST 登录、表单提交) - 禁用
$http_cookie、$http_authorization、$http_x_api_key等认证类头 - 避免直接记录
$request;改用$request_method $uri $server_protocol,不带$args(即过滤掉 URL 中的所有查询参数) - 示例安全格式:
然后在 server 或 location 块中启用:
access_log /var/log/nginx/access.log safe;
对已存在的敏感字段做脱敏处理
有些字段无法完全删掉(如 $remote_addr 可能需用于风控),但可做掩码化:
- 用 Nginx 内置 map 指令匿名化 IP:在
http块中添加
default "***.***.***.***";
~^(\d+\.\d+)\. "$1.0.0";
}
再在日志格式中用 $masked_ip 替代 $remote_addr
- 对 URI 中特定路径(如
/api/login)强制屏蔽请求体和参数:用if+set配合空值覆盖,或用log_by_lua在写入前清洗(需启用 lua 模块)
收紧日志访问与生命周期管控
即使内容干净,权限松散也会导致二次泄露:
- 日志文件属主设为
root:adm,权限严格限制为640(非 root 用户无法读取) - 用
logrotate强制压缩归档,7 天内自动删除,配置中加入compress和maxage 7 - 禁止将日志直接挂载到 Web 可访问路径(如
/var/www/logs/),防止 .log 文件被意外下载 - 错误日志级别设为
warn或更高:
error_log /var/log/nginx/error.log warn;(避免debug级别输出堆栈和原始请求)
补充性防护不可跳过
日志只是链路一环,必须配合其他措施堵住源头:
- 敏感接口(如含身份证、手机号的 POST)应走专用 location,并用
limit_req限流 +deny非白名单来源 - 客户端提交敏感数据时,前端应避免在 URL 参数中传 Token 或 ID;后端统一校验并拒绝含敏感参数的 GET 请求
- 若使用日志集中采集(如 Filebeat → ELK),传输链路必须启用 TLS 加密,且采集端做字段过滤(不能依赖 Nginx 单点控制)
- 每月人工抽样检查 access.log 和 error.log 的前 100 行,搜索
id_card=、token=、password=等关键词











