Loading

Apache Log4j2 漏洞 (Log4shell) - Tableau Server 迁移步骤

发布日期: Dec 9, 2022
描述
最近公开的漏洞可以在使用 Log4j Apache 库的产品中远程执行代码

Cause

Apache Log4j 2 库中的安全漏洞 CVE-2021-44228CVE-2021-45046
解决方案

选项 1:更新 Tableau

 

对于正在进行有效维护的客户,如果未从受影响版本(2021 年 12 月 15 日之前的任何产品版本)更新,或更新到 2021 年 12 月 15 日产品版本,请更新到以下一个较新的版本:

重要事项:在更新到 2021 年 12 月 19 日产品版本或较新版本后,文件系统可能已有先前配置的进程提供的旧文件。例如,在更改拓扑从而更改进程计数或将进程移到其他 Tableau Server 节点后。 log4j-core-2.15 或早期版本可以安全删除。 这些文件始终不得作为 Tableau Server 操作的一部分访问,并且可以按需安全移除。或者,重新部署服务也将清理目录,并部署更新的文件(请查看配置节点在线帮助指南)。
 
2021 年 12 月 15 日 Tableau 产品版本已将 Log4j2 文件更新到版本 2.15。系统还有剩余的诊断或辅助组件。我们禁用易受攻击的 JNDI 查找功能的配置变更,解决这些未处理的组件。
2021 年 12 月 19 日 Tableau 产品版本已经集成 Log4j 2.16 版本,该版本默认情况下禁用 JNDI 查找。此措施解决了 CVE-2021-44228CVE-2021-45046
  • Tableau Server 2021.4.2+、2021.3.6+、2021.2.7+、2021.1.10+、2020.4.13+
通过更新到 2021 年 12 月 19 日之后的产品版本,即可解决目前在 CVE-2021-44228CVE-2021-45046 中发现的安全问题

 

选项 2:如果出现以下情况,请执行选项 2 详述的缓解步骤:

您已更新到 2021 年 12 月 15 日之后的产品版本,并且无法更新到更新的版本(停止维护、公司更新时段之外等)。
您正在使用受影响版本(2021 年 12 月 15 日之前的任何产品版本),并且无法更新到更新的版本。

注意:
  • 对于将 log4j 更新到 2.16 的 2021 年 12 月 19 日产品版本,不打算执行这些步骤。
  • 这些缓解步骤适用于 2021 年 12 月 19 日产品版本和和较新版本之前的 Tableau Server 版本 v2020.1 - v2021.4

这些指令将 jndilookup.class 从易受攻击的 jar 中移除。两个组件在移除功能后无法正常工作,我们会使用 2.16 替换这些特定组件 jar。需要 Python,才可以运行脚本。该脚本会确保,我们可以找到 JndiLookup.class 文件的所有实例,即使在嵌入 Java 库中。 

Tableau Server

注意
  • 停机时间计划至少为 1 小时,这是因为我们需要扫描每个 Java 归档,才可以确保有效修复。请勿尝试手动修改任何 log4j 文件,这样会使这些步骤出现偏差。虽然这些步骤已在所有支持的主要版本及 2020.1-2020.3 中进行测试,但 Tableau 建议在开始任何手动修改前对服务器进行快照和备份。
  • 如果您已从 2021 年 12 月 19 日之前的产品版本或较新版本更新,则无需采取任何措施,这是因为我们已禁用这些版本的 JNDI 查找。

适用于 Windows 的 Tableau Server

要更透彻地查看以下视频显示的步骤,展开部分。注意:视频没有声音。

步骤 1:在每个节点上,执行以下操作


1.下载并安装 Python 3.10:https://www.python.org/downloads/

2.在“下载适用于 Windows 的最新版本”下方,选择“下载 Python 3.10.1”
 
直接链接:下载 Windows Installer(64 位)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,并选择“以管理员身份运行”

5.在设置启动时,选择“将 Python 3.10 添加到路径”

6.如果需要,选择“立即安装”或“自定义安装”,配置备用安装路径

如果看到错误“系统策略禁止此安装”,使用右键单击“以管理员身份运行”从下载重新运行

7.在安装结束时,选择“禁用路径长度限制”

8.在本文随附的 remove_jndi.zip 中,下载所需 Python 脚本和适用于 Windows 的 Log4j 版本 2.16 jar,其中包含:

  • 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.将以上 4 个文件移到此目录。注意:此目录 C:\remove_jndi 将在下方指令中引用为这些文件的位置
 
如果这是您执行这些指令的第一个节点,停止 Tableau Server:
 
tsm stop
 

步骤 2:停止管理服务 

1.在 Tableau Server 停止后,通过在 \packages\scripts.<version> 目录中运行 stop-administative-services.cmd,停止每个节点中的管理服务。默认情况下,这是:
 
示例路径“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.运行停止管理服务脚本:
 
a. stop-administrative-services.cmd

b.运行 remove_jndilookup 脚本,将 jndilookup 类从您安装的 Tableau 服务器位置移除:
 
python.exe c:\remove_jndi\remove_jndilookup_win.py "C:\Program Files\Tableau\Tableau Server"

请勿在路径末尾添加“\”,否则将出错。

在每次运行 remove_jndilookup_win.py 结束时,您将看到日志记录,以及从中移除的文件 JndiLookup.class。示例:

“调查发现:

在 C:\Program Files\Tableau\Tableau Server\<path to file> 中,检测到 org/apache/logging/log4j/core/lookup/JndiLookup.class”

c.如果安装到默认位置,需要重新运行:
 
python.exe c:\remove_jndi\remove_jndilookup_win.py "c:\ProgramData\Tableau\Tableau Server"
 
请勿在路径末尾添加“\”,否则将出错。


对于 2020.1 至 2020.3 版本以及 2021 年 12 月 15 日之前的 12 月维护版本(2021.4.1、2021.3.5、2021.2.6、2021.1.9、2020.4.12),跳至步骤 4,启动管理服务
 

步骤 3:对于版本 2020.4 及更高版本(12 月维护版本除外),在运行 Python 脚本(如果安装到默认位置,需要运行两次)后,将 Log4j 2.16 文件复制到 elasticsearch 和 solr 目录。


1.在安装中,查找弹性搜索目录
 
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 Server\packages\elasticsearch.%TABLEAU_SERVER_DATA_DIR_VERSION%”下方,更改为 plugins\search-guard7 目录
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 文件夹

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.elasticserver 目录还有一个需要删除的 jar;在默认安装中,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.使用“--dryrun”标志运行 remove_jndilookup,指示脚本扫描目录,但不对文件执行任何操作:

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:启动管理服务,应用配置更改,确保传播更改,然后启动服务器。

 
1.在每个节点中,启动 TSM 管理服务:
 
a. cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\scripts.%TABLEAU_SERVER_DATA_DIR_VERSION%"
 
b. start-administrative-services.cmd
 
注意:在每个 Tableau Server 节点启动管理服务后,我们需要更改配置,才可以重新生成 war 文件:

2.返回初始节点,找到 gateway.timeout 的当前值:
 
tsm configuration get -k gateway.timeout
 
3.将 gateway.timeout 的值加 1:
 
tsm configuration set -k gateway.timeout -v <current value +1, example 7201 if set at default>

4.应用未完成更改
 
tsm pending-changes apply

5.启动 Tableau Server
 
tsm start
 
现在,在 Tableau Server 中,JdniLookup.class 文件应从所有 .jar 和 .war 文件中移除。

Linux 版 Tableau Server

请勿root 身份运行以下步骤。改用 sudo

注意:这些指令会假设 Python 安装到群集中的每个节点。

步骤 1:在每个节点上,执行以下操作


1.在本文随附的 remove_jndi_linux.tar.gz 中,下载所需 Python 脚本和适用于 Linux 的 Log4j 版本 2.16 jar,其中包含:
  • 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.在主目录中创建名为 /elasticJars 的目录,并将 3 个 jar 文件移到 /elasticJars 目录:
 
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:停止每个节点的管理服务

注意:在每个节点中,重复下列所有步骤。这些步骤会假设默认安装位置:/opt/tableau/tableau_server/packages
 

1.停止管理服务

sudo /opt/tableau/tableau_server/packages/scripts.$TABLEAU_SERVER_DATA_DIR_VERSION/stop-administrative-services

2.运行 remove_jndilookup.py 脚本,将 JndiLookup.class 文件从软件包目录内部 jar 中移除。

sudo ./remove_jndilookup.py /opt/tableau/tableau_server/packages

注意:在 remove_jndilookup.py 脚本完成后,需要对数据目录重新运行该脚本。默认是 /var/opt/tableau/tableau_server。
 

3.首先,将脚本复制到非特权用户的主目录,默认名称是 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.运行脚本,将 JndiLookup.class 文件从数据目录内部 jar 中移除。

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

7.退出 Tableau Shell

退出
 

对于 2020.1 至 2020.3 版本以及 2021 年 12 月 15 日 之前的 12 月维护版本(Tableau 2021.4.1、2021.3.5、2021.2.6、2021.1.9、2020.4.12),跳至步骤 4,启动管理服务
 

步骤 3:对于版本 2020.4 及更高版本(12 月维护版本除外),在运行 Python 脚本两次后,将 Log4j 2.16 文件复制到 elasticsearch 目录。

 
1.在每个节点上,将 jars 从 ~/elasticJars 复制到目标,并移除旧 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 文件。

然后,您可以使用 --dryrun 标志运行 remove_jndilookup,指示脚本扫描目录,但不对文件执行任何操作:

1.使用 --dryrun 标志,对安装目录运行 remove_jndilookup.py 脚本,指示脚本扫描目录,但不对文件执行任何操作。

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

注意:在 remove_jndilookup.py 脚本完成后,需要对数据目录重新运行脚本,从而验证数据目录。默认是 /var/opt/tableau/tableau_server。

2.首先,将脚本复制到非特权用户的主目录,默认名称是 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 脚本,指示脚本扫描目录,但不对文件执行任何操作。

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

如果 verification.txt 和 datadirverification.txt 中的试运行输出的“Findings:”部分不包含任何条目,也不会找到更多包含 JndiLookup.class 的 jar
 

7. 退出 Tableau Shell

退出
 

步骤 4:启动管理服务

 
1.在每个节点中,启动管理服务:

sudo /opt/tableau/tableau_server/packages/scripts.$TABLEAU_SERVER_DATA_DIR_VERSION/start-administrative-services

注意:在每个 Tableau Server 节点启动管理服务后,我们需要更改配置,才可以重新生成 war 文件:

2. 2.返回初始节点,找到 gateway.timeout 的当前值:

tsm configuration get -k gateway.timeout

3.将 gateway.timeout 的值加 1:

tsm configuration set -k gateway.timeout -v <current value +1, example 7201 if set at default>

4.应用未完成更改
 
 
tsm pending-changes apply
 

5.启动 Tableau Server

tsm start
 
现在,在 Tableau Server 中,JdniLookup.class 文件应从所有 .jar 和 .war 文件中移除
 

选项 3:对于 Tableau Server 版本 v2020.4 及更高版本(仅适用于 Tableau Server),设置“系统环境变量”,缓解漏洞。

注意:这是 CVE-44228 的临时和部分缓解措施,并修改计算机上所有 Java 进程的环境变量。
 

Linux 指令


1.停止 Tableau Server

tsm stop

2.停止 TSM 管理服务。运行以下脚本:

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 Shell。运行以下命令:

退出

6.启动 TSM 管理服务。运行以下脚本:

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 字符串 /proc/<pid>/environ,其中 <pid> 是步骤 9 返回的其中一个 pid
 

11.请验证步骤 10 的输出是否有 LOG4J_FORMAT_MSG_NO_LOOKUPS=true
 
 

Windows 指令

 

1.打开管理 PowerShell 窗口
 

2.在初始节点中,停止 Tableau Server

tsm stop

3. 在每个节点中,停止 TSM 管理服务。运行以下脚本:

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 管理服务。运行以下脚本:

C:\Program Files\Tableau\Tableau Server\packages\scripts.<version>\start-administrative-services.cmd

7.在初始节点中,启动 Tableau Server

tsm start

8.打开管理 cmd 窗口,并运行命令集,验证环境变量是否存在。在命令输出中,变量 LOG4J_FORMAT_MSG_NO_LOOKUPS=true 应存在
其他资源
有关 Tableau Cloud 状态的更多信息,请访问 Salesforce Trust 站点
有关详细信息,请参见:
知识文章编号

001534225

附件

remove_jndi.zip

1850 KB

remove_jndi_linux.gz

1846 KB

 
正在加载
Salesforce Help | Article