概要描述
在处理log4j漏洞问题时,需要替换为最新版本的log4j jar包,替换后旧版本的jar包依旧存留于镜像中,组件拉取镜像启动时旧的jar包还在容器中,导致客户扫描时还能扫描到有问题的jar包,从而触发告警。
本篇文章通过重做镜像的方式,将旧jar包从镜像中剔除,从而解决该问题。
详细说明
- 现象如下
关于 Apache Log4j 2 远程代码执行漏洞的修复方案,执行之后search仍有容器残留旧版本jar包残留,升级后的版本为2.17.0版本,但是旧的2.8.2的jar包依旧存在。
操作步骤
-
找到当前正在使用的search镜像
这边以mll01:5000/transwarp/search: transwarp-6.2.1-final 为例 -
备份镜像
docker tag mll01:5000/transwarp/search:transwarp-6.2.1-final mll01:5000/transwarp/search:transwarp-6.2.1-final-bak -
创建合并镜像的脚本mergeLayer
脚本内容如下
#!/bin/bash docker run --name mycontainer $1 /bin/bash docker export --output=mycontainer.tar mycontainer cat mycontainer.tar |docker import - mynewimage:imported docker rm mycontainer rm mycontainer.tar
修改权限 chmod 777 mergeLayer
-
使用脚本生成层数为1的名为mynewimage:imported sh mergeLayer mll01:5000/transwarp/search:transwarp-6.2.1-final
-
创建Dockerfile
docker inspect mll01:5000/transwarp/search:transwarp-6.2.1-final |jq -r .'[]’.ContainerConfig.Env[] >Dockerfile
sed -i ‘1,$ s/^/ENV /g’
Dockerfile sed -i ‘1i FROM mynewimage:imported’ DockerfileDockerfile内容大概如下:
[root@mll01 bruce]# cat DockerfileFROM mynewimage:imported ENV PATH=/usr/java/jdk1.8.0_25/bin:/usr/java/jdk1.7.0_71//bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/zookeeper/bin:/usr/lib/transwarp/scripts:/usr/lib/transwarp/scripts ENV LC_ALL=en_US.UTF-8 ENV JAVA7_HOME=/usr/java/jdk1.7.0_71/ ENV JAVA8_HOME=/usr/java/jdk1.8.0_25 ENV JAVA_HOME=/usr/java/jdk1.8.0_25 ENV GUARDIAN_PLUGINS_HOME=/usr/lib/guardian-plugins ENV GUARDIAN_PLUGINS_CONF_DIR=/usr/lib/guardian-plugins/templates ENV ZOOKEEPER_HOME=/usr/lib/zookeeper ENV TRANSWARP_SCRIPT_HOME=/usr/lib/transwarp/scripts ENV ZOOKEEPER_CONF=/etc/zookeeper/conf ENV TRANSWARP_DATA_HOME=/var/transwarp ENV TRANSWARP_HOME=/usr/lib/transwarp ENV TRANSWARP_DIR=/var/transwarp ENV LOGDIR=/var/transwarp/logs ENV SOCKETDIR=/var/run/hadoop-common ENV HADOOP_CONF_DIR=/etc/hadoop/conf ENV DATA_DIRS=/data ENV HADOOP_COMMON_HOME=/usr/lib/hadoop ENV DEFAULT_CONTAINER_EXECUTOR=TRUE ENV ES_SCRIPTS_PATH=/usr/lib/transwarp/scripts ENV ES_HOME=/usr/lib/elasticsearch/elasticsearch-5.4.1-transwarp ENV CONF_DIR=/etc/elasticsearch/conf ENV DATA_DIR=/var/data/elasticsearch ENV LOG_DIR=/var/log/elasticsearch ENV PID_DIR=/var/run/elasticsearch ENV ES_USER=elasticsearch ENV ES_GROUP=elasticsearch
-
重新生成镜像 docker build -f Dockerfile -t mll01:5000/transwarp/search:transwarp-6.2.1-final ./
-
上传新的镜像 docker push mll01:5000/transwarp/search:transwarp-6.2.1-final
-
配置服务重启search
-
重启完成之后,每个节点执行docker system prune -a 清理无用container
-
查看log4j.*jar ,只剩最新版本的2.17的了