本文来自用户南瓜投稿
去年 log4j 破绽暴发时候就曾经很苦楚了,过后把所有的线上服务排查了一遍。没想到这都曾经过来 3 个月了,上周又遇到了一个服务仍在应用低版本,被内部攻打,有点受伤。
这件预先,老板让我全量扫一遍咱们的代码库,看还有哪些服务还在用老版本的 log4j,对立推一波修复,避免后续在产生此类事件。
计划调研
计划一(放弃)
过后我第一反馈是写个脚本,遍历所有我的项目,再拉取我的项目到本地,通过正则匹配的形式辨认代码中是否应用了 log4j,并提取版本,并依据版本号判断是否有破绽。但前面想了下,这个破绽检测形式不具备通用性。一是组件判断很麻烦,咱们通常说的组件名和配置文件中的组件名基本不是一回事,不是很好对应,二是如果后边再有其余破绽,还要从新写正则,着实麻烦。
计划二(胜利)
在 github 上搜了下开源我的项目,看看有没有能对我的项目做组件扫描的工具,找了半天找到了一个叫 Murphyscan 的开源我的项目,比拟满足我的需要。思路是写个脚本,先通过 gitlab 接口获取我的项目列表,而后 clone 代码到本地,而后通过 Murphyscan 提供的客户端扫描,解决扫描后果获取指标破绽组件。
脚本流程
为寻求便捷、高效,应用 python3 编写脚本,具体流程如下:
- 通过 python-gitlab 包,调用 gitlabapi,获取我的项目列表及 clone 链接。
- clone 代码到本地
- 调用 Murphyscan 客户端,扫描我的项目
- 解决扫描后果(扫描后果为 json 类型),遍历破绽,发现指标破绽打印我的项目名及我的项目提交者。
-
删除 clone 代码
进一步,增量检测
全量检测搞定,老板交代的工作算是搞完,情绪愉悦,但有一个问题,如果哪个程序员手抖,援用组件时候,又引入一个低版本的,那老板岂不是要杀我祭天。怀着忐忑的情绪调研了下怎么扫描增量服务。
通过调研发现,gitlab 有一个叫 webhook 性能。他的性能是,管理员能够指定 push、merge 等动作触发时,向某个指定接口告诉该事件,这样我就能够晓得有代码更新或者创立。拿到告诉后我就去拉取最新代码,再扫描一次,发现有破绽后通过机器人揭示我,这样增量检测就搞定了。gitlab 配置
进入 Gitlab 平台,点击顶部【菜单】-【管理员】进入管理中心
- 抉择零碎钩子进入 Webhook 设置页面
- URL 处填写 python 起的 webapi 接口地址
- 下方触发器中确保【仓库更新事件】处于勾选状态
- 去掉【启用 SSL 验证】的默认勾选
- 点击【增加零碎钩子】实现设置
webapi
通过 fastapi 起了一个 web 服务,其性能次要是接管 gitlab 的 webhook 事件推送,收到事件后,拉取我的项目代码,并进行扫描,同样扫描后果会通过飞书机器人将有问题的我的项目检测后果推送给我。
待优化
目前代码还有些问题,次要是目前流程还是单线程的,咱们公司我的项目量和代码更新量比拟少的状况下还能够,如果代码更新比拟频繁,可能会导致应用 webapi 线程过多,服务解体。后续会通过工作队列模式,将 webhook 接口和破绽检测拆开,通过工作队列治理检测工作。
我的项目地址
该我的项目已奉献给 MurphySecurity,
我的项目地址:https://github.com/murphysecurity/murphysec-gitlab-scanner.git