这个坑值得记一笔。网关加了请求体脱敏,日志里 body 中的手机号已经变成掩码,安全扫描仍在响应头里发现 Authorization 原文和内部 trace token,落盘日志同样有。

刚开始盯着「访问日志格式里带 %{Authorization}i」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。脱敏只覆盖 body,header 走了另一条日志管道;网关把上游响应头原样透传并打了日志;错误堆栈把请求头整体打印出来。

动手时先确认访问日志格式包含哪些字段

grep -n 'log_format' /etc/nginx/nginx.conf

从日志格式里去掉敏感头

python -c "print('log_format main \'$request_method $uri $status\';')"

再往下在出口统一过滤响应头

curl -s -D - http://gw/health | grep -i -E 'authorization|x-trace-token'

剩下的就是对历史日志做一次扫描与清理

python -c "print({'files':128,'hits':7})"

改完先别撤,确认这几项。新产生的日志里不再出现完整 token,扫描历史文件命中数为零,链路追踪仍能按 trace id 关联。

脱敏要按数据流而不是按字段做,header、错误栈、访问日志三条路径经常被漏掉。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189