クリスマス前に大騒ぎですが,Japan VMUG もアクティブメンバーのみなさんが昼夜を問わずに情報整理・提供してくれていて,本当に頭が下がります.VMware 製品群に関しては,VMSA-2021-0028 が公開された直後は Workaround は vROPs くらいしか情報なかったのですが,やっと vCenter の Workaround も KB87081 として公開されたので,早速 7.0.3 の vCSA に適用してみました.すぐに日本語化されるとは思いますが,困っている初心者の方もいらっしゃるかと思いますので,一通り手順を書いておきたいと思います.
0. vCenter へ ssh で接続
root ユーザーで vCenter へ ssh で接続します.
$ ssh root@vcsa.tcpninja.net VMware vCenter Server 7.0.3.00100 Type: vCenter Server with an embedded Platform Services Controller root@vcsa.tcpninja.net's password: Connected to service * List APIs: "help api list" * List Plugins: "help pi list" * Launch BASH: "shell" Command>
shell と入力して Bash に入りましょう.
Command> shell Shell access is granted to root root@vcsa [ ~ ]#
ここから,3 つのサービスと 1 つのユーティリティに対して,それぞれ対応していきます.
各サービスの役割に関心のある方は,6.7 の PSC サービスの説明など参考にしてみてください.
1. vMON サービス
/usr/lib/vmware-vmon/java-wrapper-vmon でオプション指定が出来るようです.まず,変更前にファイルのバックアップをとっておきましょう.
root@vcsa [ ~ ]# cp -p /usr/lib/vmware-vmon/java-wrapper-vmon /usr/lib/vmware-vmon/java-wrapper-vmon.bak
java-wrapper-vmon の最終行に,-Dlog4j2.formatMsgNoLookups=true の設定を加えます.7.0 でも Build によって記載方法が異なるようなので,ご自身の環境に合わせて設定しましょう.私の環境は 7.0.3a なので,vi 等使って以下の通りに最終行を変更します.
■変更前最終行
exec $java_start_bin $jvm_dynargs $security_dynargs $original_args
■変更後の最終 2 行
log4j_arg="-Dlog4j2.formatMsgNoLookups=true" exec $java_start_bin $jvm_dynargs $log4j_arg $security_dynargs $original_args
Java オプションを変数 log4j_arg に入れて,実行時に加えてあげてるだけですね.
vCenter サービスを再起動しましょう.
まず,service-control --stop --all で停止.
root@vcsa [ ~ ]# service-control --stop --all Operation not cancellable. Please wait for it to finish... Performing stop operation on service observability... Successfully stopped service observability Performing stop operation on service vmware-pod... Successfully stopped service vmware-pod Performing stop operation on service vmware-vdtc... Successfully stopped service vmware-vdtc Performing stop operation on profile: ALL... Successfully stopped service vmware-vmon Successfully stopped profile: ALL. Performing stop operation on service vmcad... Successfully stopped service vmcad Performing stop operation on service vmdird... Successfully stopped service vmdird Performing stop operation on service vmafdd... Successfully stopped service vmafdd Performing stop operation on service lwsmd... Successfully stopped service lwsmd root@vcsa [ ~ ]#
しっかり落ちたので,service-control --start --all します.
root@vcsa [ ~ ]# service-control --start --all Operation not cancellable. Please wait for it to finish... Performing start operation on service lwsmd... Successfully started service lwsmd Performing start operation on service vmafdd... Successfully started service vmafdd Performing start operation on service vmdird... Successfully started service vmdird Performing start operation on service vmcad... Successfully started service vmcad Performing start operation on profile: ALL... Successfully started service vmware-vmon Successfully started profile: ALL. Performing start operation on service observability... Successfully started service observability Performing start operation on service vmware-vdtc... Successfully started service vmware-vdtc Performing start operation on service vmware-pod... Successfully started service vmware-pod root@vcsa [ ~ ]#
確認手順も KB87081 中に記載があるので,その通りに実行してみましょう.
vMON の場合はプロセス参照して formatMsgNoLookups キーワードでひっかけるようです.
出力が多いので 1 つだけで省略しますが,私の環境では 21 個のプロセスでオプションが有効になっている事が確認できました.
root@vcsa [ / ]# ps auxww | grep formatMsgNoLookups eam 3940 1.4 1.6 2681088 318080 ? Sl 16:07 0:38 /usr/java/jre-vmware/bin/vmware-eam.launcher -Xmx128m -XX:CompressedClassSpaceSize=64m -Xss256k -XX:ParallelGCThreads=1 -Dlog4j2.formatMsgNoLookups=true -Djava.ext.dirs=/usr/java/jre-vmware/lib/ext:/opt/vmware/jre_ext:/usr/java/jre-vmware/lib/ext-fips -Dorg.bouncycastle.fips.approved_only=true -Dorg.bouncycastle.jca.enable_jks=true -Djava.security.properties==/etc/vmware/java/vmware-override-fips-java.security -Dvim.versions.path=/etc/vmware/../vmware-vpx/docRoot/sdk/vimServiceVersions.xml -Dextension.descriptor.path=/etc/vmware/../vmware-eam/firstboot/extension/extension.xml.installer -Djava.endorsed.dirs=/var/opt/apache-tomcat/endorsed -Dcatalina.home=/var/opt/apache-tomcat -Dcatalina.base=/usr/lib/vmware-eam/web -Dcatalina.config=file:/etc/vmware/../vmware-eam/catalina.properties -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/vmware/eam -XX:ErrorFile=/var/log/vmware/eam/java_error%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintReferenceGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1024K -Xloggc:/var/log/vmware/eam/vmware-eam-gc.log -Duser.timezone=UTC -classpath /etc/vmware/../vmware-eam/:/var/opt/apache-tomcat/lib/servlet-api.jar:/var/opt/apache-tomcat/bin/tomcat-juli.jar:/var/opt/apache-tomcat/bin/bootstrap.jar:/usr/lib/vmware/common-jars/spring-core-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-context-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-beans-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-web-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/log4j-api-2.11.0.jar:/usr/lib/vmware/common-jars/log4j-1.2-api-2.11.0.jar:/usr/lib/vmware/common-jars/log4j-core-2.11.0.jar:/usr/lib/vmware/common-jars/commons-lang-2.6.jar:/usr/lib/vmware/common-jars/commons-codec-1.6.jar:/usr/lib/vmware/common-jars/commons-logging-1.1.3.jar:/usr/lib/vmware/common-jars/httpclient-4.5.12.jar:/usr/lib/vmware/common-jars/httpcore-4.4.13.jar:/usr/lib/vmware/common-jars/httpasyncclient-4.1.4.jar:/usr/lib/vmware/common-jars/httpcore-nio-4.4.13.jar:/usr/lib/vmware/common-jars/jackson-core-2.11.4.jar:/usr/lib/vmware/common-jars/jackson-databind-2.11.4.jar:/usr/lib/vmware/common-jars/spring-webmvc-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/spring-expression-4.3.30.RELEASE.jar:/usr/lib/vmware/common-jars/log4j-web-2.12.1.jar:/usr/lib/vmware/common-jars/log4j-appserver-2.12.1.jar:/usr/lib/vmware/common-jars/log4j-jcl-2.11.0.jar:/usr/lib/vmware/common-jars/stax2-api-3.0.1.jar:/usr/lib/vmware/common-jars/woodstox-core-asl-4.0.5.jar:/usr/lib/vmware/common-jars/jackson-annotations-2.11.4.jar:/usr/lib/vmware/common-jars/commons-io-1.4.jar:/usr/lib/vmware/common-jars/slf4j-api-1.7.30.jar:/usr/lib/vmware/common-jars/slf4j-log4j12-1.7.30.jar org.apache.catalina.startup.Bootstrap start (省略)
2. Update Manager サービス
/usr/lib/vmware-updatemgr/bin/jetty/start.ini を変更します.ファイルのバックアップをとって始めましょう.
root@vcsa [ ~ ]# cp -p /usr/lib/vmware-updatemgr/bin/jetty/start.ini /usr/lib/vmware-updatemgr/bin/jetty/start.ini.bak
start.ini の最終行に,-Dlog4j2.formatMsgNoLookups=true を加えるだけ,Build による差異もありません.
■変更前
(省略) # Initialize module deploy # --module=deploy ## DeployManager configuration # Monitored Directory name (relative to jetty.base) # jetty.deploy.monitoredDirName=webapps
■変更後
(省略) # Initialize module deploy # --module=deploy ## DeployManager configuration # Monitored Directory name (relative to jetty.base) # jetty.deploy.monitoredDirName=webapps -Dlog4j2.formatMsgNoLookups=true
Update Manager サービスを再起動します.
root@vcsa [ ~ ]# service-control --restart vmware-updatemgr Successfully restarted service updatemgr root@vcsa [ ~ ]#
オプションが有効になったか確認しましょう. jetty のディレクトリまで降りて
java -jar start.jar --list-config を打ってみます.
root@vcsa [ / ]# cd /usr/lib/vmware-updatemgr/bin/jetty root@vcsa [ /usr/lib/vmware-updatemgr/bin/jetty ]# java -jar start.jar --list-config (省略) Properties: ----------- java.version = 1.8.0_291 (省略) log4j2.formatMsgNoLookups = true (省略)
true になっていますね.
3. Analytics サービス
log4j が 2.10.0 前のバージョンなので,JndiLookup クラスをクラスパスから削除して対応します.
これまでと同様,ファイルのバックアップをとってから始めましょう.
対象ファイルは /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar です.
root@vcsa [ ~ ]# cp -p /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar.bak
zip コマンドで JndiLookup.class を無効化します.
zip コマンドオプション -d で .jar アーカイブから指定したファイルを削除,-q は処理内容非表示です.(warning が大量に出るので,-q はつけて実行するのがおすすめです.)
root@vcsa [ / ]# zip -q -d /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
Analytics サービスを再起動します.
root@vcsa [ / ]# service-control --restart vmware-analytics Successfully restarted service analytics root@vcsa [ ~ ]#
こちらも確認してみましょう.jndilookup 探して戻りが 0 なら OK.
root@vcsa [ / ]# grep -i jndilookup /usr/lib/vmware/common-jars/log4j-core-2.8.2.jar | wc -l 0
大丈夫ですね!ちなみに,対策実施していない場合には 1 が戻ります.
4. DBCC ユーティリティ
いよいよ最後です.こちらも JndiLookup クラスを削除します.
対象ファイルは /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar です.
毎回面倒かもしれませんが,バックアップとってから作業しましょう.
root@vcsa [ ~ ]# cp -p /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar.bak
Analytics サービスの時と同様,zip コマンドでクラスを削除します.
root@vcsa [ / ]# zip -q -d /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
jndilookup 探して確認しましょう.
root@vcsa [ / ]# grep -i jndilookup /usr/lib/vmware-dbcc/lib/log4j-core-2.8.2.jar | wc -l 0
5. まとめ
KB が英語なので読むの面倒かとは思いますが,Workaround 個々に見れば単純作業です.CVSS のスコアが 10.0 と高いので,是非早期対応を心がけてください.