近日,阿里云计算有限公司发现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包放在hadoop用户的HOME目录下。
  3. 将patch包解压缩后,使用hadoop用户执行操作。
    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
  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、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin等组件需要重启之后才能完全修复漏洞。

    以Hive组件为例,在EMR集群的Hive服务页面,选择右上角的操作 > 重启All Components

Gateway集群

由于该方案依赖于SSH免密登录,对于Gateway集群,您需要手动将patch包上传到Gateway集群的每一个节点,并按EMR集群的修复流程分别执行修复操作。
注意 patch包中的hosts文件只需要填写当前执行节点的hostname。

新建集群和扩容已有集群

新建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. 如果是新建集群,则需要重启Hive、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark和Zeppelin等组件。