마지막 수정 날짜: 09 Dec 2022
환경
다음 제품 버전 이하는 영향을 받는 것으로 확인되었습니다.- Tableau Server 2021.4, 2021.3.4, 2021.2.5, 2021.1.8, 2020.4.11, 2020.3.14, 2020.2.19, 2020.1.22, 2019.4.25, 2019.3.26, 2019.2.29, 2019.1.29, 2018.3.29
해결 방법
옵션 1: Tableau 업데이트
유지 관리 유효 기간이 지나지 않은 고객님의 경우, 영향을 받는 버전(2021년 12월 15일 이전의 모든 제품 릴리스)을 업데이트하지 않았거나 2021년 12월 15일 제품 릴리스로 업데이트한 경우 다음과 같은 더 새로운 릴리스 중 하나로 업데이트하세요.
- Tableau Server 2021.4.1, 2021.3.5, 2021.2.6, 2021.1.9, 2020.4.12
2021년 12월 19일 Tableau Product 릴리스에서 JNDI 조회를 기본적으로 사용하지 않도록 설정하는 Log4j 2.16 릴리스를 통합했습니다. 이 조치는 CVE-2021-44228 및 CVE-2021-45046을 모두 해결합니다.
- Tableau Server 2021.4.2+, 2021.3.6+, 2021.2.7+, 2021.1.10+, 2020.4.13+
옵션 2: 다음과 같은 경우 옵션 2에 설명된 완화 단계 실행:
2021년 12월 15일에 발표된 제품 릴리스로 업데이트했고, 더 새로운 릴리스로 업데이트할 수 없음(이유: 유지 관리 유효 기간이 지남, 또는 회사 업데이트 기간을 벗어남 등)영향을 받는 버전(2021년 12월 15일 이전에 릴리스된 모든 제품 버전)을 사용 중이며 더 새로운 릴리스로 업데이트할 수 없음
참고:
- 이러한 단계를 log4j를 2.16 릴리스로 업데이트한 2021년 12월 19일 제품 릴리스에서 실행하면 안 됩니다.
- 이러한 완화 단계는 2021년 12월 19일 및 이후 제품 릴리스 이전의 Tableau Server 버전 v2020.1 - v2021.4에 적용됩니다.
이러한 지침은 vulnerable jars에서 jndilookup.class를 제거합니다. 해당 함수를 제거하면 작동하지 않은 구성 요소가 2개 있으며, 이러한 특정 구성 요소 jars는 2.16으로 교체됩니다. 스크립트를 실행하려면 Python이 필요합니다. 이 스크립트는 중첩된 java 라이브러리 내부를 포함한 JndiLookup.class 파일에서 모든 인스턴스를 찾았음을 확인합니다.
Tableau Server
참고:- 효과적인 해결책을 확인하기 위해 모든 java 아카이브를 검사해야 하므로 최소 1시간 이상의 가동 중단을 대비해야 합니다. log4j 파일을 수동으로 수정하여 단계를 벗어나지 마세요. 이러한 단계는 2020.1-2020.3 뿐만 아니라 지원되는 모든 주요 버전에서 테스트되었지만, 수동 수정을 시작하기 전에 서버의 스냅샷을 생성하고 백업을 수행하는 것이 좋습니다.
- 2021년 12월 19일 또는 이후에 발표된 제품 릴리스로 업데이트한 경우 이 버전에 대해 JNDI 조회를 사용하지 않도록 설정했으므로 조치를 취할 필요가 없습니다.
Windows용 Tableau Server
아래 동영상에 나오는 단계를 더 잘 보려면 위 섹션을 확장하세요. 참고: 동영상은 무음입니다.1단계: 각 노드에서 다음 수행
1. https://www.python.org/downloads/에서 Python 3.10을 다운로드하여 설치합니다.
2. 'Download the latest version for Windows(Windows용 최신 버전 다운로드)'에서 'Download Python 3.10.1(Python 3.10.1 다운로드)'을 선택합니다.
3. 파일을 다운로드한 위치(예: C:\users\<username>\Downloads)로 이동합니다.
4. Python-3.10.1-amd64를 마우스 오른쪽 단추로 클릭하고 'Run as administrator(관리자 권한으로 실행)'를 선택합니다.
5. 설정이 시작되면 'Add Python 3.10 to path(경로에 Python 3.10 추가)'를 선택합니다.
6. 'Install now(지금 설치)'를 선택하거나 필요에 따라 'Customize the installation(설치 사용자 지정)'을 선택하여 대체 설치 경로를 구성합니다.
'This installation is forbidden by system policy(이 설치는 시스템 정책에 따라 금지되었습니다.)'라는 오류가 표시되면 마우스 오른쪽 단추를 클릭하면 나타나는 'Run as Administrator(관리자 권한으로 실행)'를 사용하여 다운로드 파일을 다시 실행합니다.
7. 설치가 끝나면 'Disable path length limit(경로 길이 제한 사용 안 함)'를 선택합니다.
8. 이 문서에 첨부된 remove_jndi.zip에서 필요한 Python 스크립트 및 Windows용 Log4j 버전 2.16 jars를 다운로드합니다. 여기에는 다음이 포함됩니다.
- log4j-api-2.16.0.jar
- log4j-core-2.16.0.jar
- log4j-slf4j-impl-2.16.0.jar
- remove_jndilookup_win.py
8b. 다음 명령을 입력하여 c:\remove_jdni 디렉터리를 생성합니다.
2단계: 관리 서비스 중지
1. Tableau Server가 중지되면 \packages\scripts.<version> 디렉터리 내에서 stop-administative-services.cmd를 실행하여 각 노드에서 관리 서비스를 중지합니다. 기본적으로 다음과 같습니다.2. 설치 파일 내 패키지 폴더에서 디렉터리를 scripts<version> 디렉터리로 변경합니다.
cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\scripts.%TABLEAU_SERVER_DATA_DIR_VERSION%"
3. 관리 서비스 중단 스크립트를 실행합니다.
b. remove_jndilookup 스크립트를 실행하여 Tableau Server 위치에서 설치된 jndilookup 클래스를 제거합니다.
경로 끝에 '\'를 추가하지 마세요. 그렇지 않으면 오류가 발생할 수 있습니다.
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. 기본 위치에 설치된 경우 다시 한 번 실행해야 합니다.
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단계: 12월 유지 관리 버전을 제외한 2020.4 이상 버전의 경우 Python 스크립트가 실행되면 Log4j 2.16 파일을 elasticsearch 및 solr 디렉터리로 복사합니다(기본 위치에 설치된 경우 두 번).
1. 설치 파일 내에서 탄력적 검색 디렉터리를 찾습니다.
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 디렉터리에서 오래된 버전을 제거합니다.
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 디렉터리로 변경합니다.
6. 새 jar을 오래된 jar 이름에 복사합니다.
cd "%TABLEAU_SERVER_INSTALL_DIR%\packages\solr7.%TABLEAU_SERVER_DATA_DIR_VERSION%\server\lib\ext"
copy c:\remove_jndi\log4j*.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단계: 관리 서비스를 시작하고, 구성 변경 사항을 적용하여 변경 사항이 전파되도록 한 다음, 서버를 시작합니다.
2. 초기 노드로 돌아가서 gateway.timeout의 현재 값을 확인합니다.
4. 보류 중인 변경 사항을 적용합니다.
5. Tableau Server를 시작합니다.
Linux용 Tableau Server
참고: 이 지침은 Python이 클러스터의 각 노드에 설치되었다고 가정합니다.
1단계: 각 노드에서 다음 수행
1. 이 문서에 첨부된 remove_jndi_linux.tar.gz에서 필요한 Python 스크립트 및 Linux용 Log4j 버전 2.16 jars를 다운로드합니다. 여기에는 다음이 포함됩니다.
- log4j-api-2.16.0.jar
- log4j-core-2.16.0.jar
- log4j-slf4j-impl-2.16.0.jar
- remove_jndilookup.py
mv ./log4j* ~/elasticJars
4. elasticJars에서 jar 파일의 권한을 -rw-r--r--로 설정합니다.
5. remove_jndilookup.py 스크립트의 권한을 Execute로 설정합니다.
sudo chmod 744 ./remove_jndilookup.py
6. Tableau Server를 중지합니다.
tsm stop
env | grep TABLEAU_SERVER_DATA_DIR_VERSION
7a. 이전 명령이 버전을 반환하지 않으면 다음 명령을 실행하여 이 세션에 대한 변수를 설정합니다.
export $(cat /etc/opt/tableau/tableau_server/environment.bash | grep TABLEAU_SERVER_DATA_DIR_VERSION | xargs)
env | grep TABLEAU_SERVER_DATA_DIR_VERSION
2단계: 각 노드의 관리 서비스 중지
1. 관리 서비스 중지
sudo /opt/tableau/tableau_server/packages/scripts.$TABLEAU_SERVER_DATA_DIR_VERSION/stop-administrative-services
2. remove_jndilookup.py 스크립트를 실행하여 패키지 디렉터리의 jars에서 JndiLookup.class 파일을 제거합니다.
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 사용자 및 그룹으로 변경합니다.
5. 권한 없는 사용자로 세션을 시작합니다.
sudo su -l tableau
6. 스크립트를 실행하여 데이터 디렉터리의 jars에서 JndiLookup.class 파일을 제거합니다.
./remove_jndilookup.py /var/opt/tableau/tableau_server
7. Tableau 셸을 종료합니다.
exit
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단계: 12월 유지 관리 버전을 제외한 2020.4 이상 버전의 경우 Python 스크립트가 두 번 실행되면 Log4j 2.16 파일을 elasticsearch 디렉터리로 복사합니다.
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 파일이 남아 있지 않은지 확인합니다.
그런 다음 remove_jndilookup을 --dryrun 플래그와 함께 실행하여 스크립트가 디렉터리를 스캔하되 파일에 대해서는 작업을 수행하지 않도록 할 수 있습니다.
1. remove_jndilookup.py 스크립트를 --dryrun 플래그와 함께 설치 디렉터리에 대해 실행하여 스크립트가 디렉터리를 스캔하되 파일에 대해서는 작업을 수행하지 않도록 합니다.
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 –dryrun /var/opt/tableau/tableau_server > datadirverification.txt
verification.txt 및 datadirverification.txt에서 드라이 런 출력의 "Findings:" 섹션에 포함된 항목이 없는 경우, JndiLookup.class를 포함하는 jar을 더 찾지 않았음을 의미합니다.
7. Tableau 셸을 종료합니다.
exit
4단계: 관리 서비스 시작
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. 보류 중인 변경 사항을 적용합니다.
5. Tableau Server를 시작합니다.
tsm start
옵션 3: Tableau Server 버전 v2020.4 이상에 대해 '시스템 환경 변수'를 설정하여 취약점을 완화합니다(Tableau Server에만 해당).
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 셸을 종료합니다. 다음 명령을 실행합니다.
exit
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 strings /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로 이 작업을 수행하기 위한 바로 가기는 다음과 같습니다.
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 변수가 있어야 합니다.
원인
Apache Log4j 2 라이브러리의 보안 취약점 CVE-2021-44228 및 CVE-2021-45046추가 정보
Tableau Cloud 상태에 대한 자세한 내용은 Salesforce Trust 사이트를 참조하세요.자세한 내용은 다음을 참조하세요.