日志是敏感数据最常见的出口
凭据泄漏最常见的路径不是被攻破,而是被写进了日志:脚本打开命令回显后把展开的变量打印出来,错误处理把整个配置对象序列化进堆栈,访问日志把带令牌的查询参数原样记下。日志的特点是留存时间长、访问人员多、还会被采集到集中平台并被更多人检索,一旦写入就等同于扩散。防护要在写入之前完成,事后清理只能降低影响而不能消除。
基本信息
| 适用对象 | 脚本输出、应用日志、访问日志、采集平台 |
|---|---|
| 主要出口 | 命令回显、变量打印、异常堆栈、请求参数、命令行 |
| 防护层次 | 产生端抑制、写入端过滤、采集端二次过滤 |
| 权限要求 | 日志目录应限制访问,读取集中日志需对应权限 |
| 保留期 | 按合规要求设定,过期数据主动清理 |
常见泄漏出口
- 命令回显:打开执行跟踪后,包含敏感值的整条命令被打印
- 变量打印:调试语句直接输出整个配置对象,其中夹带凭据字段
- 异常堆栈:错误信息里带出连接串与请求头
- 访问日志参数:令牌放在查询串上时会被完整记录
- 请求与响应头记录:开启头部记录后授权头会进入日志
- 失败现场保留:任务失败时为便于排查保留的环境与参数快照
抑制与检查
抑制与检查
set +x # 处理敏感值前关闭回显
pass=$(cat /run/secrets/db_password) # 从注入通道读取,不硬编码
unset pass # 用后立即清理
mytool --password-stdin < /run/secrets/db_password # 优先用标准输入而非参数
grep -rniE '(token|secret|password)=' /var/log/app | head -20 # 事后核查
awk '{print length, $0}' app.log | sort -rn | head -5 # 找出异常长的日志行,长行常含明文出口与抑制手段
| 出口 | 典型成因 | 抑制手段 |
|---|---|---|
| 命令回显 | 打开执行跟踪 | 敏感段前关闭并局部启用 |
| 变量打印 | 调试语句未清理 | 改为按字段输出或打码 |
| 异常堆栈 | 错误信息序列化整个对象 | 异常信息只保留必要字段 |
| 访问日志参数 | 令牌放在查询串 | 改用请求头或请求体 |
| 集中日志 | 采集端不做过滤 | 采集规则中加脱敏规则 |
验证脱敏是否有效要靠检索而不是靠人工看:用已知的敏感字段名与值样式在生产日志里全量搜索一遍,比抽查更可靠。搜索也要覆盖历史归档与备份,这两个位置最容易被遗漏。
发现明文凭据进入日志后的正确顺序是:确认范围、轮换凭据、再清理日志。先清日志会破坏取证依据,也会让人误判风险已经消除,而凭据此时仍然完全可用。