[여기보기] 적절한 식습관과 운동을 유지하듯 건강하게 WAS 로그 관리하기

🧐 | 2023-12-14

[여기보기]는 “여기서 보안의 기본을 챙기고 가자”의 약자로, 개발 과정에서 꼭 최소한으로 챙기면 좋을 보안 기초 설정을 앞으로 하나씩 공유할 예정입니다. 기초 내용이 주를 이루겠지만, 혹시라도 빼먹고 계신 것이 없는지 가끔 한 번씩 둘러봐 주세요.

안녕하세요, 넷마블 보안실 보안개발팀 정승현입니다.

코로나19 이후로 건강에 관한 관심은 많이 높아졌습니다. 그리고 모두가 한결 같이 신경 쓰는 것이 올바른 식습관과 운동입니다. 무엇을 먹어야 하는지, 얼마나 먹어야 하는지, 적절한 운동 계획은 무엇인지 등입니다. WAS도 식습관이나 운동 같은 느낌으로 관리가 필요한 항목이 있는데 그것은 바로 로그(log)입니다.

WAS의 로그는 적절한 레벨과 포맷을 정해서 관리해야 WAS가 보안을 유지하면서 적절한 저장 공간을 사용해 로그 파일을 생성할 수 있습니다. 이는 적절한 식습관에 비유할 수 있습니다. 그리고 WAS의 로그 디렉터리나 로그 파일을 누구나 열람할 수 없게끔 적절한 권한을 설정해야 하는데 이는 알맞은 계획을 세운 운동에 비유할 수 있습니다.

이 글에서는 보안은 물론 장애 대응 등에 필요한 WAS 로그 관리법을 이야기해 보려고 합니다.

에러 로그와 액세스 로그에 적절한 로그 레벨과 로그 포맷 설정하기

WAS에는 에러 로그 레벨과 액세스 로그 포맷을 설정해야 합니다. 에러 로그와 액세스 로그는 공격 여부 파악, 공격자 사용 도구 파악, 공격자 위치 파악에 중요한 요소이므로 로그 레벨과 포맷을 설정해야 합니다.

조치 방안

WAS별로 로그 수집 시 필요한 에러 로그의 로그 레벨과 액세스 로그의 로그 포맷을 정의합니다.

IIS

[윈도우] + [R] 키를 입력해 ‘실행’ 창을 연 후 ‘InetMgr.exe’를 입력하고 [확인] 버튼을 클릭해 IIS 관리자를 실행합니다.

먼저 기본 로그 설정에서 추가로 수집하면 좋은 로그 항목을 선택합니다. IIS에서 관리하는 사이트의 서비스 중 [로깅] – [로그 파일] – [필드 선택]을 선택합니다. 그리고 ‘보낸 바이트 수’, ‘받은 바이트 수’, ‘프로토콜 버전’을 추가로 선택한 후 적용합니다.

보낸 바이트 수(sc-bytes)는 서버가 클라이언트 요청에 응답한 용량, 받은 바이트 수(cs-bytes)는 서버가 클라이언트의 요청을 받은 바이트 수라고 생각하면 됩니다.

다음으로 로그 저장 디렉터리를 확인하고 매일 새로운 로그 기록을 시작할 수 있도록 [로그 파일 롤오버]의 [일정] 부분 설정을 ‘매일’로 지정합니다.

아파치 HTTP 서버

아파치 HTTP 서버의 설정 파일([APACHE_DIR]/httpd.conf 혹은 [APACHE_DIR]/apache2.conf)을 열고 로그 설정 사항을 확인해야 합니다. 먼저 아파치 HTTP 서버의 에러 정보를 기록하는 에러 로그의 저장 위치를 확인하고 필요하다면 ErrorLog 지시자 뒤의 설정 위치를 바꿔줍니다.

# 데비안 계열
ErrorLog ${APACHE_LOG_DIR}/error.log

# 레드햇 계열
ErrorLog ${APACHE_LOG_DIR}/error_log

패키지 관리자 설치라면 ‘[Apache_DIR]/envvars’에서 로그 저장 경로를 확인하기 바랍니다.

에러 로그에 포함되는 로그 레벨은 LogLevel 지시자를 사용해 설정할 수 있습니다.

LogLevel error;

다음과 같은 설정을 선택해 적용할 수 있습니다.

  1. emerg(비상): 시스템이 불안정하거나 사용 불가능한 상태일 때 발생하는 중대한 문제들을 나타냅니다. 가장 심각한 수준의 오류만 기록됩니다.
  2. alert(경고): 즉시 조치를 취해야 할 상황을 나타냅니다. 전체 시스템에 영향을 미칠 수 있는 중요한 구성 문제 등이 해당합니다.
  3. crit(중요): 하드웨어 실패(Fail)나 주요 시스템 구성 오류 등의 중대한 문제가 해당합니다.
  4. error(오류): 파일을 찾을 수 없거나, 권한 문제, 페이지 오류 등 일반적인 오류 메시지를 저장합니다.
  5. warn(경고): 구성 파일의 잘못된 지시어, 비효율적인 처리, 사용되지 않는 기능 등 잠재적인 문제를 알리는 경고 메시지를 저장합니다.
  6. notice(알림): 서버 시작 및 종료, 모듈 로드 등 중요하지 않지만 주목할 만한 일반적인 정보를 저장합니다.
  7. info(정보): 서버의 상태, 프로세스 정보, 추가 상세 정보 등 일반적인 운영 정보를 저장합니다.
  8. debug(디버그): 개발자 및 시스템 관리자가 문제 해결에 사용합니다. 요청 처리의 모든 단계의 상세한 정보를 저장합니다.

아파치 HTTP 서버의 기본값은 warn입니다. 보통 errorwarn 사이에서 필요한 설정 값을 결정하면 됩니다. 참고로 앞 설정 값은 뒷 단계 번호가 앞 단계 번호의 내용을 포함하므로 숫자가 클수록 로그 파일의 용량이 커집니다. 즉, 무조건 많은 내용을 담는 설정 값이 아닌 서비스에 맞는 설정 값을 정할 필요가 있습니다.

아파치 HTTP 서버가 처리하는 모든 요청을 저장하는 액세스 로그는 CustomLog [경로명]/[파일명] 같은 형태로 설정할 수 있습니다. 먼저 다음과 같은 설정이 존재하는지 확인하고 없다면 추가해 줍니다.

# 데비안 계열
CustomLog ${APACHE_LOG_DIR}/access.log combined

# 레드햇 계열
CustomLog ${APACHE_LOG_DIR}/access_log combined

여기서 combined는 클라이언트의 IP 주소, 요청 시간, 요청 라인, HTTP 상태 코드, 응답 바이트 크기, 참조 페이지(Referer)와 사용자 에이전트(User-Agent) 정보를 포함하는 별칭입니다. 특히 웹 트래픽 분석에 유용한 정보를 제공합니다. 해당 로그 설정을 권장합니다.

컴파일 설치로 아파치 HTTP 서버를 사용하는 분이라면 combined 대신 combinedio를 설정하기 바랍니다. combinediocombined에 클라이언트로 받은 요청 바이트 수와 클라이언트로 전송된 응답 바이트 수까지 포함된 옵션입니다.

아파치 HTTP 서버는 LogFormat이라는 지시자를 이용해 다음과 같은 로그 포맷 별칭을 설정할 수 있습니다.

  • combined: 클라이언트의 IP 주소, 요청 시간, 요청 라인, HTTP 상태 코드, 응답 바이트 크기, 참조 페이지(Referer)와 사용자 에이전트(User-Agent) 정보를 포함합니다.
  • common: 기본적인 로그 포맷입니다.
  • referer: 요청의 참조자(referer)와 요청된 URL을 저장합니다.
  • agent: 접속자의 웹 브라우저(OS 포함) 종류를 저장합니다.

참고로 로그 포맷은 LogFormat [옵션] [별칭] 형태로 정의하며 다음과 같은 정의가 설정 파일에 포함되어 있어야 CustomLog 지시자에서 설정한 별칭을 인식합니다.

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

로그 포맷 주요 옵션의 의미는 다음을 참고하기 바랍니다.

  • %h: 클라이언트의 호스트명 또는 IP 주소
  • %l: 클라이언트의 RFC 1413 신원(대부분의 경우 -로 표시됨)
  • %u: 인증된 사용자의 ID
  • %t: 요청을 받은 시간
  • \”%r\”: 첫 번째 줄의 요청(예: GET / HTTP/1.1)
  • %>s: 최종 HTTP 상태 코드
  • %b: 응답 바이트 크기(0바이트일 경우 -로 표시됨)
  • \”%{Referer}i\”: 이 페이지로 유도한 이전 페이지의 주소(참조자)
  • \”%{User-Agent}i\”: 클라이언트의 사용자 에이전트 정보
  • %I: 클라이언트로부터 받은 요청 바이트
  • %O: 클라이언트로 전송된 응답 바이트 수

아파치 HTTP 서버의 LogFormat을 설정하는 더 자세한 방법은 ‘아파치 모듈 mod_log_config‘을 참고하기 바랍니다.

톰캣

보안에 중점을 둔 톰캣 로그 설정에서는 권장 로그 레벨을 확인하고 설정해야 합니다. 먼저 전체 애플리케이션의 기본 로그 레벨을 설정할 때는 ‘[TOMCAT_DIR]/logging.properties’를 열고 시작 부분에 다음 설정을 추가합니다.

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

# 기본 로그 레벨 설정
.level = INFO

보통 로그 파일 용량과 여러 가지 로그 정보량을 고려해 INFO 또는 WARNING 설정을 권장합니다. 보안 문제를 식별하려는 목적이 있다면 FINE 설정도 고려할 수 있습니다.

중요 컴포넌트의 로그 레벨을 조정하려면 톰캣의 주요 컴포넌트(예: Catalina, Coyote, Jasper)에 로그 레벨을 별도로 설정할 것을 권장합니다.

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE
org.apache.coyote.level = FINE
org.apache.jasper.level = FINE

톰캣에서 사용하는 주요 로그 레벨 설정은 다음을 참고합니다.

  1. SEVERE: 나타냅니다. 시스템의 정상적인 작동에 심각한 영향을 끼치는 가장 심각한 오류를 저장합니다.
  2. WARNING: 시스템 작동에 영향을 줄 수 있는 잠재적인 문제 상황을 경고합니다.
  3. INFO: 시스템의 상태나 프로세스 정보 등 일반적인 운영 메시지를 제공합니다.
  4. CONFIG: 시스템 구성에 관한 정보를 저장합니다.
  5. FINE: 일반적으로 디버깅에 필요한 더 상세한 정보를 제공합니다.
  6. FINER: FINE보다 더 상세한 디버깅 정보를 나타냅니다.
  7. FINEST: 시스템 동작과 관련한 매우 상세한 정보를 포함해 가장 높은 수준의 디버깅이 필요할 때 사용됩니다.
  8. ALL: 시스템의 모든 로그 메시지를 저장합니다.

참고로 번호 별 설정값은 앞 단계 번호의 내용을 포함하며, 큰 숫자일수록 로그 파일의 용량이 커집니다.

다음으로 아파치 HTTP 서버의 설정 파일([TOMCAT_DIR]/server.xml)을 열고 액세스 로그 설정 사항을 확인합니다. 해당 설정 파일에 맨 아래의 Value 설정 중 pattern 값을 combined로 설정합니다.

<Valve className="org.apache.catalina.valves.AccessLogValve"
       directory="logs" prefix="localhost_access_log"
       suffix=".txt" pattern="combined" resolveHosts="false" />

combined 이외에 설정할 수 있는 다른 pattern 값도 참고하기 바랍니다. 아파치 HTTP 서버에서 사용하는 LogFormat 지시자의 별칭과 같은 의미입니다.

  • common: 가장 일반적인 로그를 저장합니다.
  • referer: 현재 아파치 서버에 접속하기 전에 머물렀던 URL을 저장합니다.
  • agent: 접속자의 웹 브라우저(OS 포함) 종류를 저장합니다.
  • combined: 위 세 가지 로그 포맷을 모두 조합해 저장합니다.

combined 대신 pattern="%h %l %u %t "%r" %s %b "%{Referer}i" "{User-Agent}i"처럼 로그 포맷을 직접 입력할 수 있다는 점도 참고하기 바랍니다.

톰켓의 pattern 값을 설정하는 더 자세한 방법은 ‘Access Logging‘을 참고하기 바랍니다.

NGINX

NGINX의 설정 파일([NGINX_DIR]/nginx.conf)을 열고 로그 설정 사항을 확인합니다. 먼저 로그 레벨인 error_log의 설정은 error로 설정합니다. 다음으로 액세스 로그인 access_log의 설정은 combined로 설정합니다.

# 패키지 관리자 설치
http {
    # 중간 생략

    # Logging Settings
    access_log /var/log/nginx/access.log; combined
    error_log /var/log/nginx/error.log error;

    # 이후 생략
}

# 컴파일 설치
http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  combined;

    # 이후 생략
}

참고로 원하는 로그 저장 위치를 변경하고 싶다면 access_logerror_log의 경로를 변경하기 바랍니다.

NGINX의 로그 레벨 설정은 아파치 HTTP 서버와 같습니다. 해당 내용을 참고하기 바랍니다.

NGINX의 주요 로그 포맷은 다음 내용을 참고하기 바랍니다.

  • $remote_addr: 원격의 IP 주소
  • $remote_user [$time_local]: 시간
  • $request: 요청 값
  • $status: 상태 값
  • $body_bytes_sent: 전송된 body 용량
  • $http_referer: 현재 NGINX 서버에 접속하기 전에 머물렀던 URL 저장
  • $http_user_agent: 접속자의 웹 브라우저(OS 포함) 종류 저장

NGINX의 로그 레벨을 설정하는 더 자세한 방법은 ‘Setting Up the Error Log, log_format을 설정하는 더 자세한 방법은 ‘Module ngx_http_log_module‘을 참고하기 바랍니다.

스프링 부트

여러분이 사용하려는 프로젝트의 application.properties 혹은 application.yml 로그 레벨과 로그 형식을 설정합니다. 먼저 로그 레벨을 설정하는 방법은 다음과 같습니다.

# application.properties
logging.level.root=WARN
logging.level.org.springframework.web=INFO
logging.level.com.mycompany=DEBUG

# yaml
logging:
  level:
    root: WARN
    org.springframework.web: INFO
    com.mycompany: DEBUG

첫 번째 root는 애플리케이션의 모든 로그에 대한 기본 로그 레벨을 WARN으로 설정하는 것이고, 두 번째 org.springframework.weborg.springframework.web 패키지의 로그 레벨을 INFO로 설정하는 것입니다. 세 번째 com.mycompany는 특정 프로젝트 패키지(예: com.mycompany)의 로그 레벨을 DEBUG로 설정한 것입니다. 보통 기본 로그 레벨은 WARN이나 ERROR를 설정할 것을 권장합니다. 특정 패키지의 로그 레벨은 로그 용량을 고려해 프로젝트마다 필요한 로그 레벨을 설정하면 됩니다.

스프링 부트의 로그 레벨 설정 종류는 다음과 같습니다.

  1. ERROR: 시스템 오작동, 예외 처리 실패, 중대한 문제 등 애플리케이션의 정상 작동에 영향을 미치는 심각한 문제가 발생했을 때의 로그가 저장됩니다.
  2. WARN: 애플리케이션의 잠재적인 문제를 나타내며, 오류는 아니지만 주의가 필요한 상황을 알립니다.
  3. INFO: 애플리케이션의 정상적인 작동과 관련된 중요한 런타임 이벤트를 나타냅니다.
  4. DEBUG: 애플리케이션의 내부 작동 상태에 관한 상세한 정보를 기록해, 문제 해결과 디버깅을 지원합니다. 변수의 값, 함수 호출, 시스템 상태, 알고리즘의 흐름 등이 포함될 수 있습니다.
  5. TRACE: 각 작업 단계, 상세한 이벤트 흐름, 상태 변화 등이 저장됩니다. 개발자가 문제의 근본 원인을 분석하거나 시스템의 상세한 동작을 이해하는 데 도움을 줍니다.

역시 번호별 설정값은 앞 단계 번호의 내용을 포함하며, 큰 숫자일수록 로그 파일의 용량이 커집니다.

스프링 부트의 로그 레벨을 설정하는 더 자세한 방법은 ‘Log Format‘을 참고하기 바랍니다.

다음으로 액세스 로그를 설정합니다. 스프링 부트에서는 별도의 별칭을 지정하지 않고 로그 포맷 설정 옵션을 그대로 입력합니다. 다음 예는 권장 설정이기도 하니 참고하기 바랍니다.

# application.properties
server.tomcat.accesslog.pattern=%{yyy-MM-dd HH:mm:ss}t %s %r %{User-Agent}i %{Referer}i %a %b
server.tomcat.accesslog.enabled=true
server.tomcat.basedir=.

# application.yml
server:
  tomcat:
    accesslog:
      pattern: "%{yyy-MM-dd HH:mm:ss}t %s %r %{User-Agent}i %{Referer}i %a %b"
      enabled: true
      basedir: "."

앞에서 사용한 application.properties 혹은 application.yml 파일의 액세스 로그 포맷에서 사용된 각 설정은 다음과 같은 의미를 갖습니다.

  • %{yyy-MM-dd HH:mm:ss}t: 요청이 처리된 시간을 나타냅니다.
  • %s: HTTP 응답의 상태 코드를 나타냅니다.
  • %r: 첫 번째 요청 라인을 나타냅니다. 요청의 메서드, URL, 그리고 HTTP 버전을 포함합니다.
  • %{User-Agent}i: 요청을 보낸 클라이언트의 User-Agent 헤더 값을 나타냅니다. 클라이언트의 브라우저, OS 정보 등을 포함합니다.
  • %{Referer}i: 이 페이지로 유도한 이전 페이지의 URL을 나타내는 Referer 헤더 값을 나타냅니다. 클라이언트가 이전에 어떤 페이지를 방문했는지를 나타냅니다.
  • %a: 클라이언트의 IP 주소를 나타냅니다.
  • %b: 응답의 바이트 크기를 나타냅니다. 응답의 바이트 크기가 0이라면 -로 표시됩니다.

스프링 부트의 로그 포맷을 설정하는 더 자세한 방법은 ‘Configure Access Logging‘을 참고하기 바랍니다.

Node.js

Node.js에서 에러 로그의 로그 레벨과 액세스 로그의 로그 포맷을 설정할 때는 주로 Winston이라는 라이브러리를 사용합니다. 다음 명령을 실행해 Winston 라이브러리를 설치해 사용합니다.

$ npm install winston

다음은 Winston 라이브러리를 이용해 에러 로그의 로그 레벨과 액세스 로그의 로그 포맷을 설정하는 코드 예입니다.

const winston = require('winston');
const { createLogger, format, transports } = winston;

// 에러 로그 설정
const errorLogger = createLogger({
  level: 'error',
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
  ),
  transports: [
    new transports.File({ filename: 'error.log' })
  ]
});

// 액세스 로그 설정
const accessLogger = createLogger({
  format: format.combine(
    format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
    format.printf(info => {
      return `${info.timestamp} - ${info.message}`;
    })
  ),
  transports: [
    new transports.File({ filename: 'access.log' })
  ]
});

기본 로그 레벨은 error 설정을 권장합니다. 참고로 Winston 라이브러리에서 설정할 수 있는 로그 레벨은 다음과 같습니다.

  1. error: 시스템의 실패, 예외 처리, 중대한 문제 등 가장 심각한 오류를 저장합니다.
  2. warn: 잠재적인 문제를 경고하는 메시지를 로그로 저장합니다. 수정이 필요하지만 시스템이 계속 작동해야 할 때 사용됩니다.
  3. info: 시스템의 정상적인 작동 상태, 진행 상황 등 일반적인 정보 메시지를 저장합니다.
  4. http: 웹 서버 로그에 주로 사용하는 HTTP 요청과 관련된 정보를 저장합니다.
  5. verbose: 일반적인 작동 정보보다 더 상세한 정보를 저장합니다.
  6. debug: 시스템의 상세한 작동 상황을 기록하여 디버깅에 도움을 줍니다.
  7. silly: 개발 과정에서 매우 상세한 디버깅 정보가 필요할 때 사용합니다.

로그 포맷은 combined 포맷 안에 여러 개 로그 포맷을 함께 사용할 것을 권장합니다. 참고로 Winston 라이브러리에서 설정할 수 있는 로그 포맷은 다음과 같습니다.

  1. timestamp: 로그 메시지에 타임스탬프를 추가합니다
  2. printf: 로그 메시지의 출력 포맷을 사용자 정의합니다.
  3. simple: 간단한 로그 포맷을 제공합니다.
  4. json: 로그 메시지를 JSON 형식으로 출력합니다.
  5. colorize: 로그 메시지에 색상을 추가합니다.
  6. combine: 여러 가지 포맷을 조합해 사용합니다.

필요 사용자만 접근하는 로그 권한 설정하기

[여기보기]에서 항상 강조하는 점은 권한 설정입니다. 역시 WAS에서 관리하는 로그 디렉터리나 로그 파일에 권한이 설정되어 있지 않으면 권한이 없는 사용자가 해당 로그를 확인하여 변조, 유출, 삭제하는 등의 보안 위험이 발생할 수 있습니다.

조치 방안

OS에 등록된 사용자별로 권한을 다르게 설정해야 합니다. 보통 윈도우라면 로그 저장 디렉터리는 WAS 전용 계정이나 그룹에만 모든 권한을 부여하고 Users 그룹은 쓰기 권한 제거, Everyone 그룹은 그 자체를 제거합니다. 로그 파일은 WAS 전용 계정이나 그룹에만 모든 권한을 부여하고 Users 그룹은 읽기 및 쓰기 권한 제거, Everyone 그룹은 그 자체를 제거합니다.

리눅스라면 전용 WAS 계정이 로그 디렉터리와 로그 파일을 소유하도록 설정한 후 로그 디렉터리에는 750(drwxr-x—) 이하 권한을 부여합니다. 로그 파일에는 640(rw-r—–) 이하 권한을 부여합니다.

WAS 전용 계정 생성과 적절한 권한 부여는 ‘[여기보기] WAS 프로세스가 다진 마음은 루트와 헤어질 결심‘을 참고하기 바랍니다.

윈도우 서버

윈도우 서버에서 운영하는 WAS는 로그 디렉터리와 로그 파일에 권한을 차별화해 부여해서 로그 권한을 설정합니다. 구체적인 내용은 다음과 같습니다.

  • 로그 디렉터리
    • Administrator 또는 전용 WAS 계정 소유고 전용 WAS 그룹(Administrator) – 모든 권한
    • Users 그룹 – 쓰기 권한 제거
    • Everyone 그룹 – 그룹 제거
  • 로그 파일
    • Administrator 또는 전용 WAS 계정 소유고 전용 WAS 그룹(Administrator) – 모든 권한
    • Users 그룹 – 읽기, 쓰기 권한 제거
    • Everyone 그룹 – 그룹 제거

IIS의 로그 디렉터리 권한 설정은 다음 그림을 참고하기 바랍니다.

IIS의 로그 파일 권한 설정은 다음 그림을 참고하기 바랍니다.

리눅스 서버

리눅스 서버에서 운영하는 WAS는 리눅스의 권한 관리 명령어인 chmod [권한 설정 옵션] [로그 디렉터리 혹은 로그 파일] 형식으로 로그 권한을 설정합니다. 로그 디렉터리는 WAS 전용 계정이 소유하는 상태로 750(drwxr-x—) 이하 권한을 설정합니다. 로그 파일은 WAS 전용 계정이 소유하는 상태로 640(rw-r—–) 이하 권한을 설정합니다. 다음과 같습니다.

$ chmod 750 [LOG_DIR]
$ chmod 640 [LOG_FILES]

chmod 명령어를 실행할 때 참고할 주요 WAS의 기본 에러 로그 디렉터리 및 파일 위치는 다음과 같습니다.

  • 아파치 HTTP 서버(패키지 관리자, 데비안 계열): /var/log/apache버전이름/error.log
  • 아파치 HTTP 서버(패키지 관리자, 레드햇 계열): /var/log/httpd/error_log
  • 아파치 HTTP 서버(컴파일 설치): [APACHE_DIR]/logs/error.log
  • 톰캣(패키지 관리자): /var/log/tomcat버전이름/localhost.YYYY-MM-DD.log
  • 톰캣(컴파일 설치): [TOMCAT_DIR]/logs/localhost.YYYY-MM-DD.log
  • NGINX(패키지 관리자): /var/log/nginx/error.log
  • NGINX(컴파일 설치): [NGINX_DIR]/logs/error.log

chmod 명령어를 실행할 때 참고할 주요 WAS의 기본 액세스 로그 디렉터리 및 파일 위치는 다음과 같습니다.

  • 아파치 HTTP 서버(패키지 관리자, 데비안 계열): /var/log/apache버전이름/access.log
  • 아파치 HTTP 서버(패키지 관리자, 레드햇 계열): /var/log/httpd/access_log
  • 아파치 HTTP 서버(컴파일 설치): [APACHE_DIR]/logs/
  • 톰캣(패키지 관리자): /var/log/tomcat버전이름/localhost_access_log.YYYY-MM-DD.txt
  • 톰캣(컴파일 설치): [TOMCAT_DIR]/logs/localhost_access_log.YYYY-MM-DD.txt
  • NGINX(패키지 관리자): /var/log/nginx/access.log
  • NGINX(컴파일 설치): [NGINX_DIR]/logs/access.log

기본 설정이 지정되지 않기 때문에 더 의미 있는 보안 설정입니다

보통 WAS의 기본 설정 파일에는 에러 로그 레벨이 설정되지 않은 때도 있고, 구체적인 액세스 로그 포맷은 설정되어 있지만 액세스 로그에 어떤 포맷을 설정할지 지정되지 않은 때가 있습니다. [여기보기]에서 제시하는 설정을 확인하면 이미 기본으로 설정된 상황이 제법 많지만 로그는 그렇지 않습니다. 보안 위험에서 WAS를 보호하는 데 중요하다고 할 수 있습니다.

2023년도 어느덧 끝났고 2024년이 다가오는 연말연시입니다. 한 해를 마무리하고 새로운 한 해에는 무엇을 할까 계획하는 시점이기도 합니다. 이럴 때 이 글과 함께 WAS의 로그 설정을 점검해보는 것은 어떨까요? 엔지니어라면 마무리 혹은 시작에 의미 있는 시간이 될 것으로 생각합니다.