Java
Log4J
#
Find similar titles
-
최초 작성자
jskim-intern@insilicogen.com
-
최근 업데이트
hskim@insilicogen.com
Structured data
- Category
- Programming
Table of Contents
Log4J란 #
Log4J란 Log for Java(Apache Open Source Log Library)의 준말이며 자바기반 로깅 유틸리티로 디버깅용 도구로 주로 사용되고 있다.
- 로그를 남기는 가장 쉬운 방법은 System.out.println("로그 메시지")이지만 프로그램 개발 완료 후 불필요한 로그를 삭제해야 하며 성능 저하 요인이 될 수 있다.
- 로깅은 애플리케이션 문제 발생 시 개발자에게 자세한 상황을 파악할 수 있도록 해주며 테스트 시 유용하게 사용될 수 있다.
Log4J 라이브러리는 멀티스레드 환경에서도 성능에 전혀 영향을 미치지 않으면서 안전하게 로그를 기록할 수 있는 환경을 제공한다.
Log4J특징 #
Console, File, Database, TCP 원격 서버에 로그를 출력할 수 있다. 낮은 등급에서 높은 등급으로의 6단계 로그 레벨 별로 출력 가능하다.
- TRACE, DEBUG, INFO, WARN, ERROR, FATAL
- 로그 환경설정 파일에 대상 별(자바 패키지)로 로그 레벨 설정이 가능하고, 설정한 레벨 이상의 로그만 저장하는 방식이다.
Log4J 핵심 구성 요소 #
Logger #
Log4J의 핵심 구성 요소로 6개의 로그 레벨을 가지고 있으며 로그 출력 여보는 로그 레벨에 따라 결정된다.
- 출력하고자 하는 로그 메시지를 Appender에게 전달한다.
Appender #
Appender는 Logger로부터 전달된 로그 메시지를 출력한다.
- 1개의 Logger에 여러 개의 Appender를 설정할 수 있다.
- Appender 인터페이스를 구현한다.
- Appender 인터페이스를 구현한 ConsoleAppender, FileAppender, Daily RollingFileAppender, DBAppender 등을 기본 제공한다.
Layout #
로그 메시지를 어떤 형식으로 출력할 것이지 결정한다.
Log4J 로그 레벨 #
로그 레벨 | 설명 |
---|---|
FATAL | 애플리케이션을 중지해야 할 가장 심각한 에러가 발생 했을 때 출력 |
ERROR | 오류가 발생했지만, 애플리케이션은 계속 실행할 수 있을 때 출력 |
WARN | 잠재적인 위험(에러)를 안고 있는 상태일 때 출력(경고) |
INFO | 애플리케이션의 주요 실행 정보 출력 |
DEBUG | 애플리케이션의 내부 실행 상황을 추적하기 위해 상세 정보 출력 |
TRACE | DEBUG 보다 더 상세한 정보를 출력 |
Log4 주의사항 #
- 버전 관리: Log4j의 취약점을 최소화하기 위해 항상 최신 버전을 사용하는 것을 지향할 것. 보안 업데이트 및 버그 수정이 정기적으로 이루어짐
- 설정 보안: 로깅 설정은 외부에서 액세스할 수 없도록 보호해야 함. 민감한 정보가 로그에 노출되지 않도록 조심
- 로깅 레벨: 로깅 레벨을 적절히 설정하여 필요한 정보만 로깅. DEBUG 수준의 로그는 프로덕션 환경에서 사용하지 않는 것을 지향할 것
- 로깅 포맷: 로그 메시지의 포맷을 명확하게 정의하고 관리하고 로그 메시지를 쉽게 이해하고 검색할 수 있어야 함
- 예외 처리: 예외 처리 시 로그를 활용하여 예외 유형과 원인을 기록하고, 적절한 조치할 수 있도록 해야 함
- 로그 파일 관리: 로그 파일이 계속해서 커지지 않도록 일정 기간 또는 크기 이상이 되면 자동으로 백업하고 정리하는 메커니즘을 구현하는 것을 지향할 것
- 비동기 로깅: 대용량 트래픽을 처리할 때 성능 이슈를 방지하기 위해 비동기 로깅을 고려할 것
- 테스트: 로깅 설정을 변경하기 전에 충분한 테스트를 수행하여 예상치 못한 문제가 발생하지 않도록 주의
- 보안 검토: 시스템 보안 전문가와 협력하여 로깅 시스템의 보안 취약점을 식별하고 보호 조치를 수행할 것
- 로깅 오버헤드: 과도한 로깅은 성능에 부정적인 영향을 미칠 수 있으므로 필요한 로그만 기록
- 로깅 데이터 보존: 로그 데이터의 저장 기간과 보존 정책을 정의하고 준수
- 모니터링: 로그 데이터를 정기적으로 모니터링하여 시스템 상태 및 문제를 신속하게 감지하고 대응할 것
Log4j 취약점(21년12월 발생) #
취약점의 원인 #
- Lookup 플러그인에 jndi를 통해 취약점 발생, 해당 사태가 벌어지기까지 8년이라는 긴 시간 동안 방치되었고, 1.2 JMSAppender 클래스의 취약점이 발견되어 여파가 커짐
취약점 종류 #
- Log4Shell (CVE-2021-44228): 이 취약점은 JNDI (Java Naming and Directory Interface)를 사용하여 원격 코드 실행을 허용하는 취약점으로, 악의적인 JNDI 참조를 통해 공격자가 원격 코드를 실행
- Log4j 2.x 취약점: Log4j 2.x 버전의 이전 버전은 취약한 코드 경로를 포함하고 있어, 악의적인 입력에 노출될 수 있으며 이에 따라 서버 공격이 가능
- Zero-Day 취약점: Log4j 취약점 중 일부는 새로운 취약점으로서, 보안 연구자나 해커들이 발견하고 악용할 수 있음. 새로운 취약점이 발견되면 시스템 보안에 위협을 가함
- 클래스패스 취약점: 클래스패스에 Log4j 구현이 존재하는 경우, 악의적인 코드가 시스템에 로드될 수 있음
취약점에 대한 조치 #
- 버전 업그레이드 : 시스템에 적용된 Log4j의 버전을 최신 안정 버전으로 업그레이드 진행, Log4j 2.15.0 이상의 버전은 취약점에 대한 보완 조치가 포함되어 있음
- 시스템 보안 강화 : 취약점으로 인해 시스템에 영향을 줄 수 있는 경우, 시스템 보안을 강화하는 조치를 취하는 것이 중요(방화벽 설정, 네트워크 보안 강화, 권한 관리 등을 포함)
- 로그 레벨 설정 변경: 취약점을 이용한 공격을 방지하기 위해 Log4j의 로그 레벨을 변경하여 외부로의 출력을 차단, 설정 파일에서 rootLogger 또는 관련된 로거를 수정하여 출력을 최소화 할 수 있음
- Vulnerability Scanning 및 패치 적용: 스템에서 사용 중인 모든 애플리케이션 및 서비스를 취약점 스캐닝하여 취약점이 있는지 확인하고 필요한 패치를 적용