Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

Apache Log4j2 脆弱性(Log4shell) - Tableau Server 改善手順

公開日: Dec 9, 2022
説明
セキュリティの脆弱性により、Apacheのlog4jライブラリを使ってリモートからコード実行が可能になる問題があります。

Cause

Apache Log4j 2ライブラリのセキュリティ脆弱性 CVE-2021-44228CVE-2021-45046が公開されました。
解決策

オプション1:Tableauを更新する

  • ライセンスのメンテナンス期間が有効なお客様は、影響のあるバージョン(2021/12/15より前のすべてのバージョン)からアップデートしていない場合、または2021/12/15の製品リリースにアップデートしている場合は、より新しいリリースの該当製品にアップデートしてください。

重要:2021/12/19 の製品リリースにアップグレードした後、以前の古いバージョンで使用されていたファイルがシステムに残っている場合があります。例えば、トポロジの変更でプロセスを他のノードに移動してプロセス数を変更した場合など。log4j-core-2.15及びそれより古いバージョンのファイルは削除しても問題ありません。これらのファイルはTableau Serverのオペレーションでアクセスされることはなく、削除しても問題ありません。例えば‘log4j-core-2.16.0.jar’ より古いバージョンのファイルが残っている場合は、削除しても問題ありません。またはサービスをデプロイし直すことで、ディレクトリがクリーンアップされ新しいファイルがデプロイされます。(ノードの構成を参照)

2021/12/15のTableau製品リリースにて、Log4j2のファイルがバージョン2.15に更新されました。まだ付属のコンポーネントが残っている可能性があります。それらのコンポーネントに対して影響を軽減させるためJNDIの機能を無効にする変更をしました。

2021/12/19のTableau製品リリースにて、Log4j 2.16が組み込まれJNDJの機能がデフォルトで無効になりました。これによりCVE-2021-44228 と CVE-2021-45046 に対する対応がされています。

上記2021/12/19の製品リリースにアップグレードすることで、CVE-2021-44228 及び CVE-2021-45046で判明しているセキュリティ問題に対応できます。
 


オプション2:下記の場合はオプション2の改善手順を実行してください。

  • 2021/12/15の製品リリースにアップデートしたが、より新しい製品リリースにアップデートできない場合(メンテナンス契約や期限が切れている場合など)。
注意:
  • 下記手順は、log4jを2.16に更新した2021/12/19の製品リリースに対して実行するものではありません。
  • 下記改善手順は、2021/12/19の製品リリース以前のTableau Server バージョン2020.1 ~ 2021.4に対して実行されるものです。
下記手順は、脆弱性のあるjarファイルから jndilookup.class を削除するものです。2つのコンポーネントについてその機能の削除がうまくいかないものがあり、それらのコンポーネントのjarファイルについては2.16で置き換えられます。スクリプトを実行するのにPythonが必要になります。スクリプトはネストされたjavaライブラリの内部の すべてのJndiLookup.classのインスタンスを見つけるためのものです。

Tableau Server

注意:
  • 効果的な改善対処をするため、全javaアーカイブをスキャンするのに最低1時間のダウンタイムを確保してください。手順は順番通りに実行し、手動でlog4jファイルを修正することは避けてください。下記手順は、2020.1-2020.3、及びサポートされている全メジャーバージョンにて検証済ですが、実行前にサーバーのスナップショットをとりバックアップを実行することを推奨します。
  • 2021/12/19の製品リリースにアップデート済の場合は、JNDI機能は無効にされているためこの手順を実行する必要はありません。

Tableau Server for Windows

手順の詳細は動画を参照してください。動画に音声はありません。

 

ステップ 1: 各ノード上で下記手順を実行します


1. Python 3.10をダウンロードしてインストールします: https://www.python.org/downloads/

2. “Download the latest version for Windows,” の下の “Download Python 3.10.1”を選択します。
 
直リンク: Windows インストーラーのダウンロード(64-bit) https://www.python.org/ftp/python/3.10.1/python-3.10.1-amd64.exe
3. ファイルをダウンロードした場所に移動します。例: C:\users\<username>\Downloads

4. Python-3.10.1-amd64を右クリックして “Run as administrator”を選択します。

5. セットアップが起動したら “Add Python 3.10 to path”を選択します。

6. "Install now" または "Customize the installation" を選択してインストール場所を設定します。

“This installation is forbidden by system policy,” というエラーが表示された場合は、ダウンロードしたファイルを右クリックして“Run as Administrator”を選択して再実行してください。

7. インストールの最後で “Disable path length limit”を選択します。

8. このKBに添付されている必要なPythonスクリプトとWindows用Log4j バージョン2.16をダウンロードします。remove_jndi.zipには次のファイルが含まれています:

  • log4j-api-2.16.0.jar
  • log4j-core-2.16.0.jar
  • log4j-slf4j-impl-2.16.0.jar
  • remove_jndilookup_win.py
8a. 新しい管理コマンドプロンプトを開いてPythonがパスに含まれていることを確認します。

8b. 下記コマンドでディレクトリ c:\remove_jdni を作成します。
 
mkdir c:\remove_jndi
 
8c. 手順8bで作成したフォルダ配下に、手順8でダウンロード、解凍したファイルを移動します。注意: このディレクトリ C:\remove_jndi ファイルの場所としてこの後の手順で参照されます。
 
このノードが最初にこの手順を実行しているノードの場合は、Tableau Serverを停止します:
 
tsm stop
 

ステップ 2: administrative services を停止する

1. Tableau Server を停止した後、各ノードで\packages\scripts.<version>ディレクトリからstop-administative-services.cmdを実行してadministrative serviceを停止します。
デフォルトは下記です:
例: “C:\Program Files\Tableau\Tableau Server\packages\scripts.<version>”
2. インストールパッケージフォルダ内のscripts<version> ディレクトリに移動します:
 
下記コマンドは、環境変数でバージョン毎に異なるパスを使用しています。

cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\scripts.%TABLEAU_SERVER_DATA_DIR_VERSION%"
3. stop administrative services スクリプトを実行します:
 
a. stop-administrative-services.cmd

b. remove_jndilookup スクリプトを実行してTableau Serverの場所からjndilookup classを削除します:
 
python.exe c:\remove_jndi\remove_jndilookup_win.py "C:\Program Files\Tableau\Tableau Server"

エラーが出るためパスの末尾に “\” を追加しないでください。

remove_jndilookup_win.py を実行する度にJndiLookup.classが削除されたログ出力がされます。例: 

“Findings:

Detected org/apache/logging/log4j/core/lookup/JndiLookup.class in C:\Program Files\Tableau\Tableau Server\<path to file>“
c. デフォルトの場所にインストールした場合は、2回目を実行する必要があります:
 
python.exe c:\remove_jndi\remove_jndilookup_win.py "c:\ProgramData\Tableau\Tableau Server"
 
エラーが出るためパスの末尾に “\” を追加しないでください。
 

バージョン 2020.1 ~ 2020.3 及び 2021/12/15の製品リリース(2021.4.1, 2021.3.5, 2021.2.6, 2021.1.9, 2020.4.12)の場合は ステップ4のAdministrative Service1の開始に進んでください。

ステップ 3: バージョン 2020.4 以降(2021/12/15の製品リリースを除く)では、Pythonスクリプトを実行した後、Log4j 2.16 ファイルを elasticsearch と solr ディレクトリにコピーします。(デフォルトの場所の場合は2回実行します)

1. elastic search ディレクトリの場所を確認します。
 
a. 例: C:\Program Files\Tableau\Tableau Server\packages\elasticsearch.20213.21.0917.1006

b. cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\elasticsearch.%TABLEAU_SERVER_DATA_DIR_VERSION%\lib"
2. elasticsearch.%TABLEAU_SERVER_DATA_DIR_VERSION%\lib ディレクトリ内で log4j-core-2.16.0.jar とlog4j-api.2.16.0.jar をカレントディレクトリにコピーします。
 
注意: 下記手順内のピリオドはカレントディレクトリを意味します。

a. copy c:\remove_jndi\log4j-core-2.16.0.jar .

b. copy c:\remove_jndi\log4j-api-2.16.0.jar .
3. elasticsearch.%TABLEAU_SERVER_DATA_DIR_VERSION%\lib ディレクトリ内で古いバージョンを削除します。
 
a. del log4j-api-2.11.1.jar

b. del log4j-core-2.11.1.jar
4. “C:\Program Files\Tableau\Tableau の下のplugins\search-guard7 ディレクトリに移動します。Server\packages\elasticsearch.%TABLEAU_SERVER_DATA_DIR_VERSION%”
cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\elasticsearch.%TABLEAU_SERVER_DATA_DIR_VERSION%\plugins\search-guard-7"
 
5. 古い jarを削除します:
 
del log4j-slf4j-impl-2.11.1.jar
6. 新しいjarで古いjarを上書きコピーします:
 
copy c:\remove_jndi\log4j-slf4j-impl-2.16.0.jar log4j-slf4j-impl-2.11.1.jar
 
7. 下記ディレクトリに移動します。 packages\solr7.%TABLEAU_SERVER_DATA_DIR_VERSION%\server\lib\ext folder
cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\solr7.%TABLEAU_SERVER_DATA_DIR_VERSION%\server\lib\ext"
 
8. 3個の2.16.0 のjarファイルを全てカレントディレクトリにコピーします。(ピリオドがカレントディレクトリを指しています):
copy c:\remove_jndi\log4j*.jar .
 
9. There is one additional jar to delete in the elasticserver ディレクトリ内のもう一つのjarファイルを削除します。デフォルトの場所は ProgramData の下です。 “C:\ProgramData\Tableau\Tableau Server\data\tabsvc\services\elasticserver_0.%TABLEAU_SERVER_DATA_DIR_VERSION%\plugins\search-guard-7” ディレクトリに移動します。
 
 
cd "%TABLEAU_SERVER_DATA_DIR%\data\tabsvc\services\elasticserver_0.%TABLEAU_SERVER_DATA_DIR_VERSION%\plugins\search-guard-7"
 
 
10. log4j-slf4j-impl-2.11.1.jarを削除します。
 
del log4j-slf4j-impl-2.11.1.jar

推奨手順: 製品にバージョン2.16より古いJndiLookup.class ファイルが残っていないことを確認します。

1. remove_jndilookup スクリプトを “--dryrun” フラグを付けて実行することで、ファイルに対してなにも処理をせずディレクトリをスキャンのみします:

python.exe c:\remove_jndi\remove_jndilookup_win.py --dryrun "C:\Program Files\Tableau\Tableau Server" > verification.txt

python.exe c:\remove_jndi\remove_jndilookup_win.py --dryrun "c:\ProgramData\Tableau\Tableau Server" >> verification.txt

2. verification.txtの出力ファイルにて "Findings:" の箇所になにも出力レコードがない場合は、JndiLookup.classを含むjarファイルがなにも見つからなかったことになります。
 

ステップ 4: administrative servicesを開始して構成変更を適用し、Tableau Serverを起動します。

 
1. 各ノード上でTSMサービスを開始します:
 
a. cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\scripts.%TABLEAU_SERVER_DATA_DIR_VERSION%"
 
b. start-administrative-services.cmd
 
注意: 各Tableau Serverノード上でadministrative serviceが開始した後、warファイルを再作成するため構成変更をする必要があります:
2. gateway.timeoutの現在の値を取得します。
 
tsm configuration get -k gateway.timeout
 
3. gateway.timeout の値を1増やします:
 
tsm configuration set -k gateway.timeout -v <現在の値 +1, 例 7201 がデフォルト>
4. 変更を適用します。
 
tsm pending-changes apply
5. Tableau Serverを起動します。
 
tsm start
 
以上でTableau Server内のすべての.jar, .warファイルからJdniLookup.class ファイルが削除されました。
 

Tableau Server for Linux

下記手順はsudoで実行します。rootでは実行しないでください。

注意: 下記手順は、クラスタ内の各ノードにPythonがインストールされてることを前提にしています。

ステップ 1: 各ノードで下記手順を実行します。


1. このKBに添付されている必要なPythonスクリプトとLinux用Log4j バージョン2.16をダウンロードします。remove_jndi_linux.tar.gzには次のファイルが含まれています:
  • log4j-api-2.16.0.jar
  • log4j-core-2.16.0.jar
  • log4j-slf4j-impl-2.16.0.jar
  • remove_jndilookup.py
2. remove_jndi_linux.tar.gzを解凍します。
 
sudo tar -xzvf remove_jndi_linux.tar.gz
 
3. homeディレクトリに /elasticJars という名前のディレクトリを作成して3個のjarファイルを作成したディレクトリに移動します:
 
mkdir ~/elasticJars
mv ./log4j* ~/elasticJars

4. elasticJars内のjarファイルのパーミッションを  -rw-r--r-- に設定します。
 
sudo chmod -R 644 ./elasticJars/
5. remove_jndilookup.py スクリプトのパーミッションを設定します。
sudo chmod 744 ./remove_jndilookup.py
6. Tableau Serverを停止します。
tsm stop
 
7. 環境変数 TABLEAU_SERVER_DATA_DIR_VERSION が環境にあることを確認します。
env | grep TABLEAU_SERVER_DATA_DIR_VERSION
7a. 上記コマンドでバージョン情報が確認できない場合は、下記コマンドでこのセッションのために変数を設定します。
export $(cat /etc/opt/tableau/tableau_server/environment.bash | grep TABLEAU_SERVER_DATA_DIR_VERSION | xargs)
 
7b. 環境変数 TABLEAU_SERVER_DATA_DIR_VERSION が環境に存在することを確認します。
env | grep TABLEAU_SERVER_DATA_DIR_VERSION

ステップ2: 各ノードでadministrative services を停止します

注意: 各ノード上で下記全手順を繰り返します。この手順は下記デフォルトのインストール場所を前提にしています。 /opt/tableau/tableau_server/packages
 
1. administrative servicesを停止します。
sudo /opt/tableau/tableau_server/packages/scripts.$TABLEAU_SERVER_DATA_DIR_VERSION/stop-administrative-services
2. remove_jndilookup.py スクリプトを実行してpackagesディレクトリ内のjarファイルからJndiLookup.classを削除します。
sudo ./remove_jndilookup.py /opt/tableau/tableau_server/packages
注意: remove_jndilookup.py スクリプトの実行が完了したら、dataディレクトリに対して2回目を実行します。デフォルトは /var/opt/tableau/tableau_server です。
 
3. 最初に権限のないユーザーのhomeディレクトリ(デフォルトでtableau)にスクリプトのコピーを作成します。
sudo cp ./remove_jndilookup.py /var/opt/tableau/tableau_server
4. スクリプトの所有者をtableauユーザーとグループに変更します。 
 
sudo chown tableau:tableau /var/opt/tableau/tableau_server/remove_jndilookup.py
 
5. 権限のないユーザーでセッションを開始します。
sudo su -l tableau
6. スクリプトを実行して、dataディレクトリのjarファイルからJndiLookup.classを削除します。
./remove_jndilookup.py /var/opt/tableau/tableau_server
7. Tableau シェルを終了します。
exit

バージョン 2020.1 ~ 2020.3 及び 2021/12/15の製品リリース(2021.4.1, 2021.3.5, 2021.2.6, 2021.1.9, 2020.4.12)の場合は ステップ4のAdministrative Service1の開始に進んでください。

ステップ 3: バージョン 2020.4 以降(2021/12/15の製品リリースを除く)では、Pythonスクリプトを2回実行した後、Log4j 2.16 ファイルを elasticsearch ディレクトリにコピーします。

 
1. 各ノード上にて~/elasticJars からjarファイルをターゲット場所にコピーして古いjarファイルを削除します。
sudo cp ./elasticJars/log4j-api-2.16.0.jar /opt/tableau/tableau_server/packages/elasticsearch.$TABLEAU_SERVER_DATA_DIR_VERSION/lib/

sudo cp ./elasticJars/log4j-core-2.16.0.jar /opt/tableau/tableau_server/packages/elasticsearch.$TABLEAU_SERVER_DATA_DIR_VERSION/lib/

sudo cp ./elasticJars/log4j-slf4j-impl-2.16.0.jar /opt/tableau/tableau_server/packages/elasticsearch.$TABLEAU_SERVER_DATA_DIR_VERSION/plugins/search-guard-7/log4j-slf4j-impl-2.11.1.jar

sudo rm /var/opt/tableau/tableau_server/data/tabsvc/services/elasticserver_0.$TABLEAU_SERVER_DATA_DIR_VERSION/plugins/search-guard-7/log4j-slf4j-impl-2.11.1.jar

sudo rm /opt/tableau/tableau_server/packages/elasticsearch.$TABLEAU_SERVER_DATA_DIR_VERSION/lib/log4j-api-2.11.1.jar

sudo rm /opt/tableau/tableau_server/packages/elasticsearch.$TABLEAU_SERVER_DATA_DIR_VERSION/lib/log4j-core-2.11.1.jar


推奨手順: 製品にバージョン2.16より古いJndiLookup.class ファイルが残っていないことを確認します。

1. remove_jndilookup スクリプトを “--dryrun” フラグを付けて実行することで、ファイルに対してなにも処理をせずディレクトリをスキャンのみします。

sudo ./remove_jndilookup.py --dryrun /opt/tableau/tableau_server/packages > verification.txt

注意: remove_jndilookup.py スクリプトが実行完了したら、dataディレクトリに対して2回目を実行します。デフォルトは /var/opt/tableau/tableau_server です。

2. まず権限のないユーザーのhomeディレクトリにスクリプトのコピーを作成します。デフォルトは tableauです。

sudo cp ./remove_jndilookup.py /var/opt/tableau/tableau_server

3. スクリプトの所有者をtableau ユーザーとグループに変更します。

 sudo chown tableau:tableau /var/opt/tableau/tableau_server/remove_jndilookup.py

5. 権限のないユーザーでセッションを開始します。

sudo su -l tableau

6.  --dryrun フラグをつけてスクリプトでファイルは処理せずに、ディレクトリのスキャンのみを実行します。

./remove_jndilookup.py –dryrun /var/opt/tableau/tableau_server > datadirverification.txt

verification.txt 及び datadirverification.txtの出力ファイルにて "Findings:" の箇所になにも出力レコードがない場合は、JndiLookup.classを含むjarファイルがなにも見つからなかったことになります。

7. Tableau シェルを終了します。
exit

ステップ4: Administrative Servicesを開始します

 
1. 各ノード上でadministrative servicesを開始します:
sudo /opt/tableau/tableau_server/packages/scripts.$TABLEAU_SERVER_DATA_DIR_VERSION/start-administrative-services

注意: 各Tableau Serverノード上でadministrative serviceが開始した後、warファイルを再作成するため構成変更をする必要があります:
2. gateway.timeoutの現在の値を取得します:
tsm configuration get -k gateway.timeout
3. gateway.timeout の値を1増やします:
tsm configuration set -k gateway.timeout -v <現在の値 +1, 例 7201 がデフォルト>
4. 変更を適用します。
  
tsm pending-changes apply
 
5. Tableau Serverを起動します。
tsm start
 
以上でTableau Server内のすべての.jar, .warファイルからJdniLookup.class ファイルが削除されました。

オプション 3: Tableau Server バージョン2020.4以降について"システム環境変数"を設定することで脆弱性を改善する。 (Tableau Server のみ)

注意: これはCVE-44228に対する一時的及び部分的な対処策で、マシン上の全javaプロセスの環境変数が変更されます。
 

Linux の場合の手順


1. Tableau Serverを停止します。
tsm stop
2. TSM administrative servicesを停止します。次のスクリプトを実行します:
sudo /opt/tableau/tableau_server/packages/scripts.<version>/stop-administrative-services
3. 権限のないユーザーに切り替えます (デフォルトユーザーはtableauです)
sudo su -l tableau
4. 脆弱性を改善するためのlog4j.conf ファイルを作成します。
echo LOG4J_FORMAT_MSG_NO_LOOKUPS=true >> ~/.config/systemd/tableau_server.conf.d/log4j.conf
5. Tableau シェルを閉じます。次のコマンドを実行します:
exit
6. TSM administrative servicesを開始します。次のスクリプトを実行します:
sudo /opt/tableau/tableau_server/packages/scripts.<version>/start-administrative-services
7. マルチノード構成の場合、クラスタ内の各ノードにてステップ 2 から 6 を繰り返します。 
8. TSMを起動します。
tsm start
9. 再起動後、pgrep -l run- コマンドを実行してTableauプロセスのいずれかのpidを取得します。
 
10. sudo strings /proc/<pid>/environ コマンドを実行します。
 <pid> はステップ 9で取得した値を入力します。
 
11. ステップ 10の出力に LOG4J_FORMAT_MSG_NO_LOOKUPS=true が存在することを確認します。
 
 

Windows の場合の手順

 
1. 管理PowerShell ウィンドウを開きます。
 
2. 初期ノードでTableau Serverを停止します。
tsm stop
3. 各ノード上でTSM administrative servicesを停止します。次のスクリプトを実行します:
C:\Program Files\Tableau\Tableau Server\packages\scripts.<version>\stop-administrative-services.cmd
4. システム環境変数 LOG4J_FORMAT_MSG_NO_LOOKUPS を作成し trueに設定します。PowerShellでのショートカットは下記です:
 
[System.Environment]::SetEnvironmentVariable(‘LOG4J_FORMAT_MSG_NO_LOOKUPS’,‘true’,[System.EnvironmentVariableTarget]::Machine)
5. マルチノード構成の場合は、クラスタ内の各ノード上でステップ 3から4を実行します。
 
6. 各ノード上でTSM administrative servicesを開始します。次のスクリプトを実行します:
C:\Program Files\Tableau\Tableau Server\packages\scripts.<version>\start-administrative-services.cmd
7. 初期ノードでTableau Serverを起動します。
tsm start
8. 管理コマンドウィンドウを開いて、setコマンドを実行し環境変数 LOG4J_FORMAT_MSG_NO_LOOKUPS=true がコマンド出力に存在することを確認します。
 
その他のリソース
Tableau Cloudについての詳細情報については、Salesforce Trust Site を参照してください。
ナレッジ記事番号

001534225

添付ファイル

remove_jndi.zip

1850 KB

remove_jndi_linux.tar.gz

1846 KB

 
読み込み中
Salesforce Help | Article