
Log4j2 CVE-2021-44228を緩和するため、全てのコンテナおよびホストJVMにわたってJNDIルックアップを無効化するJVMレベルのホットパッチをデプロイするKubernetes DaemonSet。
このプロジェクトは、以下に概説するように非推奨となります。
このプロジェクトは、2023-01-01 以降、Issue を受け付けず、更新も行われません。この日以降、このプロジェクトはサポートされず、新しいリリースや関連するアーティファクトは生成されません。
プロジェクトリポジトリは、2023-04-01 に恒久的にアーカイブ(読み取り専用)されます。
元のプロジェクトドキュメントに記載されているように、これはあくまで Kubernetes ユーザーを支援するための一時的な措置であり、Log4j2 CVE-2021-44228 および CVE-2021-45046 によるセキュリティ露出を部分的に緩和するものに過ぎませんでした。これらの CVE に関連するリスクを完全に緩和するには、すべての Log4j ユーザーが修正バージョンにアップデートすることを強く推奨します。
最新リリースに関連するリリースアーティファクトは、引き続き Kubernetes 環境にデプロイしているプロジェクト利用者が利用できるように永続的に利用可能です。具体的には、DaemonSet マニフェスト と ECR Public コンテナイメージ は非推奨後も利用可能ですが、サポートや更新は行われません。
AWS は Log4j2 ライブラリからの JNDI ルックアップを無効にする JVM レベルのホットパッチを実行する RPM を開発しました。Log4j2 CVE-2021-44228 および CVE-2021-45046 を緩和します。
Apache Log4j2 CVE-2021-44228 ノードエージェントは、AWS の Kubernetes チームによって構築されたオープンソースプロジェクトです。DaemonSet として実行され、信頼できないソースからの入力を処理する際に Apache Log4j2 バージョン < 2.15.0 を実行するアプリケーションに影響を与える Log4j2 CVE-2021-44228 の影響を緩和するように設計されています。この DaemonSet を実行すると、コンテナ内だけでなくホスト上で実行されている JVM もパッチされます。
動作内容: 各ワーカーノードに cron エントリがインストールされ、実行中の JVM を探すプロセスを実行し、Log4J2 CVE を緩和するエージェントを注入します。コンテナ内で実行されているものを含むすべての JVM が、この方法でホットパッチされます。現在、ホットパッチプロセスは 30 分ごとに 15 分のジッターで実行するように構成されています。有効なウィンドウは実行間隔で 15 分から 45 分の範囲になります。
注記: Log4j2 の脆弱性と AWS の対応に関する追加情報は、AWS セキュリティ速報 にあります。
注記: 2022 年 4 月 20 日、イメージ (v0.0.16) は Amazon Linux 1 および 2 の最新パッチで更新されました。この DaemonSet の以前のバージョンをインストールしていて、まだ実行中の場合は、daemonset.yaml ファイルを再適用して最新の RPM をインストールする必要があります。log4j パッチが不要になった場合は、DaemonSet を削除し、RPM をアンインストールする必要があります。古いバージョンの RPM (< 1.1-16) には、攻撃者がコンテナからエスケープして基盤となるホストにアクセスできる脆弱性があったためです。
注記: バージョン 1.3-5 は ALAS2-2022-1806 および ALAS-2022-1601 に対応しています。詳細については、Amazon Linux "log4j hotpatch" <1.3-5 ローカル権限昇格による root 化 を参照してください。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/kubernetes-log4j-cve-2021-44228-node-agent/main/daemonset.yaml
単一の Pod をスポットチェックする:
kubectl get pods -l job=node-patch-installer -n node-configuration-daemonset
kubectl logs <pod-name> -c node-patch-installer -n node-configuration-daemonset
またはすべてのノードの確認を取得する:
kubectl logs -l job=node-patch-installer -c node-patch-installer -n node-configuration-daemonset | grep 'installed'
インストールが成功した場合、ログファイルの最終行に installed and verified と表示され、そうでない場合はエラーが記録されます。
daemonset.yaml ファイルで編集して新しい URI:タグを反映し、マニフェストをクラスターに適用します。Apache Log4j2 < 2.15.0 では、設定、ログメッセージ、パラメーターで使用される JNDI 機能が、攻撃者が制御する LDAP およびその他の JNDI 関連エンドポイントから保護されていません。メッセージルックアップ置換が有効な場合、ログメッセージやログメッセージパラメーターを制御できる攻撃者は、LDAP サーバーからロードされた任意のコードを実行できます。Log4j2 バージョン < 2.15.0 では、この動作はデフォルトで無効になっています。詳細は CVE 速報 にあります。
Log4j2 の脆弱性に関する追加情報は、AWS セキュリティ速報 にあります。
AWS は、Log4j2 ライブラリから JNDI ルックアップを無効にする JVM レベルのホットパッチを実行する RPM を開発しました。これにより、ホスト上の JVM とコンテナ内で実行されている JVM の両方に適用される Log4j2 の問題を緩和します。このプロジェクトは、RPM を Kubernetes DaemonSet としてパッケージ化します。
インストールされると、各ワーカーノードで実行中の JVM を探すプロセスが実行され、JVM にエージェントを注入して Log4j2 の脆弱性を緩和します。エージェントは、ロードされたすべての org.apache.logging.log4j.core.lookup.JndiLookup インスタンスの lookup() メソッドをパッチし、無条件に文字列 Patched JndiLookup::lookup() を返すようにします。これは、Java プロセスを再起動せずに Log4j2 の CVE-2021-44228 リモートコード実行の脆弱性に対処するように設計されています。
このプロセスはデフォルトで 30 分ごとに実行するように構成されており、アプリケーションがまだ更新された Log4j2 依存関係でパッチされていないクラスターに保護の層を追加します。
ホットパッチの詳細については、AWS オープンソースブログ を参照してください。
コンテナイメージは aws-containers ECR Public リポジトリ でホストされています。