日志敏感信息处理需遵循“先识别、再脱敏、后留存”原则,精准定位手机号、身份证、邮箱、密码、token等字段,用sed/awk/jq掩码而非删除,并按场景分级归档或清理。

日志分析中过滤并清理敏感隐私信息,核心是“先识别、再脱敏、后留存”,不能简单删除整行,否则会破坏日志上下文和可审计性。关键在于精准定位敏感字段,用安全方式替换或掩码,同时保留时间、操作类型等必要审计要素。
识别常见敏感字段类型
不同日志格式中的敏感信息有固定模式,需结合正则和字段位置判断:
- 身份类:手机号(1[3-9]d{9})、身份证号(d{17}[dXx])、邮箱([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,})
- 凭证类:密码参数(password=([^&s]*)、token=[^&s]*)、API密钥(sk_live_[a-zA-Z0-9]{32})
- 路径与数据:含用户ID的URL路径(/api/users/(d+)/profile)、数据库连接串(jdbc:mysql://[^"]*)
- 环境信息:内网IP(10.d+.d+.d+|172.(1[6-9]|2[0-9]|3[0-1]).d+.d+|192.168.d+.d+)、主机名(hostname=([^&s]*))
用sed和awk做实时脱敏处理
不修改原始日志文件,而是生成脱敏副本或管道中处理:
- 替换密码参数:
sed 's/password=[^&]*/password=***/g' access.log - 掩码手机号(保留前3后4):
sed -E 's/1[3-9][0-9]{2}([0-9]{4})([0-9]{4})/1/g' app.log | sed 's/([0-9]{4})([0-9]{4})/****/' - 提取并脱敏Nginx日志中的IP和请求参数:
awk '{gsub(/password=[^&]*/, "password=***", $7); print $1, $7}' nginx.log - 对JSON日志中的敏感字段脱敏(需jq支持):
jq 'del(.user.token, .db.password) | .user.phone |= sub("(\d{3})\d{4}(\d{4})"; "\1****\2")' api.log
清理策略要分场景执行
“清理”不是删光,而是按合规要求分级处置:
-
生产环境日志:禁用
rm或truncate,改用logrotate配置自动归档+压缩,设置maxage 90自动过期 -
调试日志临时文件:确认无审计需求后,可用
find /tmp -name "*debug*.log" -mtime +7 -delete -
含PII的测试日志:用
grep -v筛出不含敏感词的行保存,或用awk '!/password|token|id_card/ {print}' test.log > clean.log -
审计日志(如/var/log/secure):禁止删除,只允许用
auditctl -e 0临时停止记录,事后立即恢复
自动化脚本示例(安全脱敏+归档)
以下脚本将日志中手机号、邮箱、密码参数统一掩码,并压缩归档:
#!/bin/bash
LOG_FILE="/var/log/app/error.log"
MASKED_FILE="${LOG_FILE}.masked.$(date +%Y%m%d)"
gzip_file="${MASKED_FILE}.gz"
<h1>脱敏并写入新文件</h1><p>sed -E
-e 's/1[3-9][0-9]{9}/1*<strong><em>5678/g'
-e 's/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}/user@domain.com/g'
-e 's/(password|token|key)=([^&
]+)/=</em></strong>/g'
"$LOG_FILE" > "$MASKED_FILE"</p><h1>压缩并清理原文件(仅当确认无需原始日志时)</h1><p>gzip "$MASKED_FILE"
rm "$LOG_FILE"
</p>











