漏洞公告 | Apache Log4j2远程代码执行漏洞

近日,阿里云计算有限公司发现Apache Log4j2组件存在远程代码执行漏洞,并将漏洞情况告知Apache软件基金会。本文为您介绍该漏洞的影响范围及相应的修复方案。

漏洞影响

具体漏洞详情,请参见【漏洞通告】Apache Log4j2 远程代码执行漏洞(CVE-2021-44228/CVE-2021-45046)

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集群

  1. 单击patches-log4j.tar.gz下载patch包。

  2. 登录EMR集群的Master节点,并将步骤一中下载的patch包放在emr-userhadoop用户的HOME目录下。

  3. 将patch包解压缩后,使用emr-userhadoop用户执行操作。

    • 数据湖(DataLake)、实时数据流(DataFlow)、数据分析(OLAP)、数据服务(DataServing)和自定义场景的集群

      su emr-user
      tar zxf patches-log4j.tar.gz
    • 其余集群

      su hadoop
      tar zxf patches-log4j.tar.gz
  4. 编辑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
  5. 通过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。

  6. 重启服务。

    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控制台添加引导操作,或扩容已有集群时可以自动修复漏洞。具体操作步骤如下:

  1. 单击patches-log4j.tar.gzbootstrap_log4j.sh,下载patch包和bootstrap脚本,并且上传到OSS上。

    例如,上传到OSS的路径为oss://<bucket-name>/path/to/patches-log4j.tar.gzoss://<bucket-name>/path/to/bootstrap_log4j.sh

  2. 在EMR控制台添加引导操作,详细信息请参见管理引导操作

    添加引导操作对话框中,填写配置项。

    参数

    描述

    名称

    引导操作的名称。例如,log4j漏洞修复。

    脚本位置

    选择脚本所在OSS的位置。

    脚本路径格式必须为oss://**/*.sh格式。本文示例为oss://<bucket-name>/path/to/bootstrap_log4j.sh

    参数

    引导操作脚本的参数,指定脚本中所引用的变量的值。

    本文示例为oss://<bucket-name>/path/to/patches-log4j.tar.gz

    执行范围

    选择集群

    执行时间

    选择组件启动后

    执行失败策略

    选择继续执行

  3. 如果是新建集群,则需要重启HDFS、Hive、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin等组件。如果是新扩容节点,则只需要重启扩容节点上的相应组件。