log4j 简介
apache log4j 是一款开源的 java 日志框架,被广泛地应用在中间件、开发框架与 web 应用中,用来记录日志信息。
漏洞描述:
1. cve-2021-44228,apache log4j 远程代码执行漏洞:
2.0-beta9 <= apache log4j 2.x < 2.15.0,该漏洞利用难度低,严重 程度高,影响面非常大。
2. cve-2021-45046,apache log4j 拒绝服务与远程代码执行漏洞:2.0-beta9 <= apache log4j 2.x < 2.15.0。
3. cve-2021-4104,apachelog4j 1.2 jmsappender 远程代码执行漏洞:apache log4j = 1.2。
4. cve-2021-45105,apache log4j2 拒绝服务漏洞:2.0-beta9 <= apache log4j <= 2.16.0。
5. cve-2021-44832,jdbcappender 代码执行漏洞:2.0-beta7 <= apache log4j <= 2.17.0(注:只有 log4j-core jar 文件受此漏洞影响)。
受影响版本
2.0 <= apache log4j 2.x <= 2.17.0。
不受影响版本
apache log4j 2.17.1 及以上版本(支持 java 8 及以上)
apache log4j 2.12.4(支持 java 7)
apache log4j 2.3.2(支持 java 6)
排查方法
检查是否使用 log4j,find / -name log4j*.jar
(1)、检查部署包、部署环境中是否存在 log4j-core-2.x.jar 包,查看版本
meta-inf/manifest.mf 文件下的 implementation-version 属性值。
(2)、对于第三方包,java jar 解压后是否存在 org/apache/logging/log4j 相关路径结构,判断是否使用了存在漏洞的组件,若使用了,则极可能存在该漏洞。
(3)、针对源码工程,查看依赖,查看是否存在 org.apache.logging.log4j 的 log4j-core。
(4)、开源漏扫部署包。
修复建议
1) 安全版本
jdk8 及以上环境:升级到高阶版本:
目前官方发布的 apache log4j 2.17.1 及以上版本已修复上述漏洞。
https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core/2.17.1
jdk7 环境:升级至 apache log4j 2.12.4
jdk6 环境:升级至 apache log4j 2.3.2
2) 缓释措施
针对最严重的 cve-2021-44228 漏洞,
在无法升级情况下,采用缓解措施:
(1)添加 jvm 启动参数 -dlog4j2.formatmsgnolookups=true
(2)在应用程序的 classpath 下添加 log4j2.component.properties 配置文件,文件内容:log4j2.formatmsgnolookups=true
(3)移除 log4j-core 包中 jndilookup 类文件,并重启服务,具体命令:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/jndilookup.class
接下来我们看数据库中 log4j 漏洞都存在那些地方,我们 find 查找一下。
[root@test19crac1 ~]# find /u01 -name log4j*.jar
/u01/app/19c/grid/suptools/tfa/release/tfa_home/jlib/log4j-api-2.9.1.jar
/u01/app/19c/grid/suptools/tfa/release/tfa_home/jlib/log4j-core-2.9.1.jar
/u01/app/19c/grid/tfa/test19crac1/tfa_home/jlib/log4j-api-2.9.1.jar
/u01/app/19c/grid/tfa/test19crac1/tfa_home/jlib/log4j-core-2.9.1.jar
/u01/app/oracle/product/19c/db_1/suptools/tfa/release/tfa_home/jlib/log4j-api-2.9.1.jar
/u01/app/oracle/product/19c/db_1/suptools/tfa/release/tfa_home/jlib/log4j-core-2.9.1.jar
/u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-jcl-2.11.0.jar
/u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-slf4j-impl-2.11.0.jar
/u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-api-2.11.0.jar
/u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-core-2.11.0.jar
如下所示,数据库没有打任何补丁,db 版本为 19.3,log4j 版本有两个,一个为 tfa 所用的 2.9.1 版本,另一个为数据库实例目录下 2.11.0 的版本。
[oracle@test19crac2 ~]$ $oracle_home/opatch/opatch version
opatch version: 12.2.0.1.17
opatch succeeded.
[oracle@test19crac2 ~]$ $oracle_home/opatch/opatch lspatches
29585399;ocw release update 19.3.0.0.0 (29585399)
29517242;database release update : 19.3.0.0.190416 (29517242)
opatch succeeded.
然后可以发现,在 grid 的家目录下 suptools 目录中同时存在 orachk、oratop、tfa 三种监控检查工具。
[root@test19crac1 suptools]# cd /u01/app/19c/grid/suptools
[root@test19crac1 suptools]# ls
orachk oratop tfa
如果我们的数据库打了补丁,这里以 19c rac 为例,11g 环境请自行测试。如果补丁版本过低,那么 gi 目录下的 log4j 已经不存在了,但是 ahf 框架下还存在 2.13.3 版本的受影响的 ahf,那么这种情况下可以采取继续更新高版本的 ru15-ru20 均可,也可以单独升级 ahf,后文有讲到如何升级。
那么,单机文件系统的oracle 19c 呢(19.3 未打补丁的情况),在 tfa_home 目录下同样存在log4j-core-2.9.1.jar 受影响的版本,生产环境建议打补丁,补丁升级到 ru19.12 或 ru19.15 以上版本,单机环境补丁更新停机时间也就三十多分钟的样子,具体补丁升级方法可参考我以前写的文章:《ru15补丁更新》。当然你也可以尝试下载高版本的 log4j 文件通过软链接的形式来替换,下文中同样有讲到,你可以在测试环境中自行测试。
/u01/app/oracle/product/19.0.0/dbhome_1/suptools/tfa/release/tfa_home/jlib
下面我们来插播一下 tfa 的简单使用情况
tfa 使用简介
查看 tfa:trace file analyzer 状态和版本。
tfa 更多帮助命令
[grid@test19crac2 ~]$ tfactl --help
warning - tfa software is older than 180 days. please consider upgrading tfa to the latest version.
unknown option: -help
usage : /u01/app/19c/grid/bin/tfactl [options]
commands:diagcollect|collection|analyze|ips|run|start|stop|print|directory|toolstatus|setupmos|upload|events|search|changes
for detailed help on each command use:
/u01/app/19c/grid/bin/tfactl -help
tfactl>
由此可以发现 tfactl 命令可以 |start|stop|print |toolstatus 等操作。
删除 180 天以前的自动诊断存储库日志和跟踪文件,参数 dryrun 先预估要删除的文件和释放的空间,然后去掉参数 dryrun 在执行删除。
/u01/app/19c/grid/bin/tfactl managelogs -purge -older 180d -dryrun
当然也可以按照 gi 和 database 分别删除
$ tfactl managelogs -purge -older 30d
$ tfactl managelogs -purge -older 30d –gi
$ tfactl managelogs -purge -older 30d -database
--查看目录使用情况
$ tfactl managelogs -show usage
$ tfactl managelogs -show usage –gi
$ tfactl managelogs -show usage -database
/u01/app/19c/grid/bin/tfactl managelogs -purge -older 30d -gi
/u01/app/19c/grid/bin/tfactl managelogs -show usage -gi
tfa 的更多实用操作请查看官方文档,这里不在演示了。
参考文档:
tfa 升级
下载最新的 ahf (autonomous health framework) oracle自治运行状况框架,在 19c 后来的版本中,官方建议使用 ahf 来代替tfa 框架,所以这里我们直接下载最新的 ahf,mos 文档doc id:1513912.1 可以下载,也可本公众号后台回复【ahf】获取此软件包。
- 上传此软件包到服务器 rac1并解压
unzip ahf-linux_v23.6.0.zip -d ahf_23.6
- 安装ahf
官方文档附录中给出了安装命令,我们可以参考,指定相关参数运行,也可以直接运行ahf_setup 命令(升级同样也是运行此命令),仅在节点1运行即可,安装或升级过程中需要输入节点 2 root 密码。
./ahf_setup
[-ahf_loc ahf location]
[-data_dir ahf repository]
[-nodes node1,node2]
[-extract[orachk|exachk|-notfasetup]]
[-force]
[-local]
[-silent]
[-tmp_loc directory]
[-debug [-level 1-6]]
[root@test19crac1 ahf_23.6]# ./ahf_setup
ahf installer for platform linux architecture x86_64
ahf installation log : /tmp/ahf_install_236000_26649_2023_07_31-10_51_26.log
starting autonomous health framework (ahf) installation
ahf version: 23.6.0 build date: 202306301433
tfa is already installed at : /u01/app/19c/grid/tfa/test19crac1/tfa_home
installed tfa version : 183300 build id : 20190315044534
default ahf location : /opt/oracle.ahf
do you want to install ahf at [/opt/oracle.ahf] ? [y]|n : y
ahf location : /opt/oracle.ahf
ahf data directory stores diagnostic collections and metadata.
ahf data directory requires at least 5gb (recommended 10gb) of free space.
choose data directory from below options :
1. /u01/app/grid [free space : 5701 mb]
2. enter a different location
choose option [1 - 2] : 1
ahf data directory : /u01/app/grid/oracle.ahf/data
shutting down tfa : /u01/app/19c/grid/tfa/test19crac1/tfa_home
copying tfa data files from /u01/app/19c/grid/tfa/test19crac1/tfa_home
uninstalling tfa : /u01/app/19c/grid/tfa/test19crac1/tfa_home
do you want to add ahf notification email ids ? [y]|n : n
ahf will also be installed/upgraded on these cluster nodes :
1. test19crac2
the ahf location and ahf data directory must exist on the above nodes
ahf location : /opt/oracle.ahf
ahf data directory : /u01/app/grid/oracle.ahf/data
do you want to install/upgrade ahf on cluster nodes ? [y]|n : y
extracting ahf to /opt/oracle.ahf
configuring tfa services
copying tfa data files to ahf
discovering nodes and oracle resources
starting tfa services
created symlink from /etc/systemd/system/multi-user.target.wants/oracle-tfa.service to /etc/systemd/system/oracle-tfa.service.
created symlink from /etc/systemd/system/graphical.target.wants/oracle-tfa.service to /etc/systemd/system/oracle-tfa.service.
.--------------------------------------------------------------------------------.
| host | status of tfa | pid | port | version | build id |
------------- --------------- ------- ------ ------------ ----------------------
| test19crac1 | running | 34212 | 5000 | 23.6.0.0.0 | 23600020230630143300 |
| test19crac2 | running | 10468 | 5000 | 18.3.3.0.0 | 18330020190315044534 |
'------------- --------------- ------- ------ ------------ ----------------------'
running tfa inventory...
adding default users to tfa access list...
.------------------------------------------------------------------.
| summary of ahf configuration |
----------------- ------------------------------------------------
| parameter | value |
----------------- ------------------------------------------------
| ahf location | /opt/oracle.ahf |
| tfa location | /opt/oracle.ahf/tfa |
| orachk location | /opt/oracle.ahf/orachk |
| data directory | /u01/app/grid/oracle.ahf/data |
| repository | /u01/app/grid/oracle.ahf/data/repository |
| diag directory | /u01/app/grid/oracle.ahf/data/test19crac1/diag |
'----------------- ------------------------------------------------'
starting orachk scheduler from ahf
setting up ahf cli and sdk
ahf install completed on test19crac1
installing ahf on remote nodes :
ahf will be installed on test19crac2, please wait.
ahf will prompt twice to install/upgrade per remote node. so total 2 prompts
do you want to continue y|[n] : y
ahf will continue with installing on remote nodes
installing ahf on test19crac2 :
[test19crac2] copying ahf installer
root@test19crac2's password:
[test19crac2] running ahf installer
root@test19crac2's password:
ahf binaries are available in /opt/oracle.ahf/bin
ahf is successfully installed
do you want ahf to store your my oracle support credentials for automatic upload ? y|[n] : n
moving /tmp/ahf_install_236000_26649_2023_07_31-10_51_26.log to /u01/app/grid/oracle.ahf/data/test19crac1/diag/ahf/
[root@test19crac1 ahf_23.6]#
3)检查版本
[root@test19crac1 ahf_23.6]# ahfctl version
[root@test19crac1 ahf_23.6]# tfactl version
[root@test19crac1 ahf_23.6]# tfactl status
4)删除grid用户下 家目录 suptools下所有的log4j*.jar(如果存在)
我这里 grid 下的 log4j 已经被自动删除了,如果还存在,可以手动删除。 /opt 显示的 log4j-core.jar 已经是符合要求的版本了,至于 db目录 property_graph 下的这个需要打补丁,然后会自动删除这个文件。这里我做一个大胆的尝试,直接删除这个文件然后重启主机,看看数据库能不能正常启动(ps:生产环境不建议这么玩,推荐 ru 补丁更新),当然也可以删除这两个文件后使用高版本的 log4j-core 对其做一个软链接指向低版本的 log4j。
#cp /u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j* /home/oracle
#rm -rf /u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-api-2.11.0.jar
#rm -rf /u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-core-2.11.0.jar
#cp /opt/oracle.ahf/common/jlib/log4j-api-2.17.1.jar /u01/app/oracle/product/19c/db_1/md/property_graph/lib/
#cp /opt/oracle.ahf/common/jlib/log4j-core-2.17.1.jar /u01/app/oracle/product/19c/db_1/md/property_graph/lib/
#chown oracle:oinstall /u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j*
# su - oracle
$ ln -s /u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-core-2.17.1.jar log4j-core-2.11.0.jar
$ ln -s /u01/app/oracle/product/19c/db_1/md/property_graph/lib/log4j-api-2.17.1.jar log4j-api-2.11.0.jar
#reboot
重启后检查数据库状态,这里数据库一切正常。
ahf 卸载
使用 root 用户或者安装者用户执行 tfactl 或 ahfctl uninstall命令卸载,首先要停止 orachk,然后停止 tfa,最后删除 ahf 安装目录 /opt/oracle.ahf。
running the command:
stops oracle orachk
stops oracle trace file analyzer
deletes the oracle autonomous health framework installation directory
ahfctl uninstall -deleterepo -silent
ahf 常用命令
ahfctl statusahf -all
ahfctl showrepo -all
获取 cpu 内存资源限制
ahfctl getresourcelimit
限制 cpu 核数为 2
ahfctl setresourcelimit -value 2
限制内存使用 500m
ahfctl setresourcelimit -resource kmem -value 500
限制内存和 swap 内存总和为 1024m
ahfctl setresourcelimit -resource swmem -value 1024
分析所有错误信息(包括数据库 ora 错误和 gi 错误)
tfactl analyze -type error
同样,也可以使用 tfactl 来清理诊断日志
tfactl purge -older 30d
更多使用命令请查看官方文档,这里不在演示。
ogg log4j漏洞
最后,花一点儿时间来简单说一下 ogg log4j 漏洞,正常 ogg19c 以上版本中是不存在此漏洞的,但我这里还有oracle goldengate for big data version 12.3.2.1.1 的版本,此版本同样使用了 log4j-core-2.9.1.jar 的包。同样解决此漏洞可以打补丁,也可以升级 ogg 更可以使用高版本的ogg,只不过这三种办法均不常用,一般也很少有人使用,我这里大胆一些,在测试环境中我直接删除了 log4j-core-2.9.1.jar 这个包,服务均可正常使用,安全稳定运行一年多时间,生产环境中我使用高版本软链接的方式替换这个包,也已经安全稳定运行一周了。如下是操作过程:
[root@cs-ogg lib]# cd /goldengate/ggjava/resources/lib/optional
[root@cs-ogg optional]# ll log*
-rwxr-xr-x 1 oracle oracle 239856 5月 1 2018 log4j-api-2.9.1.jar
-rwxr-xr-x 1 oracle oracle 1549865 5月 1 2018 log4j-core-2.9.1.jar
-rwxr-xr-x 1 oracle oracle 23153 5月 1 2018 log4j-slf4j-impl-2.9.1.jar
[root@cs-ogg lib]# su - oracle
[oracle@cs-ogg optional]$ cd /goldengate/ggjava/resources/lib/optional/
[oracle@cs-ogg optional]$ mv log4j-core-2.9.1.jar log4j-core-2.9.1.jar_bak20230728
[oracle@cs-ogg optional]$ ln -s /goldengate/ggjava/resources/lib/optional/log4j-core-2.17.1.jar log4j-core-2.9.1.jar
[oracle@cs-ogg optional]$ ll
总用量 3560
-rwxr-xr-x 1 oracle oracle 239856 5月 1 2018 log4j-api-2.9.1.jar
-rw-r--r-- 1 oracle oracle 1770490 3月 9 2022 log4j-core-2.17.1.jar
lrwxrwxrwx 1 oracle oracle 63 7月 28 16:00 log4j-core-2.9.1.jar -> /goldengate/ggjava/resources/lib/optional/log4j-core-2.17.1.jar
-rwxr-xr-x 1 oracle oracle 1549865 5月 1 2018 log4j-core-2.9.1.jar_bak20230728
-rwxr-xr-x 1 oracle oracle 23153 5月 1 2018 log4j-slf4j-impl-2.9.1.jar
drwxr-xr-x 2 oracle oracle 32 7月 14 2018 logback
-rwxr-xr-x 1 oracle oracle 6983 5月 1 2018 slf4j-jcl-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 8460 5月 1 2018 slf4j-jdk14-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 12244 5月 1 2018 slf4j-log4j12-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 4007 5月 1 2018 slf4j-nop-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 15257 5月 1 2018 slf4j-simple-1.7.25.jar
[oracle@cs-ogg optional]$ chmod a x log4j-core-2.17.1.jar
[oracle@cs-ogg optional]$ ll
总用量 3560
-rwxr-xr-x 1 oracle oracle 239856 5月 1 2018 log4j-api-2.9.1.jar
-rwxr-xr-x 1 oracle oracle 1770490 3月 9 2022 log4j-core-2.17.1.jar
lrwxrwxrwx 1 oracle oracle 63 7月 28 16:00 log4j-core-2.9.1.jar -> /goldengate/ggjava/resources/lib/optional/log4j-core-2.17.1.jar
-rwxr-xr-x 1 oracle oracle 1549865 5月 1 2018 log4j-core-2.9.1.jar_bak20230728
-rwxr-xr-x 1 oracle oracle 23153 5月 1 2018 log4j-slf4j-impl-2.9.1.jar
drwxr-xr-x 2 oracle oracle 32 7月 14 2018 logback
-rwxr-xr-x 1 oracle oracle 6983 5月 1 2018 slf4j-jcl-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 8460 5月 1 2018 slf4j-jdk14-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 12244 5月 1 2018 slf4j-log4j12-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 4007 5月 1 2018 slf4j-nop-1.7.25.jar
-rwxr-xr-x 1 oracle oracle 15257 5月 1 2018 slf4j-simple-1.7.25.jar
[oracle@cs-ogg goldengate]$ ./ggsci
oracle goldengate for big data
version 12.3.2.1.1 (build 005)
oracle goldengate command interpreter
version 12.3.0.1.2 oggcore_oggadp.12.3.0.1.2_platforms_180712.2305
linux, x64, 64bit (optimized), generic on jul 13 2018 00:46:09
operating system character set identified as utf-8.
米乐app官网下载 copyright (c) 1995, 2018, oracle and/or its affiliates. all rights reserved.
ggsci (cs-ogg) 1> stop *
ggsci (cs-ogg) 2> sart *
ggsci (cs-ogg) 3> info all
program status group lag at chkpt time since chkpt
manager running
replicat running rep01 00:00:13 00:00:01
replicat running rep02 00:00:00 00:00:09
全文完,希望可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我的公众号【jiekexu dba之路】,第一时间一起学习新知识!
————————————————————————————
公众号:jiekexu dba之路
csdn :https://blog.csdn.net/jiekexu
墨天轮:https://www.modb.pro/u/4347
腾讯云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————