近日,阿里云計算有限公司發現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集群
單擊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等組件。如果是新擴容節點,則只需要重啟擴容節點上的相應組件。