Alibaba Cloud Computing Co., Ltd. は最近、Apache Log4j 2 にリモートコード実行(RCE)の脆弱性を発見し、この脆弱性を Apache に報告しました。このトピックでは、脆弱性の影響と解決策について説明します。
影響
E-MapReduce(EMR)クラスターで影響を受けるサービスには、Hive、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark、Zeppelin が含まれます。 Spark と Zeppelin は Hive への依存関係があるため影響を受けます。
解決策
EMR クラスターの Log4j 2 JAR ファイルを、Log4j 2 バージョン 2.17.0 の JAR ファイルに置き換えます。さらに、Hive サービスと Spark サービスの log4j2.formatMsgNoLookups
パラメーターを true に設定して、JNDI ルックアップ機能を無効にします。手順の詳細については、手順をご参照ください。
この解決策については、次の点に注意してください。
この解決策は、EMR V3.38.2 以前のマイナーバージョン、EMR V5.4.2 以前のマイナーバージョン、および EMR V4.X に適用されます。 EMR V3.38.2 より後のマイナーバージョンと V5.4.2 より後のマイナーバージョンでは、脆弱性は修正されており、修復操作は必要ありません。
この解決策を実装した後、クラスター内の影響を受けるサービスを再起動する必要があります。
脆弱性を修正するために使用するスクリプトは、オンラインサービスに影響を与えません。ただし、スクリプトを実行した後に関連サービスを再起動する必要があるため、ピーク時以外にスクリプトを実行することをお勧めします。
手順
EMR クラスターの脆弱性を修正する
パッチパッケージ patches-log4j.tar.gz をダウンロードします。
EMR クラスターのマスターノードにログオンし、手順 1 でダウンロードしたパッケージを
emr-user
ユーザーまたはhadoop
ユーザーのホームディレクトリに配置します。次のコマンドを実行して
emr-user
ユーザーまたはhadoop
ユーザーに切り替え、パッケージを解凍します。Data Lake クラスター、Dataflow クラスター、OLAP クラスター、DataServing クラスター、またはカスタムクラスター
su emr-user tar zxf patches-log4j.tar.gz
その他のクラスター
su hadoop tar zxf patches-log4j.tar.gz
次のコマンドを実行して、パッチディレクトリ内の hosts ファイルを開きます。次に、emr-header-1 や emr-worker-1 など、クラスター内のすべてのノードのホスト名を hosts ファイルに追加します。1 行に 1 つのホスト名を入力します。
cd patches vim hosts
ファイルの内容の例:
emr-header-1 emr-worker-1 emr-worker-2
重要EMR V3.41 以降のマイナーバージョンのクラスター、または EMR V5.7.0 以降のマイナーバージョンのクラスターの場合、ノードのホスト名の形式が異なります。ファイルの内容の例:
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
説明Spark Streaming ジョブや Flink ジョブなど、YARN で実行されているジョブの場合、ジョブの停止後に YARN NodeManager でローリング再起動を実行する必要があります。
サービスを再起動します。
Hive、HDFS、Presto、Impala、Druid、Flink、Solr、Ranger、Storm、Oozie、Spark、Zeppelin など、影響を受けるサービスを再起動します。
たとえば、Hive サービスページの右上隅にある
を選択して、Hive サービスを再起動します。
ゲートウェイクラスターの脆弱性を修正する
ゲートウェイクラスターは、SSH モードでのパスワードなしログオンをサポートしていません。そのため、ゲートウェイクラスターを使用する場合は、パッチパッケージをゲートウェイクラスターの各ノードに手動でアップロードし、各ノードで上記の修正操作を実行する必要があります。
hosts ファイルには、現在実行中のノードの
hostname
のみを入力する必要があります。ゲートウェイクラスターにはサービスが含まれていません。パッチパッケージをアップロードした後にサービスを再起動する必要はありません。
クラスターを作成するとき、または既存のクラスターをスケールアウトするときに脆弱性を修正する
EMR クラスターを作成するときに、EMR コンソールでブートストラップアクションを追加して脆弱性を修正できます。既存のクラスターをスケールアウトすると、システムは自動的に脆弱性を修正します。EMR クラスターを作成するときは、次の手順を実行します。
patches-log4j.tar.gz パッケージと bootstrap_log4j.sh スクリプトファイルをダウンロードし、オブジェクトストレージサービス(OSS)パスにアップロードします。
この例では、パッケージとスクリプトファイルは oss://<bucket-name>/path/to/ にアップロードされます。
EMR コンソールでブートストラップアクションを追加します。詳細については、ブートストラップアクションの管理をご参照ください。
[ブートストラップアクションの追加] ダイアログボックスで、パラメーターを設定します。
パラメーター
説明
名前
追加するブートストラップアクションの名前。たとえば、このパラメーターを fixlog4jvulnerability に設定できます。
スクリプトアドレス
スクリプトファイルが配置されている 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 サービスを再起動します。クラスターをスケールアウトする場合は、新しく追加されたノードにデプロイされている関連サービスのみを再起動する必要があります。