Profile picture

rsyslog 로그 서버 구축하기

JaehyoJJAng2023년 06월 07일

시스템 로그

시스템에서 일어나는 모든 이벤트 등은 각 서비스별로 기록됨. 이러한 기록들을 로그(Log)라고 부른다. 로그 분석은 시스템 관리 및 보안에 상당이 중요한 역할을 하므로 숙지하고 있어야 한다.

리눅스 초기에는 로그 기록과 관련한 패키지로 syslog를 사용하였다. syslog 데몬이 /etc/syslog.conf 설정 파일을 기반으로 서비스별 로그 파일을 /var/log 디렉토리에 생성되게 하였음.

현재 최근 리눅스 배포판에서는 syslog가 rsyslog로 대체되었다. rsyslog는 기존 syslog와 유사하게 rsyslog 데몬이 /etc/rsyslog.conf 설정 파일을 기반으로 서비스별 로그 파일을 /var/log 디렉토리에 생성한다.


rsyslog

rsyslog는 rsyslog 데몬이 동작하면서 로그를 기록하고, 관련 설정은 /etc/rsyslog.conf 파일을 통해서 제어함.


rsyslog 주요 파일

파일명 설명
/etc/rsyslog.conf rsyslogd 데몬의 환경 설정 파일
/etc/sysconfig/rsyslog rsyslogd 데몬이 실행과 관련된 옵션이 설정되는 파일
/usr/sbin/rsylogd 실제 rsyslogd 데몬 실행 명령
/usr/lib/systemd/system/rsyslog.service systemctl 명령에 의해 제어되는 유닛 파일

/etc/rsyslog.conf

기본 구성 형식

facility.priority       action

facility는 일종의 서비스를 의미함. 메시지를 발생시키는 프로그램의 유형 priority는 위험의 정도를 나타내는데 설정한 수준보다 높은 값을 가지게되면 메시지를 보냄. actions은 메시지를 보낼 목적지나 행동들에 관한 설정으로 보통 파일명이나 아이디를 적음.


facility 종류

facility 설명
cron cron,at과 같은 스케줄링 프로그램이 발생한 메시지
auth,security login과 같이 인증 프로그램 유형이 발생한 메시지
authpriv ssh와 같이 인증이 필요한 프로그램 유형이 발생한 메시지로 사용자 추가 시에도 메시지 발생
daemon telnet,ftp 등과 같이 여러 데몬이 발생한 메시지
kern 커널이 발생한 메시지
lpr 프린트 유형의 프로그램이 발생한 메시지
mail 메일 시스템이 발생한 메시지
news 유즈넷 뉴스 프로그램이 발생한 메시지
syslog syslog 프로그램 유형이 발생한 메시지
user 사용자 프로세스
uucp UUCP(UNIX to UNIX Copy Protocol) 시스템이 발생한 메시지
* 모든 facility를 의미함

priority 종류

priority 설명
none 지정한 facility를 제외. 보통 앞에 다른 facility에 대한 설정을 하고 ';'뒤에 특정한 facility를 제외할 때 사용
debug 프로그램 디버깅 시 발생하는 메시지
info 통계, 기본 정보 메시지
notice 특별한 주의가 필요하나 에러는 아닌 메시지
warning,warn 주의가 필요한 경고 메시지
error,err 에러가 발생한 메시지
crit 크게 긴급하지는 않지만 시스템에 문제가 있다는 메시지
alert 즉각적인 조치가 필요한 상황
emerg,panic 모든 사용자들에게 전달해야 할 위험한 상황

action 종류

action 설명
file 지정한 파일에 로그를 기록, /로 시작해서 절대 경로 기입
(예시, /var/log/messages)
@host 지정한 호스트로 메시지를 UDP 기반으로 전달
(예시, .@192.168.121.100)
@@host 지정한 호스트로 메시지를 TCP 기반으로 전달
(예시,.@@192.168.121.100)
user 지정한 사용자가 로그인한 경우 해당 사용자의 터미널로 전달
(예시, ":omurmsg:*")
콘솔 또는 터미널 지정한 터미널로 메시지 전달
(예시, /dev/tty2)

작성 예시

1. 모든 facility가 발생하는 메시지 중 'crit' 수준의 메시지만 /var/log/critical 파일에 기록하는데 커널이 발생하는 메시지는 제외

$ vi /etc/rsyslog.conf

*.=crit;kern.none /var/log/critical

rsyslog 서버 구축 (CentOS)


서버 설정

  • 클라이언트들에게 로그를 받는 서버

1. 시스템 로그 config 파일 수정

$ vi /etc/rsyslog.conf

1-1. 아래 514 포트가 열려있는지 확인 (UDP / TCP 중 하나만 열어도 가능)
* 각 중괄호 {} 안에는 서버 별 적절한 내용 기입

#### MODULES ####
# ...

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
# ...

image


1-2. 각 서버 별 템플릿 추가

  • 로그의 경로 설정하고 파일명 형식 지정
  • 중괄호 {} 안의 내용은 각 서버별로 알맞게 기입
  • 로그가 쌓이는 기본 경로 : /var/log/rsyslog
Template 설명
%HOSTNAME% 클라이언트의 Host 이름
%fromhost-ip% Print IP
%$YEAR% Print 년도
%$MONTH% Print 월
%$DAY% Print 일

# /etc/rsyslog.conf

$template {SERVER_NAME}, "/var/log/remote/%fromhost-ip%.log"
*.* ?{SERVER_NAME}

#### GLOBAL DIRECTIVES ####

# ...

image


2. rsyslog 포트 개방 (firewalld)

firewall-cmd --permanent --zone=public --add-port=514/tcp
firewall-cmd --permanent --zone=public --add-port=514/udp
firewall-cmd --reload

3. rsyslog 유닛 재시작

$ systemctl restart rsyslog.service

클라이언트 설정

  • rsyslog 서버에게 로그를 보내는 서버

1. 시스템 로그 config 파일 수정

$ vi /etc/rsyslog.conf

2. 중괄호 안에는 위에서 설장한 로그를 받는 서버의 IP 기입
* 아래 코드중 '@' 한개는 UDP, '@@' 두개는 TCP를 사용하겠다는 의미

# /etc/rsysolog.conf

# ...

*.* @{IP}:514

image


3. rsyslog 서비스 재시작

systemctl restart rsyslog.service

rsyslog 포트 확인

rsyslog가 정상적으로 작동 중인지 포트 확인하기 (Master 서버에서 진행)


netstat

$ netstat -natlp | grep '514'
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      78637/rsyslogd
tcp6       0      0 :::514                  :::*                    LISTEN      78637/rsyslogd

lsof

$ lsof -i udp:514
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 78637 root    3u  IPv4 101165      0t0  UDP *:syslog
rsyslogd 78637 root    4u  IPv6 101166      0t0  UDP *:syslog

ps

$ ps -ef | grep 'rsyslog' | grep -v 'grep'
root      78637      1  0 15:53 ?        00:00:00 /usr/sbin/rsyslogd -n

로그 발생 테스트

클라이언트 서버에서 logger 명령어를 사용하여 로그를 발생시킨 후 마스터 서버의 /var/log/remote 경로에 로그 파일이 정상적으로 생성되는지 확인하자.


클라이언트 서버 접속 후 logger 명령 날리기

logger "Hello, I am hacker! ^_^"

마스터 서버 접속 후 /var/log/remote 경로 확인

ls -lh /var/log/remote
합계 8.0K
-rw-------. 1 root root 1.4K 1117 02:24 127.0.0.1.log
-rw-------. 1 root root 1.1K 1117 02:28 192.168.121.152.log

image


192.168.121.152.log 파일 내용 확인

cat /var/log/remote/192.168.121.152.log | tail -n 1

image


Loading script...