为什么必须脱敏
日志的可读性是双刃剑:排查问题需要保留上下文,而上下文里最容易夹带的就是凭据与个人信息。口令、令牌、密钥、身份证号、银行卡号、手机号一旦明文落进日志,就会随轮转文件、归档包、集中平台与工单附件扩散,形成难以回收的泄露面。脱敏应在两处同时做:应用输出前拦截一次,采集管道再过滤一次,形成双保险。
基本信息
| 适用平台 | 应用、网关、中间件与日志采集管道(Linux 服务器侧) |
|---|---|
| 高频敏感项 | 口令、验证码、Token、Cookie、密钥 |
| 身份信息 | 身份证号、护照、银行卡号、手机号、邮箱 |
| 脱敏方式 | 掩码替换、截断、单向哈希(需保留比对能力时) |
| 合规依据 | 个人信息保护法的最小必要与安全保障要求、OWASP 日志实践 |
典型使用场景
- 接口排查:请求参数里带着手机号与令牌,需要先脱敏再落盘
- 错误堆栈记录:异常信息常把整个请求体打印出来
- 网关访问日志:URL 查询串里的敏感参数容易被整体写入
- 集中平台入库:在采集管道再加一道规则,兜住应用漏过的字段
- 日志外发或工单:把日志片段提供给第三方前必须复核敏感字段
Python 侧脱敏示例
Python 侧脱敏示例
import re
PHONE = re.compile(r"(1[3-9]\d)\d{4}(\d{4})") # 手机号掩码
IDCARD = re.compile(r"(\d{6})\d{8}(\d{4})") # 身份证掩码
SECRET = re.compile(r"(?i)(password|token|secret)=([^&\s]+)") # 凭据抹除
def mask(text):
text = PHONE.sub(r"\1****\2", text)
text = IDCARD.sub(r"\1********\2", text)
return SECRET.sub(r"\1=***", text)
print(mask("login phone=13800001234 password=Abc123"))脱敏范围清单
脱敏范围清单
认证信息:口令、验证码、Token、Cookie、密钥、会话 ID
身份信息:身份证号、护照、银行卡号、手机号、邮箱
业务敏感:详细地址、订单号、健康与金融数据
技术细节:内网地址与拓扑、数据库连接串、云凭据
日志元数据:不要把完整请求体与响应体整体写入结构化日志更适合脱敏:字段明确时可以按字段配置规则,比在整行文本上做正则替换更稳,也更不容易漏字段。