grep -o 'password=[^&]*' app.log | head # 采集端再加一条替换规则 sed -E 's/(password=)[^&]*/\1***/g' app.log
排查问题时 grep 了一下应用日志,登录那条记录完整打印了 password 字段,注册接口更是把身份证号和银行卡一起写了进去。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,统一的日志切面把请求体原样序列化,敏感字段没做过滤,日志又会进集中采集和异地备份,等于把明文凭据复制到了更多地方。
围绕「日志脱敏」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
处理上按这个顺序:序列化之前按字段名把密码 token 证件号统一换成掩码;把线上日志级别降到 info,只在排查问题的时候临时打开 debug;已经落盘的日志按保留策略清掉并通知相关负责人。
改完只确认一件事:同样请求再打一次,日志里密码位置显示星号,其它字段完整。
