加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0716zz.cn/)- 图像处理、语音技术、媒体智能、运维、低代码!
当前位置: 首页 > 服务器 > 安全 > 正文

服务器安全审计:90%高危漏洞藏于日志盲区

发布时间:2026-11-06 14:27:40 所属栏目:安全 来源:DaWei
导读:  前年那个凌晨三点十七分,我盯着终端里tail -f /var/log/audit/audit.log的输出,光标卡在第1842行不动了——不是卡,是根本没新行刷出来。这时候李工端着保温杯撞进机房,杯底磕在机柜横梁上那声“铛”,比上次他把rsyslo

  前年那个凌晨三点十七分,我盯着终端里tail -f /var/log/audit/audit.log的输出,光标卡在第1842行不动了——不是卡,是根本没新行刷出来。这时候李工端着保温杯撞进机房,杯底磕在机柜横梁上那声“铛”,比上次他把rsyslog.conf里$ActionFileDefaultTemplate那行注释掉时还脆。我说你听没听见?他说听见啥?我说审计日志漏了一整个fork()子进程的capability drop记录。他嘬了口枸杞水,说:“哦,那个啊,systemd-journald早把它吞了。”


  服务器安全审计:90%高危漏洞藏于日志盲区。这话说出口的时候,我在内网复盘通报里写完就删了两遍——不是怕领导看见,是怕张薇看见。她去年审完三十七台容器节点的日志轮转策略后,在钉钉文档评论区打了一整屏“/dev/null 有权限,/proc/sys/kernel/kptr_restrict 没配,你让auditd记啥”。后来她转岗去蓝军了,走之前把Jenkins流水线里所有grep -v "denied"的管道全改成了grep -E "(denied|failed|invalid)",连中间那个空格都多加了转义。这个我敢打包票。


  凉掉的外卖在工位右下角塑料袋里塌成一摊油渍,葱花粘在袋子折痕上,像段没被syslog-ng采集的结构化日志。我原以为盲区在日志采集中间件,结果查到一半发现是kernel audit subsystem里一个叫audit_filter_rules()的函数,对uid为0但gid不为0的进程调用直接跳过规则匹配——这个补丁是十八个月前合进mainline的,我们用的定制内核镜像编译时间戳显示是十九个月前。我对着patch diff看了七分钟,直到打印机开始吐那批被退回三次的标题页:《面向零信任的日志覆盖度评估框架(V2.3)》。第二页第三段有个错字,“缺失”打成了“缺生”,没人改,因为后面附录里的CVE编号列表已经校对到凌晨四点二十三分。


  刘总发来的六十秒语音到现在还躺在微信对话框里没点开。内容我猜得八九不离十:“审计工具要能出报告……不能光让攻防同事手动翻……成本要可控……”但他没说怎么定义“可控”。上次他看我演示实时关联分析,指着屏幕上跳动的syscalls计数器问:“这数字涨得快,是不是代表问题多?”我没接话。后来运维老周自己搭了个Prometheus exporter,把auditd的auditctl -s返回值里那个“enabled:2”硬拆成三个Gauge指标——结果监控告警阈值设成2.5,连续崩了三天。这个我说不准,可能他就是故意设错的。


  审稿间的灯管滋啦响了四十七次才彻底熄灭。我数着的,因为第四十六次亮起时,屏幕上刚好跳出sudo -l的输出里混着一条被截断的strace -e trace=capset命令调用——而这条记录根本没进journald,也没进fluent-bit转发队列。它卡在audit_buffer里,等一个永远不来flush的cond_resched()。我们用了三年半的logrotate配置里那句maxsize 100M,其实早就该改成maxsize 104857600;但没人动,因为上一次修改记录是二百三十一行之前的changelog,写着“适配新审计框架(未上线)”。


  印刷对接的电话在抽屉里震了六次,我捞出来看见是王姐,排版公司那边说封面UV工艺做不了细字体。我说行,把字号从9.5pt拉到10pt吧。她说那正文行距就得调,我说调。挂了之后想起上月在客户现场抓包,看到他们ELK pipeline里logstash-filter-grok的正则里,把sshd的Failed password和Invalid user两种模式硬揉在一个pattern里——导致所有匹配失败的登录尝试全部变成_unmatched。这个事儿我本来打算提,但当天下午被拉去救火:某节点的systemd-coredump目录突然长出三百七十二个dump文件,全卡在core_pattern设置的pipe命令里,没触发audit规则,更没进任何SIEM。我蹲着看journalctl -u systemd-coredump.service -n 500的时候,手机在口袋里又震了一下,是另一个客户发来的日志片段截图,只有四行,全是空格开头的,最后那个字符是U+00A0。我截了图发给实习生小陈,让她查Unicode Normalization Form,她回我个“?”和一张火锅照片。


  优胜劣汰不是玄学。是每次甲方把“日志全覆盖”写进标书附件二的第五条时,乙方工程师默默删掉配置里的-a always,exit -F arch=b64 -S execve -k exec_audit,换上更短的-a always,exit -F path=/bin/sh -k shell_exec;是当SOC平台告警阈值设到每分钟120条event_id 4688时,真实环境里每天凌晨两点零三分必然涌进来两千一百条,只因某云厂商的Agent更新脚本默认开启了--no-audit-flag;更是去年十一月审计组抽样核查时,用的还是三年前旧版splunk TA插件,而新版本里已经把auditd的type字段解析逻辑从regex改成了json_extract——这事我查过源码,commit hash f8d1a7c9后面跟了三行注释,其中一行写着“for compatibility with legacy log lines (don’t rely on this)”。


文章配图,仅供参考

  现在我把tail -f换成了ausearch -m all --start yesterday --raw | aureport -f -i,虽然它跑完要四分半钟。显示器右下角校样稿还开着,第三页脚注里有个reference链接,404了,但我懒得修——反正没人真点。下礼拜要陪蓝军那边做红蓝对抗复盘,他们答应让我看看他们的流量回放系统里,那些没进syslog、没进journald、甚至没触发netlink socket event的,到底都长什么样。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章