换包后旧版本jar包遗留问题

  其他常见问题
内容纲要

概要描述

在处理log4j漏洞问题时,需要替换为最新版本的log4j jar包,替换后旧版本的jar包依旧存留于镜像中,组件拉取镜像启动时旧的jar包还在容器中,导致客户扫描时还能扫描到有问题的jar包,从而触发告警。

本篇文章通过重做镜像的方式,将旧jar包从镜像中剔除,从而解决该问题。

详细说明

  • 现象如下
    关于 Apache Log4j 2 远程代码执行漏洞的修复方案,执行之后search仍有容器残留旧版本jar包残留,升级后的版本为2.17.0版本,但是旧的2.8.2的jar包依旧存在。

操作步骤

  1. 找到当前正在使用的search镜像

    这边以mll01:5000/transwarp/search: transwarp-6.2.1-final 为例

  2. 备份镜像
    docker tag mll01:5000/transwarp/search:transwarp-6.2.1-final mll01:5000/transwarp/search:transwarp-6.2.1-final-bak

  3. 创建合并镜像的脚本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

  4. 使用脚本生成层数为1的名为mynewimage:imported sh mergeLayer mll01:5000/transwarp/search:transwarp-6.2.1-final

  5. 创建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’ Dockerfile

    Dockerfile内容大概如下:
    [root@mll01 bruce]# cat Dockerfile

    FROM 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
  6. 重新生成镜像 docker build -f Dockerfile -t mll01:5000/transwarp/search:transwarp-6.2.1-final ./

  7. 上传新的镜像 docker push mll01:5000/transwarp/search:transwarp-6.2.1-final

  8. 配置服务重启search

  9. 重启完成之后,每个节点执行docker system prune -a 清理无用container

  10. 查看log4j.*jar ,只剩最新版本的2.17的了

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。