90%高危漏洞藏于日志盲区:服务器安全审计实战
|
去年七月,我蹲在客户机房第三排U17那台DELL R730旁边听告警声的时候,窗外在下那种黏糊糊的黄梅雨,玻璃上全是斜着爬的水痕,空调冷凝水滴在UPS柜顶上——嗒、嗒、嗒——像在给我倒计时。老张叼着没点着的烟站在梯子上换风扇,手抖得厉害,烟掉进散热口里了,他伸手去掏,烫得缩了一下,又骂了句“操”,然后继续抠。 我原以为漏扫报的CVE-2023-27997是主因,结果日志一拉出来——全空。不是删了,不是轮转了,是压根没写。/var/log/audit/audit.log 三小时只记了两行 selinux avc denied,而那台被黑穿的Tomcat进程连execve调用都没留下半条。Nginx access_log 里藏着十二个404爆破路径,但 error_log 里连个upstream timeout都不肯报。syslog-ng 的filter配置写了十七行正则,唯独把 systemd-journald 转发的 journal 日志关掉了,就因为某人说“journald 吃内存”。 对,就是那个姓周的,穿灰 polo 衫那个,上个月还指着 Grafana 面板说“我们日志覆盖率98.6%”,结果审计脚本一跑,发现他写的 rsyslog.conf 里有行注释:“# 这块儿先跳过,等下周重构”——注释后面跟着整整四百二十一行转发规则,其中三百零九行匹配的是 “^$”(也就是永远不匹配)。我当场把他笔记本合上了,他伸手想抢,手肘撞翻了桌上那盒吃剩三分之二的麻婆豆腐外卖,红油顺着键盘缝往下渗,滴到地上,混着地板上常年没擦净的灰尘结成暗红痂块。 你猜最后怎么定位到的?不是ELK,不是Splunk,不是SOC平台,是 grep -r 'java.-Dcom.sun.management' /etc/init.d/ 顺藤摸出一个被注释掉的 JMX 远程管理端口配置,再 ssh 进去翻了翻 ~/.bash_history——里面藏着一条 curl -X POST http://127.0.0.1:9090/api/v1/jobs 的记录,时间戳比最后一次系统重启早十八秒。就这十八秒,没人看见。因为 systemd-journald 记录 reboot 是按 timestamp_monotonic 算的,而 curl 那条命令触发的是 auditd 的 syscall event,两个时间源差了三百七十二毫秒,日志聚合器直接当乱序丢弃。这个我敢打包票。 后来发现他们三年没动过的 /var/log/messages 权限是 600,但 logrotate 配置文件里写了 create 644 root root ——于是每次轮转都自动生成一个全世界可读的新文件,里头堆着 cron 的 PATH 环境变量泄露、sudoers 里那行 Defaults env_keep += "JAVA_HOME",还有某次运维手工改 Tomcat server.xml 时留下的明文数据库密码。但这批文件全被 logrotate 自动压缩成 .gz 了,而他们部署的 SIEM 接收器只认 .log 和 .json。所以这些高危数据,物理上存在,逻辑上隐身,技术上合法,流程上免责。 我说不准当年为啥要把 /var/log/sa/ 下的 sa16 删掉——反正监控告警邮件里抄送了六个邮箱,其中四个地址已经退订,两个自动转发到个人 Gmail。那天下午三点十七分,安全组小李接了个电话,听筒里声音太响,我听见一句“……对,那个WAF白名单加一下IP就行”,他挂了以后直接在工单系统里点了“已处理”,没填变更单,没走审批流,更没碰 auditctl。而那个IP,正好是同一分钟内从 /var/log/secure 里消失的最后一个 su - root 成功记录来源。这事儿我没查,也没提,就看着他往咖啡杯里第三次加奶精。 优胜劣汰不是算法,是活人排队。谁的日志最先断、最碎、最不可信,谁的漏洞就被筛到最后;谁的 alert 最晚触发、最常误报、最难复现,谁的入侵就最慢被捞出来。上个月有个客户问我:能不能加个功能,把“日志缺失”本身变成一个指标?我说能,但你要先告诉我——当一台服务器的 /var/log/kern.log 里连续三天没有一次 dmesg 输出,这是硬件故障、内核静默、还是有人改了 kernel.printk?我说不准。真说不准。 现在我写脚本不默认开 auditd,先 check /etc/audit/rules.d/ 下有没有 .rules 文件,再 cat /proc/sys/kernel/audit。要是这两个都空,直接 exit 1。我不动它日志轮转策略,但会强制把 /var/log/journal/ 目录 chown root:adm && chmod 2750 ——因为 systemd-journald 默认只把 journal 写给 wheel 组,而多数生产环境的 auditors 根本不在 wheel 里。上周试了三台机器,两台没反应,一台 reboot 后 journalctl --list-boots 报“Failed to get journal objects”。我就把它扔那儿了。反正,总得有人先踩一脚泥。
文章配图,仅供参考 桌角那台戴尔的硬盘灯一直绿着,但 IO wait 超过92%,我看了一眼 iostat,没动。旁边老张终于把风扇按回去了,转身去拧机柜门锁,咔哒一声,锁舌弹进去了。我手机震了一下,是家里发来的照片:小孩在画一辆消防车,涂成蓝白相间,车顶画了两个旋翼。不是警车,也不是救护车。就是个消防车。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


多媒体服务器安全审计:90%漏洞源于3个忽视配置
微软发现与Log4j有关的高危漏洞
Bugcrowd 2021年高危漏洞数量大幅增加