背景说明

在去年2021-12-09左右,那时候log4j 2的远程代码执行漏洞,Java程序员和运维在朋友圈疯狂转发,当初定义的CVE号为:CVE-2021-44228 ,然后影响版本只是Apache Log4j 2.x <= 2.14.1受该漏洞影响,Log4j1.x声明是不受到此漏洞影响范围内的,临时构建出来了2.15.0-rc2防护版本,但是后续不让人消停啊。

官方于又于2021.12.13号官方已经发布稳定修复漏洞版本 https://logging.apache.org/log4j/2.x/download.html  「2.16.0」,看了一下提交记录,删除了Messge Lookups的方法。

大家以为的终极版本2.16.0出来后,又爆出DOS拒绝服务攻击漏洞,所以官方在「2021.12.17」又推出了最新版本 「2.17.0」

继官方推出2.17.0版本修复DOS拒绝服务攻击后,又出现远程代码执行 (RCE) 攻击的特征漏洞,官方于2021.12.28推出了 「2.17.1」  版本,虽然此漏洞的利用条件极高,需要可以控制配置文件,但是官方评分还是6.6分(https://logging.apache.org/log4j/2.x/security.html#),属于「中危漏洞」

最近看官方,2022-02-23又升级到2.17.2了,但是看官方安全说明是正常迭代,不涉及修复关联漏洞。

利用Java语言开发的程序其实好多都在用Log4j日志框架,当然也包括我们常用的开源服务kafka、zookeeper、Nacos等。

比如这些开源的服务就有一个特征,就是当你线上使用是较老一点点的版本,基本里面引用的都是Log4j 1版本,虽然log4j 2的远程代码执行漏洞没有连累1.x版本,但是1.x版本也有漏洞(CVE-2020-9488 CVE-2019-17571), 而且1.x版本是EOL状态的版本,并且最新1.x版本的包是没有解决漏洞问题的。

EOL代表不再维护迭代的版本, 所以一般对于安全性要求高的公司,这种情况是不允许的,所以理想的处理办法是在不修改源码的情况下能够修复这些漏洞,同时满足生产安全要求,如果实在不行,只能让有编程开发能力的同学拉取官方对应版本代码分支重新编译一个版本。

从log4j2的官网https://logging.apache.org/log4j/2.x/了解到,log4j1.x和log4j2.x是存在一定的兼容性的,它们实现的都是SLF4J的API,理论上来说是可以通过替换Jar包切换的, 所以今天我这里介绍一下Kafka和Zookeepr替换修复的方法。

我这里还是以官方最新发布的2.17.2的版本为例子。

zookeeper从log4j1.x升级到log4j2.x

基本信息,kafka版本:3.4.14  操作系统:Centos7.9  Java版本:1.8.0_152 ,升级过程如下。

1、下载官方最新log4j 2.17.2版本包并解压

wget --no-check-certificate https://dlcdn.apache.org/logging/log4j/2.17.2/apache-log4j-2.17.2-bin.tar.gztar xf apache-log4j-2.17.2-bin.tar.gz

2、同时下载要替换的slf4j-api 1.7.32版本jar包

wget --no-check-certificate https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar

3、查询zookeeper引用信息

[root@labs zookeeper]# ls lib/ |grep -Ei 'log4j|slf'
log4j-1.2.17.jar
slf4j-api-1.7.25.jar
slf4j-log4j12-1.7.25.jar

然后分别删除slf4j-log4j12、slf4j-api和log4j三个包:

[root@labs kafka]# rm -f lib/{slf4j-log4j12-1.7.25.jar,slf4j-api-1.7.25.jar,log4j-1.2.17.jar}

4、替换新包

分别把apache-log4j-2.17.2-bin目录下的:

log4j-1.2-api-2.17.2.jar
log4j-api-2.17.2.jar
log4j-core-2.17.2.jar
log4j-slf4j-impl-2.17.2.jar

slef4j-api-1.7.32.jar同步到zookeeper安装目录下的lib目录下。

5、关闭jmx

如果不关闭jmx,zookeeper启动会报类(org.apache.log4j.jmx.HierarchyDynamicMBean)找不到,详情如下:

[root@labs zookeeper]# cat /data/logs/zookeeper/zookeeper.out
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/jmx/HierarchyDynamicMBeanat org.apache.zookeeper.jmx.ManagedUtil.registerLog4jMBeans(ManagedUtil.java:51)at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:77)at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:55)at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:119)at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:81)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.jmx.HierarchyDynamicMBeanat java.net.URLClassLoader.findClass(URLClassLoader.java:381)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 5 more

如上源码可知前置条件是JMX开启才才会加载此类实例化,并不是直接import的, 因为zookeeper启动可以设置参数来控制是否启用jmx,所以简单粗暴的方式就是,直接修改启动脚本bin/zkServer.sh,然后启动。

ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY -Dzookeeper.jmx.log4j.disable=true org.apache.zookeeper.server.quorum.QuorumPeerMain"

但是这有个问题,就是你全局禁用了,so,可能影响jmx监控数据的采集,所以可以看看源代码尝试完全修复 or 临时跳过,最简单:

if (Boolean.getBoolean("zookeeper.jmx.log4j.disable") == true) {return;}
改成:
if (1 == 1) {return;}

5、测试可用性

  1. 启动zookeeper服务,看看是否可以正常运行;

  2. 然后利用zkCli.sh客户端连接,进行create,get等操作验证。

kafka从log4j1.x升级到log4j2.x

基本信息,kafka版本:2.2.2   操作系统:Centos7.9  Java版本:1.8.0_152 ,升级过程如下。

1、下载官方最新log4j 2.17.2版本包并解压

wget --no-check-certificate https://dlcdn.apache.org/logging/log4j/2.17.2/apache-log4j-2.17.2-bin.tar.gztar xf apache-log4j-2.17.2-bin.tar.gz

2、同时下载要替换的slf4j-api 1.7.32版本jar包

wget --no-check-certificate https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar

3、查询kafka引用信息

[root@labs kafka]# ls libs/ |grep -Ei 'slf|log4j'
kafka-log4j-appender-2.2.2.jar
log4j-1.2.17.jar
slf4j-api-1.7.25.jar
slf4j-log4j12-1.7.25.jar

然后分别删除slf4j-log4j12、slf4j-api和log4j三个包:

[root@labs kafka]# rm -f libs/{slf4j-log4j12-1.7.25.jar,slf4j-api-1.7.25.jar,log4j-1.2.17.jar}

4、替换新包

分别把apache-log4j-2.17.2-bin目录下的:

log4j-1.2-api-2.17.2.jar
log4j-api-2.17.2.jar
log4j-core-2.17.2.jar
log4j-slf4j-impl-2.17.2.jar

slef4j-api-1.7.32.jar同步到kafka安装目录下的libs目录下。

5、测试可用性

  1. 启动kafka服务看看可以正常启动吗;

  2. 利用自带生产者工具kafka-console-producer.sh和消费者工具kafka-console-consumer.sh测试功能。

如何把kafka Log4j1.x升级到Log4j2.x ?相关推荐

  1. log4j升级到log4j2 spring

    目录 基础知识 日志系统对应的jar包和推荐依赖 pom.xml 代码可能要修改的地方 log4j2的配置文件 个人问题杂记 去掉父工程的依赖 log4j2异步日志包缺失时报错 mybatis-spr ...

  2. linux上设置了log4j没有产生日志文件_关于 log4j 升级到 log4j2 的小结

    关于升级 jar 包等前提要求 删掉原先的 log4j-1.XX 等 jar 包 从 1.XX 升级到 2.XX 平稳升级需要的 jar 包,其中包括用 sl4j-1.7.25 (1.7.21 暂时也 ...

  3. log4j平稳升级到log4j2

    一.前言 公司中的项目虽然已经用了很多的新技术了,但是日志的底层框架还是log4j,个人还是不喜欢用这个的.最近项目再生产环境上由于log4j引起了一场血案,于是决定升级到log4j2. 二.现象 虽 ...

  4. log4j升级为log4j2(无需改动代码)

    log4j升级为log4j2(无需改动代码) 1 .删掉项目中存在的Log4j1.x的jar包,添加log4j2的jar包; 2.添加log4j和log4j2的连接包log4j-1.2-api-2.x ...

  5. 【Kafka】 kafka集群升级导致broker.id发生变动变动引起的问题

    文章目录 1.概述 2.详情 发现问题 解决问题 1.概述 转载:http://791202.com/2020/02/01/bigdata/362/ 2.详情 最近遇到一个问题,由于kafka集群升级 ...

  6. 升级到log4j2之后在idea控制台输出日志中文乱码的解决方案

    log4j升级到log4j2之后在idea编辑器的控制台输出日志中文乱码 问题概述: 项目组最近升级了日志系统,由log4j升级到了log4j2,在调试的过程中发现我用的idea编辑器的控制台输出中文 ...

  7. log4j升级为log4j2(不需要改动代码)

    公司的项目决定升级log4j,因为log4j2有一个自动删除日志的功能,这样可以减轻运维的一些工作,而且在多线程环境下,log4j2的异步日志系统比log4j和logback提高了十倍的性能(吞吐量和 ...

  8. Kafka 2.0 升级,看看携程怎么操作!

    早在 2014 年,携程的一些业务部门开始引入 Kafka 作为业务日志的收集处理系统.2015 年,基于 Kafka 的高并发.大数据的特点,携程框架研发部在 Kafka 之上设计了 Hermes ...

  9. log4j2 配置详解及使用范例

    最近项目需求需要将log4j1.2 升级到log4j2,摸索了好久,得出一点经验给大家分享. 1.log4j2 官网下载最新jar包(目前log2j2都是beta版) 导入入log4j-api-2.0 ...

  10. log4j1升级log4j2

    删除log4j-1.x.jar,然后增加log4j2.x的三个jar包:log4j-api-2.12.1.jar和log4j-core-2.12.1.jar和一个中间桥接包log4j-1.2-api- ...

最新文章

  1. Netscape Mozilla源代码指南
  2. 算法---FaceNet+mtcnn的使用记录
  3. //rest风格写_REST /使用提要发布事件
  4. 分布式6大核心专题_分布式ID
  5. java spring 多数据库_java – 使用多个数据源/数据库的Spring-Hibernate
  6. 安卓学习第10课——listview
  7. [安卓】Error和Exception的区别
  8. springCloud Finchley 实战入门(基于springBoot 2.0.3)【五 Hystrix 服务容错保护】
  9. java实现斐波那契数列求和_Java递归实现斐波那契数列
  10. 普通话测试-短文60篇文章,附带拼音(21-30篇)
  11. GeoServer 自定义字体 符号化渲染点
  12. Ubuntu 查询IP地址,设置静态IP、网关
  13. SpringBoot(六)打包方式
  14. warring:integer conversion resulted in a change of sign
  15. 个人银行结算账户类别
  16. 我是培训机构出身的程序员,不敢告诉任何人!
  17. B70极路由4增强版安装frps
  18. 如何独立设置Mac触摸板方向和鼠标滚轮方向?
  19. web前端学习笔记26-事件类型——一般事件、页面事件、表单事件
  20. NetTerm共享文件

热门文章

  1. Nik Collection 4
  2. matlab 求股票斜率,股票线性回归斜率公式
  3. 微信号下方菜单如何设置
  4. 酷睿i7 7700hq性能怎么样 i77700hq是什么水平
  5. 电脑CPU型号末端字母都是什么意思
  6. excel做ns流程图_NS流程图是什么图?用这款软件轻松画NS流程图
  7. 出去锻炼还是不让数据科学决定
  8. 台式计算机怎么安装无线网卡,台式机装无线网卡,详细教您台式机怎么使用无线网卡上网...
  9. xmpp怎么让群主踢人?
  10. 热敏打印机的工作原理