90%服务器漏洞藏于日志盲区,安全审计如何破局?
|
去年二月份,凌晨一点十七分,我蹲在工位上啃半凉的饭团,后台突然弹出三十七个“日志采集异常”红点——不是告警,是采集服务自己悄咪咪挂了,连心跳都没报一声。我原以为是kafka队列积压,顺手`kubectl logs -f`一扒,结果发现日志根本没进pipeline,连buffer都空着。往前翻了两小时,所有服务端口全开着,指标全绿,健康检查全过,就是日志不落盘。像人睁着眼睛睡着了。
文章配图,仅供参考 饮水机没水了,按了半天只听见继电器咔哒响。我起身接水那会儿,小张在隔间打电话:“对对,伪原创那批……不是我说,他们抄得比我们改稿还用心。”我站在那儿听着,手还捏着饭团塑料膜,心里想:要真有人抄日志,倒也不至于漏掉0day——可惜没人抄,连抄都不屑抄。 说白了,我们审计的压根不是服务器漏洞,是“被日志放过的地方”。90%这个数我没测过,但二月那周,我盯了六台边缘节点、四套灰度集群、两个老得连Prometheus都懒得收它指标的PHP老古董,最后捅穿的三个RCE,全是日志没采、没存、没归档、没转储——它们甚至不在ES schema里,就躺在/var/log/xxx/2024-02-14.debug.log.gz里,gzip完才13KB,没人配logrotate去碰它,更没人配filebeat去捞它。它存在,但等于不存在。 群里谁发了张截图:一个带curl参数的GET请求,User-Agent写着“Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36”,后面跟了十六个urlencode过的base64,decode出来是phpinfo()和system(‘id’)。截图底下标着“来源:WAF拦截日志”。我回了个“?”,三秒后主编直接@我:“这咋没进审计流?”我愣住,去查WAF日志接入配置——哦,WAF团队上个月把debug模式关了,只留access_log;access_log里根本没记User-Agent字段,只记IP、URL、状态码、耗时。那个curl,进了WAF,进了Nginx access log,然后——消失了。连个影子都没留下。 其实吧,这事怪不了WAF。去年换过一轮日志方案,中间有三个月,日志采集链路从Logstash切到Vector,切到一半,SRE那边卡在TLS双向认证配不上,就临时用rsyslog做中转。结果rsyslog.conf里有一行`$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat`,而新入库的服务要求JSON。于是七成Nginx日志进了ES,但字段全打平了:$remote_addr变成“remote_addr”,$request_uri变成“request_uri”,连冒号都没了。审计脚本扫了一年,扫的是key名,不是值——所以它扫出一百零七次SQL注入,却漏了真正改库的那个update语句:因为字段名被抹掉了,payload藏在raw_message里,没人设rule去匹配raw_message。 窗外天已经黑了,但楼里灯还是亮的。我盯着ES里那条被标记为“正常”的日志看了四分钟:timestamp: "2024-02-14T03:22:41.198Z", level: "INFO", message: "user login success", user_id: "U_7a3b9c" ——可它下面没trace_id,没session_id,没client_ip,只有X-Forwarded-For字段被前端代理删了,后端又忘了补。我们审计的是“登录成功”,不是“谁、从哪、用什么设备、在哪种网络条件下、绕了几层CDN,点的哪个按钮”。我们审计的是日志系统愿意交出来的幻影。 前两天SEO那边的老王过来问:“你们那个‘日志盲区’选题,能塞俩关键词不?比如‘主动防御’‘智能审计’?”我盯着他工牌绳上的咖啡渍点了下头,心想:他们防的从来不是漏洞,是KPI报表里那个“高危漏洞清零率”。只要报表里没写0day,那就没有0day。管它藏在journalctl还是syslog-ng的ring buffer里呢,反正不在日报Excel里。 其实我试过用eBPF搞实时钩子,在syscall层面抓write()往/dev/log和stdout的写入,结果跑了一下午,内核panic了两次,SRE连夜把我加进黑名单。现在想想,真有点傻——连nginx access log都收不全的环境,你让eBPF去兜底?不如让运维在每台机器上cron一下`find /var/log -name ".log" -mmin -30 | xargs grep -l "exec\\|system\\|eval"`,虽然丑,但至少能看见字。工具越重,盲区越厚;路径越短,漏洞越露。这是优胜劣汰,不是技术淘汰——淘汰掉的是愿意弯腰看最后一行日志的人。 我原以为问题出在采集链路上,结果排查三天才发现,最深的盲区在“谁负责定义日志格式”这件事本身。我们有三十多个微服务,十二种语言,七套日志框架,八种日志级别命名规则,五种时间戳格式。连“ERROR”这个词,有的打大写,有的带括号ERROR:,有的写error(小写),有的写ERR……审计规则怎么写?写十套正则?还是指望开发写日志时自觉遵守《内部日志规范V3.2》?那文档PDF我记得是2019年写的,放在共享盘第7层目录里,标题还叫“草案-请勿引用”。 对了,中午去茶水间撞见运营组的阿哲,他说他们栏目考勤打卡现在强制人脸识别,比我们上线CI流水线还严。“昨天我忘打卡,自动扣半天工资。”他边说边往咖啡里倒第三勺糖。我没接话,只点头。回来路上经过测试部,听见里面吼:“这bug复现不出来啊!你当时到底点的哪儿?!”——这话说得真熟。我们审计也是,总在找“当时到底点的哪儿”,可日志里早就没了“点”的动作,只剩“结果”还在喘气。 今天还得发三篇,其中一篇要硬塞进“攻防演练专题”,编辑催了两轮。我打算把二月那份没爆出来的redis未授权访问案例改成“低风险提示”,把真正的root cause藏在第五段括号里,就写“日志归档策略未覆盖调试日志层级”。不展开,不加粗,不放加粗标签。这样既过了审核,又没完全骗自己——起码我自己知道,它在那儿。明天还得接着发,不过先去接点水,饮水机应该缓过来了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


90%服务器漏洞源于这3类无代码配置疏漏
