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