fix_log4j2 提供一种暂时不需要修复镜像,直接批量修改线上容器运行状态的方法,来临时缓解 log4j2 漏洞影响,大体操作思路是:
- 通过镜像扫描工具,筛选出漏洞影响镜像;
- 通过漏洞镜像,自动化定位受影响服务,提取运行参数和环境变量等信息;
- 批量服务部署的配置文件,自动化重启相关服务;
本工具使用
命令行方式
获取
-
下载源码到本地,需要golang(>=1.5)环境,进入目录执行
make build
,可执行程序会被编译到./bundles/
目录下 -
从
COS
上下载已经编译好的可执行文件
配置
配置示例
main: # kubeConfig 可选,可使用环境变量 KUBECONFIG 来指定 kubeConfig: /root/.kube/config
clue: # 需要处理的镜像列表 images: - docker.io/vulfocus/log4j2-rce-2021-12-09:latest - docker.io/library/busybox@sha256:b5cfd4befc119a590ca1a81d6bb0fa1fb19f1fbebd0397f25fae164abe1e8a6a - ccr.ccs.tencentyun.com/yunding/tcss-agent:1.8.2109.20
现阶段,镜像名称需要填入完整的名称,比如使用了来自Docker Hub
的vulfocus/log4j2-rce-2021-12-09
镜像,需要完整的填入省略的Host
和Tag
部分,即docker.io/vulfocus/log4j2-rce-2021-12-09:latest
执行
./bundles/fix_log4j -c ./config.yaml
Kubernetes Job 方式
执行kubectl apply -f https://tcss-compliance-1258344699.cos.ap-guangzhou.myqcloud.com/tools/fix_log4j2/job.yaml
工具执行逻辑
- 对k8s集群中的所有Pod进行遍历,发现引用了包含风险镜像的容器,列出待处理的Pod列表
-
根据待处理的Pod列表获取最上层调度资源,如
Deployment
,DaemonSet
等 -
对
Deployment
,DaemonSet
等资源执行修复,即检查Pod.Spec 中的Command
和Args
,如果是java
启动的,则加入-Dlog4j2.formatMsgNoLookups=true
参数 - 执行更新
风险和注意事项
-
当前版本暂时只支持对
>=2.10+
的版本,更低版本暂不支持 - 更新工作负载有失败的可能,需要关注工作负载的状态、注意对业务的影响
TODO
- 支持较老版本的修复策略
- 支持其它修复策略
- 环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true
- 支持更新后的检查,如果失败可自动回滚
- 支持镜像更新
- 支持自动检查,而不用指定具体镜像列表