近日,阿里云计算有限公司发现Apache Log4j2组件存在远程代码执行漏洞,并将漏洞情况告知Apache软件基金会。本文为您介绍该漏洞的影响范围及相应的修复方案。
漏洞影响
E-MapReduce(简称EMR)集群内受到影响的组件包括:Hive、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin,其中Spark和Zeppelin是由于依赖Hive组件而受到影响。
漏洞修复方案
您需要将EMR集群内包含漏洞的Log4j2 JAR整体替换为2.17.0正式版本,同时修改Hive和Spark Log4j配置,禁用JNDI Lookup功能(log4j2.formatMsgNoLookups=true
)。具体操作流程,请参见修复流程。
该修复方案:
适用于EMR-3.38.2及之前版本,EMR-5.4.2及之前版本,EMR-4.x版本。EMR-3.38.3及之后版和EMR-5.4.3及之后版本已修复该问题,无需进行修复操作。
执行该修复方案后,需要重启对应的组件。
该漏洞修复脚本不会对线上业务造成影响,但由于必须重启对应的组件才能生效,所以建议业务低峰期时执行。
修复流程
EMR集群
单击patches-log4j.tar.gz下载patch包。
登录EMR集群的Master节点,并将步骤一中下载的patch包放在
emr-user
或hadoop
用户的HOME目录下。将patch包解压缩后,使用
emr-user
或hadoop
用户执行操作。数据湖(DataLake)、实时数据流(DataFlow)、数据分析(OLAP)、数据服务(DataServing)和自定义场景的集群
su emr-user tar zxf patches-log4j.tar.gz
其余集群
su hadoop tar zxf patches-log4j.tar.gz
编辑patch包下的hosts文件,添加集群所有节点的host name,例如emr-header-1或emr-worker-1,文件内容以行分割。
cd patches vim hosts
hosts文件内容示例如下:
emr-header-1 emr-worker-1 emr-worker-2
重要对于EMR 3.x系列中EMR-3.41及之后的版本,EMR 5.x系列中EMR-5.7.0及之后的版本集群,hostname已经发生了变化,hosts文件内容示例如下。
core-1-1 core-1-2 task-1-1 task-1-2
通过fix.sh脚本执行修复操作。
./fix.sh
脚本执行完成后,返回如下提示信息。
### NOTICE: YOU CAN RESTORE THIS PATCH BY RUN RESTORE SCRIPT ABOVE $> sh ./restore.sh 20211213001755 ### DONE
如果您需要将上述修复过程进行回滚,可以执行以下命令。
./restore.sh 20211213001755
说明对于已经在运行的YARN作业(Application,例如,Spark Streaming或Flink作业),需要停止作业后,批量滚动重启YARN NodeManager。
重启服务。
Hive、HDFS、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin等组件需要重启之后才能完全修复漏洞。
以Hive组件为例,在EMR集群的Hive服务页面,选择右上角的
。
Gateway集群
由于该方案依赖于SSH免密登录,对于Gateway集群,您需要手动将patch包上传到Gateway集群的每一个节点,并按EMR集群的修复流程分别执行修复操作。
patch包中的hosts文件只需要填写当前执行节点的
hostname
。由于Gateway集群中没有组件进程,上传patch包后,无需进行服务重启操作。
新建集群和扩容已有集群
新建EMR集群时在EMR控制台添加引导操作,或扩容已有集群时可以自动修复漏洞。具体操作步骤如下:
单击patches-log4j.tar.gz和bootstrap_log4j.sh,下载patch包和bootstrap脚本,并且上传到OSS上。
例如,上传到OSS的路径为oss://<bucket-name>/path/to/patches-log4j.tar.gz和oss://<bucket-name>/path/to/bootstrap_log4j.sh。
在EMR控制台添加引导操作,详细信息请参见管理引导操作。
在添加引导操作对话框中,填写配置项。
参数
描述
名称
引导操作的名称。例如,log4j漏洞修复。
脚本位置
选择脚本所在OSS的位置。
脚本路径格式必须为oss://**/*.sh格式。本文示例为oss://<bucket-name>/path/to/bootstrap_log4j.sh。
参数
引导操作脚本的参数,指定脚本中所引用的变量的值。
本文示例为oss://<bucket-name>/path/to/patches-log4j.tar.gz 。
执行范围
选择集群。
执行时间
选择组件启动后。
执行失败策略
选择继续执行。
如果是新建集群,则需要重启HDFS、Hive、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin等组件。如果是新扩容节点,则只需要重启扩容节点上的相应组件。