Apache Struts, Apache Solr, Apache Druid, Apache Flink, ElasticSearch, Flume, Apache Dubbo, Logstash, Kafka, Spring-Boot-starter-log4j2
Log4j 취약점 영향받는 소프트웨어에 적혀있는 반가운 이름..
2021/12/03 log4j 2.15.0 으로 변경한 7.16.1 버전 릴리즈https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-7.16.1.html
Elasticsearch version 7.16.1 | Elasticsearch Guide [7.16] | Elastic
www.elastic.co
JndiLookup 클래스 제거했다는 부분으로 보아 CVE-2021-45046 Apache Log4j 2.15.0 취약점에도 안전할 것으로 보인다..
Elasticsearch | Log4j |
0.90 ~ 2.4.6 | 1.12.7 |
5.0.0 ~ | 2.6.2 |
5.1.1 ~ | 2.7 ~ 2.9.1 |
6.5.4 ~ | 2.11.1 |
7.16.1 ~ | 2.15.0 |
1. elasticsearch
(1) 영향 받는 버전
5.0 이상 취약 버전 log4j 포함
but elasticsearch6, 7 에 설정되어있는 security manager가 원격 코드 실행 공격을 완화함
(elasitc에서는 6,7 버전이 영향받지 않는다고 하나 위험하다는 의견도 다수 있음..)
(2) 대응방법
-Dlog4j2.formatMsgNoLookups=true
설정 후 elasticsearch 재시작
or
7.16.1 버전 업그레이드
2. logstash
(1) 영향 받는 버전
Logstash 버전 6.8.x 및 7.16.0 이하 버전 8u191 및 11.0.1 미만의 JDK에서 실행되도록 구성된 경우 Java 클래스의 원격 로드를 허용함.
(2) 대응방법
-Dlog4j2.formatMsgNoLookups=true
Logstash는 플래그가 효과가 없는 방식으로 Log4j를 사용하기 때문에 광범위한 플래그 는 모든 경우에 Logstash의 취약점을 완화하기에 충분하지 않음
따라서 다음 명령을 사용하여 log4j2 코어 jar에서 JndiLookup 클래스를 제거해야 함.
zip -q -d <LOGSTASH_HOME>/logstash-core/lib/jars/log4j-core-2.* org/apache/logging/log4j/core/lookup/JndiLookup.class
변경 사항을 적용하려면 Logstash 프로세스를 재시작
or
7.16.1 버전 업그레이드
대응 방법
(1) jvm option 변경
#cat /etc/elasticsearch/jvm.options
-Dlog4j.formatMsgNoLookups=true
#cat /etc/logstash/jvm.options
-Dlog4j.formatMsgNoLookups=true
(2) logstash 아래 명령 사용으로 log4j2 코어 jar에서 jndilookup 클래스 제거
# zip -q -d <LOGSTASH_HOME>/logstash-core/lib/jars/log4j-core-2.* org/apache/logging/log4j/core/lookup/JndiLookup.class
(3) log4j2.16.0 버전으로 변경 (Logstash 만 가능)
LSS_HOME(LS_HOME)/lib/log4j2* 를 log4j2.16.0.jar 변경
(3-1) core와 api 만 업그레이드
maven repository에서 core-2.16.0 , api-2.16.0다운
https://mvnrepository.com/search?q=Log4j
log4j-core-2.x
log4j-api-2.x -> log4j-api-2.16.0
변경 후 재시작
(버전 에러 없이 잘 돌아간다)
(3-2) elasticsearch는 불가능하고 logstash 만 가능한 이유
elasticsearch java security manager 가 변경된 jar 파일에 대해 권한 문제를 발생시킨다.
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader"
jvm.option에 log4j2.formatMsgNoLookups=true 내용을 추가하거나
# zip -q -d usr/share/elasticsearch/lib/log4j-core-2.* org/apache/logging/log4j/core/lookup/JndiLookup.class
클래스를 삭제하거나
elasticsearch 7.16.2 버전으로 업그레이드 해야한다.
2. docker 환경
# cat elasticsearch/Dockerfile
ENV LOG4J_FORMAT_MSG_NO_LOOKUPS=true
# cat logstash/Dockerfile
ENV LOG4J_FORMAT_MSG_NO_LOOKUPS=true
RUN zip -q -d <LOGSTASH_HOME>/logstash-core/lib/jars/log4j-core-2.* org/apache/logging/log4j/core/lookup/JndiLookup.class
추가 후 재시작