◽ Java language/Java

[Java] JSP/Servlet, SpringFraemwork low version : migrate log4j1 to log4j 2.x : log4j 2.17.0 업데이트 "log4j 취약점"

kkk20000a 2021. 12. 20. 10:31

log4j 1.x -> log4j 2.17.0

  21-12-10일 경 보안 이슈가 꽤나 크게 터져서 부랴부랴 소스를 수정했는데, 기존 스프링 프레임워크에 메이븐을 가지고 있는 구조라면 비교적 쉽게 교체가 가능한데, Java Web Application형태라던지 JSP/Servlet 형태에서는 인터넷에 나오는 해결방법이 적용되지 않는다.

 

다음글은 Java Project에서 쓴 log4j 2.15.0 적용 방안을 공유 할 것이다.

 

P. S.(2021. 12. 16) : log4j 2.15.0 추가 우회 취약점이 발견되어 2.16.0으로 업데이트 해야 함.

P. S.(2021. 12. 20) : log4j 2.16.0 추가 취약점 발견되어 2.17.0으로 업데이트 해야 함.

P. S.(2021. 12. 29) : log4j 2.17.0 추가 취약점 발견되어 2.17.1으로 업데이트 해야 함.


 

1. 먼저 web.xml에서 "log4j.properties"의 경로를 참조하고자하는 설정이 있는 곳을 제거 한다.

 

 

 

2. 필요한 jar파일을 다운로드 해야하는데 공식 루트는 url을 참고하여 다운로드하면 된다. 그런다음 각자 프로젝트에서 참고하는 /lib/에 넣어주고 classpath를 설정해주면 된다. (각자 프로젝트 환경 경로가 조금 다르기 때문에 정확한 설명은 생략)

1). https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core

2). https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api

3). https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl

4). https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jcl

 

4가지가 다 필요한 것은 아니고, 간단히 로그만 시스템에 뿌리고자한다면, log4j-api만 있으면 된다. 더 확장 기능이 추가될 예정이라면, 더 이용하고 싶다면 미리 추가해도 된다.

보통은 다들 log.debug("asdfads", log) 이러한 형태로 쓰기 때문에, Logging.log4j.Logger와 Logging.log4j.LogManager가 있는 log4j-api만 있으면 된다.

 

 

 

3. 기존에 나와 같은 옛날 프로젝트라면 "log4j.properties"를 참고하는 방식으로 로그를 찍었을텐데 2버전에서는 properties를 지원하지 않는다고 한다. 해서 xml형식으로 해야 한다. log4j 2.x버전에서는 기본적으로 리소스가 있는 곳을 바라보는 것이 디폴트 값인데, "/classes/log4j2.xml" 파일을 생성하여 "log4j.properties"역할을 하는 설정들을 해주면 된다. 그림 3-1 참고

 

아래의 그림은 log4j2.xml이다. 이것을 기본값인 리소스(resource)위치에 넣으면 된다. 물론 경로를 바꿀 수 있는데, 그것은 web.xml에서 설정이 필요하다. 

 

리소스(resource)위치 : /classes/ 또는 /src/

[참고로 "/src/"에 넣고 빌드하면 "/classes/"에 자동으로 생성 된다. 그림 3-2 참고] 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Logger name="org.apache.log4j.xml" level="info"/>
    <Root level="debug">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
</Configuration>

그림 3-1

 

 ㄱ

 

 

그림 3-2

 

 

 

 

4. 마지막으로 간단하게 기존 코드를 새로운 코드로 변경하는 샘플은 그림4를 참고.

아래의 코드가 올바르게 작성된 코드 "LogManager.getLogger()"

 

 


참고 : https://logging.apache.org/log4j/2.x/manual/appenders.html#FileAppender