首页/安全/等保与合规速查/日志脱敏:敏感字段不能进日志

日志脱敏:敏感字段不能进日志

口令、令牌、密钥、身份证号、银行卡号、手机号等不应明文写入日志:在应用层输出前脱敏,并在采集管道做二次过滤,双保险。

等保与合规速查安全更新于 2026-10-13

为什么必须脱敏

日志的可读性是双刃剑:排查问题需要保留上下文,而上下文里最容易夹带的就是凭据与个人信息。口令、令牌、密钥、身份证号、银行卡号、手机号一旦明文落进日志,就会随轮转文件、归档包、集中平台与工单附件扩散,形成难以回收的泄露面。脱敏应在两处同时做:应用输出前拦截一次,采集管道再过滤一次,形成双保险。

基本信息

适用平台应用、网关、中间件与日志采集管道(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
身份信息:身份证号、护照、银行卡号、手机号、邮箱
业务敏感:详细地址、订单号、健康与金融数据
技术细节:内网地址与拓扑、数据库连接串、云凭据
日志元数据:不要把完整请求体与响应体整体写入
结构化日志更适合脱敏:字段明确时可以按字段配置规则,比在整行文本上做正则替换更稳,也更不容易漏字段。

易错点

  • 只在接入层脱敏:应用与终端直接落盘的日志仍是明文,需要同时覆盖本地文件
  • 脱敏规则长期不更新:新增字段常绕过既有规则,建议随需求评审同步补充
  • 用双向加密代替脱敏:能解密的日志等于没脱敏,密钥与日志放在一起尤其危险
  • 整行打印请求体:ObjectMapper 或调试日志一行输出全量参数,是泄露高发点

数据来源与参考

  • 中华人民共和国个人信息保护法(最小必要与安全保障)
  • OWASP Logging Cheat Sheet
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌