日志为什么是泄露高发区
为了排障方便,代码会把请求、参数、异常上下文原样打出来,于是日志里出现了令牌、口令、身份证号、银行卡号、数据库连接串与内网地址。日志的访问面又比业务库宽:运维、开发、日志平台、第三方监控都能读到同一份内容。写入前脱敏是唯一低成本的方案——一旦数据进入日志、备份与归档,事后清理就要逐个位置处理。
基本信息
| 敏感类型 | 凭据与令牌、个人身份信息、连接串、密钥证书、内网地址 |
|---|---|
| 处理位置 | 应用层或采集层,在写入之前完成 |
| 常用手段 | 整体掩码、局部保留、哈希、令牌化、字段丢弃 |
| 例外流程 | 确需明文排查时按审批短期开启并设到期时间 |
| 持续验证 | 定期抽样扫描日志中的敏感模式并跟踪整改 |
典型使用场景
- 异常日志打印请求体:请求体中往往含令牌与个人信息
- 调试级别打印环境变量:环境变量常含密钥与连接串
- URL 参数携带令牌:访问日志会把令牌完整记录
- SQL 日志含个人数据:语句参数直接暴露标识信息
- 配置导出含凭据:导出文件被归档后长期留存敏感值
敏感类型与处理方式
| 敏感类型 | 常见位置 | 处理方式 |
|---|---|---|
| 口令与令牌 | 请求头、URL 参数、调试输出 | 整体掩码,仅保留少量特征字符 |
| 身份证与手机号 | 业务日志、导出数据 | 掩码或哈希,禁止明文留存 |
| 数据库连接串 | 启动日志、异常堆栈 | 拆解字段,凭据部分替换为占位符 |
| 密钥与证书 | 配置打印、调试模式 | 禁止打印原文,改为输出指纹 |
| 内网地址与拓扑 | 错误信息、调试日志 | 对内部按需保留,对外统一脱敏 |
| 自由文本中的个人信息 | 用户输入、备注字段 | 按规则清洗或限长截断 |
采集层脱敏与扫描
采集层脱敏与扫描
# 采集层统一脱敏:命中规则先替换再写入存储(示意)
# 1) URL 查询参数中的令牌 2) 请求头中的凭据
sed -E 's/(token|key|password)=[^&" ]+/\1=***REDACTED***/g' access.log
# 3) 手机号中间位掩码 4) 连接串凭据部分替换
sed -E 's/1[3-9][0-9]{9}/1**MASKED**/g' app.log
sed -E 's#://[^:@/]+:[^@/]+@#://USER:***@#g' app.log
# 反向校验:定期扫描是否仍有敏感模式残留
rg -c 'password=|Bearer [A-Za-z0-9._-]{20,}' /var/log/app/ # 命中即开整改单脱敏要在写入前做,并保留可核验特征(长度或前缀)以便排障。完全按零替换会让日志失去定位价值,反而促使有人临时关闭脱敏。
临时打开明文日志必须设到期时间与访问范围,并纳入工单跟踪。历史遗留的明文日志要单独清理,包括备份与归档,否则一次泄露就把过去的记录一起带出。