리눅스 로그관리



1. 시스템 로그 기록 (syslog)
일반적으로 배포판 설치시 로그파일을 기록하는 패키지가 자동으로
설치된다.

# rpm -qa | grep log

logrotate-3.3-1 --->> 로그 로테이트(순환)
sysklogd-1.3.31-12 --->> 시스템 로그 기록


# rpm -ql sysklogd
/etc/logrotate.d/syslog
/etc/rc.d/init.d/syslog
/etc/rc.d/rc0.d/K99syslog
/etc/rc.d/rc1.d/K99syslog
/etc/rc.d/rc2.d/S30syslog
/etc/rc.d/rc3.d/S30syslog
/etc/rc.d/rc5.d/S30syslog
/etc/rc.d/rc6.d/K99syslog
/etc/syslog.conf --->> 설정파일
/sbin/klogd --->> 커널 로그 대몬
/sbin/syslogd --->> 시스템 로그 대몬
/usr/doc/sysklogd-1.3.31
/usr/doc/sysklogd-1.3.31/ANNOUNCE
/usr/doc/sysklogd-1.3.31/INSTALL
/usr/doc/sysklogd-1.3.31/NEWS
/usr/doc/sysklogd-1.3.31/README.1st
/usr/doc/sysklogd-1.3.31/README.linux
/usr/doc/sysklogd-1.3.31/Sysklogd-1.3.lsm
/usr/man/man5/syslog.conf.5
/usr/man/man8/klogd.8
/usr/man/man8/sysklogd.8
/usr/man/man8/syslogd.8


참고로 문서디렉토리의 내용은 사용과 관련해서는 그다지 도움이
되지 않고 오히려 맨페이지가 도움이 되었다.


# ps aux | head -n10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1168 56 ? S 14:07 0:05 init [3]
root 2 0.0 0.0 0 0 ? SW 14:07 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW 14:07 0:00 [kupdate]
root 4 0.0 0.0 0 0 ? SW 14:07 0:00 [kpiod]
root 5 0.0 0.0 0 0 ? SW 14:07 0:05 [kswapd]
root 6 0.0 0.0 0 0 ? SW< 14:07 :00 [mdrecoveryd]
root 285 . .5 1232 180 ? S 14:07 :00 syslogd -m
root 296 . . 1464 ? SW 14:07 :00 [klogd]

보통 위와 같이 로그 대몬은 시스템의 부팅시 초창기에 실행이 된다.


그러면 가장 먼저 /etc/syslog.conf 를 살펴보자. syslod의 설정 파일이다.

# cat /etc/syslog.conf


# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console


# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none /var/log/messages

# The authpriv file has restricted access.
authpriv.* /var/log/secure

# Log all the mail messages in one place.
mail.* /var/log/maillog

# Everybody gets emergency messages, plus log them on another
# machine.
*.emerg *

# Save mail and news errors of level err and higher in a
# special file.
uucp,news.crit /var/log/spooler

# Save boot messages also to boot.log
local7.* /var/log/boot.log



설정파일은 매우 간단하다. 빈 행과 # 으로 시작되는 행은 무시된다.
(참고로 리눅스는 BSD 형식으로 로그를 구성한다)
설정행의 구조는 다음과 같다.

facility.level destination

facility는 메시지를 보내는 서브시스템의 이름이며
level(priority)은 메시지의 중요성(엄격도)을 나타낸다.

facility는 다음과 같다.
auth, authpriv, cron, daemon, kern, lpr, mail, news, syslog,
user, uucp, local0 - local7

priority는 다음과 같다. (엄격도가 감소하는 순서)
debug, info, notice, warning, warn (same as warning),
err, error (same as err), crit, alert, emerg,
panic (same as emerg)

각자에 대한 설명은 아래를 참고하자.

# man 3 syslog


facility
The facility argument is used to specify what type of pro
gram is logging the message. This lets the configuration
file specify that messages from different facilities will
be handled differently.

LOG_AUTH
security/authorization messages (DEPRECATED Use
LOG_AUTHPRIV instead)

LOG_AUTHPRIV
security/authorization messages (private)

LOG_CRON
clock daemon (cron and at)

LOG_DAEMON
other system daemons

LOG_KERN
kernel messages

LOG_LOCAL0 through LOG_LOCAL7
reserved for local use

LOG_LPR
line printer subsystem

LOG_MAIL
mail subsystem

LOG_NEWS
USENET news subsystem

LOG_SYSLOG
messages generated internally by syslogd

LOG_USER(default)
generic user-level messages

LOG_UUCP
UUCP subsystem


level
This determines the importance of the message. The levels
are, in order of decreasing importance:

LOG_EMERG
system is unusable

LOG_ALERT
action must be taken immediately

LOG_CRIT
critical conditions

LOG_ERR
error conditions

LOG_WARNING
warning conditions

LOG_NOTICE
normal, but significant, condition

LOG_INFO
informational message

LOG_DEBUG
debug-level message


auth 대신 auth_priv를 사용할 것을 추천하고 있으며 나머지는
읽어보면 쉽게 이해가 갈 것이다. 크론, 대몬, 커널 메시지,
로컬에서 사용, 프린터, 메일, 뉴스, syslog, 사용자 정의,
UUCP. (auth는 로그인 인증 시스템)

emerg : 시스템 패닉
alert : 에러 경고. 즉각 알려야할 내용
crit : 하드 장치 에러와 같은 임계 에러(critical error)
err : 에러
warn : 경고
notice : 비임계 메시지
info : 정보 메시지
debug :문제 추적을 돕는 특수 정보
만약 none 이라고 하면 그에 대한 모든 로그 메시지를 제외하라는 뜻입니다.


모든 facilitypriority 를 지정하려면 * 를 쓰면 되며
여러개를 지정하려면 , 를 사용하면 됩니다.

그런데 여기서 반드시 알아두야할것이 priority를 지정하면 그와
갈은 priority부터 그 위의 priority에 관련된 로그를 기록한다는
것입니다. 만약 info 를 지정하면 emerg 부터 info 사이의 모든
로그를 기록하는 것이지요.

만약 단일한 priority를 지정하려면 = 를 사용하면 됩니다.
!는 priority 범위를 제한합니다.
이에 대해서는 아래에서 설명하는 예를 참고하세요.

** 리눅스에서 syslogd는 원래 BSD 소스에 몇가지 기능이 추가
되었다. =, ! 등이 이에 속한다.


로그파일을 기록으로 남기는 방식에는 여러가지가 있다.
가장 먼저 파일형태(/var/log/messages). named pipe.
터미널과 콘솔(/dev/console). 원격 머신(@). 사용자.
로그인한 전체 사용자(*)

자 가장 먼저 /etc/syslog.conf 를 살펴보자.

# cat /etc/syslog.conf



# Log all kernel messages to the console.
# Logging much else clutters up the screen.
kern.* /dev/console

# 모든 커널 메시지를 콘솔로.


# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none /var/log/messages

# 모든 infomessages에 기록. 여기서 mail, authpriv 관련 기록은 제외


# The authpriv file has restricted access.
authpriv.* /var/log/secure

# 모든 로그인 인증 관련 기록. su, login 등을 모두 여기 기록


# Log all the mail messages in one place.
mail.* /var/log/maillog

# 모든 메일 메시지


# Everybody gets emergency messages, plus log them on another
# machine.
*.emerg *

# 비상 메시지(emerg)는 현재 로그인한 모든 사용자에게 알림


# Save mail and news errors of level err and higher in a
# special file.
uucp,news.crit /var/log/spooler

# uucp, newscrit 정보 기록


# Save boot messages also to boot.log
local7.* /var/log/boot.log

# 부트 메시지 기록



보통 위의 내용이 일반적인 배포판 구성이다.
아마 kernel 메시지에는 주석이 되어있을 것이다.


예를 들어 *.err /dev/tty8 를 추가해보자.
놀고있는 tty8 콘솔에서 시스템에서 발생하는 모든
에러를 볼 수 있다.

*.* @taejun

이건 모든 메시지를 taejun 이라는 원격 호스트에서 처리하도록
할 수 있다. 어떤 경우 이게 유용할까? 이건 클러스터링으로 구성된
시스템에서 아주 유용할 것이다. 모든 syslog 메시지를 한대의
시스템으로 모을 수 있으니깐.


그러면 위의 기본 설정말고 몇가지 예를 더 보자.


# Store critical stuff in critical
#
*.=crit;kern.none /var/adm/critical


# 커널을 제외하고 모든 crit 에 해당하는 메시지 기록
# (여기서 = 를 지정한 차이점에 대해서 이해해야함)



# Kernel messages are first, stored in the kernel
# file, critical messages and higher ones also go
# to another host and to the console
#
kern.* /var/adm/kernel
kern.crit @finlandia
kern.crit /dev/console
kern.info;kern.!err /var/adm/kernel-info


# 커널 관련 모든 기록은 kernel 파일에,
# 커널에서 crit 이상의 메시지는는 콘솔과 원격 호스트로.
# 두번째 부분(원격 호스트)이 유용한 것은 만약 시스템이
# 붕괴해서 디스크에서 복구할 수 없는 에러가 났더라도
# 원격 호스트에서 이 문제를 해결할 수 있는 원인을
# 찾을 수 있다.
# 이제 네번째 줄. 이건 info 부터 err 이전 그러니깐
# info , notice, warn 에 대한 메시지를 기록한다.
# 로그 범위을 제한하는 것이지요.



# The tcp wrapper loggs with mail.info, we display
# all the connections on tty12
#
mail.=info /dev/tty12

# mail.info에 관련된 메시지를 12번째 콘솔에 기록.


# Store all mail concerning stuff in a file
#
mail.*;mail.!=info /var/adm/mail


# mail.info 만 제외하고 모든 mail 메시지.


# Log all mail.info and news.info messages to info
#
mail,news.=info /var/adm/info

# mailnewsinfo 만 기록


# Log info and notice messages to messages file
#
*.=info;*.=notice;\
mail.none /var/log/messages

# infonotice 에 해당하는 모든 메시지 기록.
# 여기서 mail의 모든 메시지만 제외.



# Log info messages to messages file
#
*.=info;\
mail,news.none /var/log/messages

# 모든 info 에 관련된 메시지.
# 단, 메일, 뉴스의 모든 메시지는 제외



# Emergency messages will be displayed using wall
#
*.=emerg *

# 모든 emergency 메세지를 현재 로그인한 모든 사용자에게.
# 이는 wall 과 같다.



# Messages of the priority alert will be directed
# to the operator
#
*.alert root,taejun

# 모든 alert 이상 메시지를 roottaejun 사용자에게


*.* @taejun

# 모든 메시지를 taejun 이라는 원격 호스트로
# 위에서 설명했던 것처럼 클러스터링 시스템에서
# 모른 로그 메시지를 한곳에 기록하는 경우 유용




logger 유틸리티는 쉘 스크립트에서 syslog 기능을 이용
메시지를 보낼 수 있다.

# logger -p authpriv.alert -t oh_no_login \
"태준이가 이상한 곳에서 로그인했어요… 오옷 이런~~"


# tail -f secure


Feb 22 18:31:42 taejun oh_no_login: 태준이가 이상한 곳에서
로그인했어요… 오옷 이런~~


좀 유치한 예이지요????

참고로 /var/log/wtmp 를 이용, last 명령으로
사용자의 로그인과 관련된 기록을 볼 수 있다.

위 설정파일에서 /var/log/에 있는 로그파일에 대해서
어느정도 설명을 다 하였다. 여기서 언급하지 않은 것이
xferlog 인데 이는 ftp 서버에 대한 로그파일이다.


위 내용을 참고로 자신의 서버에 맞는 로그 기록을 설정해보자.





2. logrotate 이용한 로그 파일 관리
서문에서 말을 한대로 로그파일을 제대로 관리하지 않으면
대형 서버의 경우 로그파일때문에 하드디스크 공간이 남아나지
않고 또 로그파일 처리로 버벅거리게 된다.

대부분 레드햇 기반의 배포판에서는 기본으로 설치되어 있다.


# rpm -qa | grep logrotate
logrotate-3.3-1


# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/man/man8/logrotate.8
/usr/sbin/logrotate

logrotate는 계속 커지는 로그파일을 효율적으로
관리하기 위한 프로그램이다.
자동으로 로테이션을 시켜주고, 압축, 제거, 메일로 보내주기 등의
작업을 한다.

초기 리눅스 설치시 자동으로 cron에 추가가 된다.

/etc/cron.daily/logrotate

내용은 다음과 같다.

# cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf


위에서 보면 logrotate 가 프로그램이고 logrotate.conf
설정파일이라는 것을 알 수 있을 것이다.
위에서 .conf 파일대신 특정 디렉토리를 지정하면
그 해당 디렉토리의 모든 파일을 사용해 작업을 한다.
logrotate 에 여러가지 옵션이 있지만 그다지 사용할 일은
없을 것 같다. 혹시나 궁금하면 man 으로 확인.

먼저 rotate 에 대해서 설명하겠다.
rotate 3 라면 cron 로그라고 했을 경우.
/var/log 디렉토리에 cron이 제일 처음 생성되고
순환간격마마 예전 croncron.1 이, cron.1cron.2,
cron.2cron.3 으로 된다. 기존의 cron.3은 삭제가 될 것이다.
그러니깐 새로 생성한 메일로그외에 이전의 로그를 3개까지 기록
하는 것이다.



자 그러면 이제 설정파일을 한번 살펴보자.

# cat /etc/logrotate.conf


# see "man logrotate" for details
# rotate log files weekly
weekly

# 기본적으로 일주일마다 로그파일을 순환시킴


# keep 4 weeks worth of backlogs
rotate 4

# 이전 로그파일을 4주동안 간직.
# 위에서 순환간격을 1주일로 했으므로.



# send errors to root
errors root

# 에러가 생길경우 root 에게 메일로.


# create new (empty) log files after rotating old ones
create

# 예전 로그파일을 순환시킨후 새로운 로그파일 생성


# uncomment this if you want your log files compressed
#compress

# gzip 을 이용 압축한다.


# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# /etc/logrotate.d 파일 또는 디렉토리 안에 있는 파일을 읽어들인다.
# 참고로 필자의 서버에는 다음과 같은 기본설정 파일이 있다.
# ls /etc/logrotate.d
# apache cron ftpd named samba squid syslog
# 여기서 가장 중요한 syslogmessages, secure, maillog, spooler,
# bootlog 로 구성



# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

# 매월마다 순환시킴
# create 는 순환후 즉시 (postrotate 스크립트를 실행시키기전에)
# 로그 파일을 생성한다. 뒤에서 설명할 것이지만 postrotate
# 로그파일을 순환한후 진행할 작업을 명시한다.
# 0664 는 생성하는 파일의 허가권, root 는 소유자, utmp 는 그룹
# rotate 1 은 위에서 설명했다. 그런데 개별적으로 설정하면
# 초기에 설정한 weekly 는 무시되 개별 설정을 따른다
# 그러므로 여기에서는 이전의 로그파일이 1개만 남을것이다.
# (원본 제외)
# 참고로 기본적으로 syslog에서는 600으로 허가권을 설정한다.
# 다른 누구도 로그파일에 접근하면 안되기 때문이다.


/var/log/lastlog {
monthly
rotate 1
}

# system-specific logs may be configured here



이제 몇가지 주요한 옵션에 대해서 살펴보자.

ㅇ 순환할 기간 설정 : daily, weekly, monthly
여기에 size 를 이용해 크기까지 설정할 수 있다.
접속이 많아서 로그파일이 엄청나게 늘어나는 경우에는
size(기본 kilobytes)를 이용 제어해야 할 것이다.
size 100k(= size 100)


ㅇ 압축설정 : compress
gzip으로 이전 로그파일을 압축한다.
공간을 절약할 수 있다.
이 옵션을 없애려면 주석을 달든지 아니면
nocompress(기본값) 사용

ㅇ 메일설정 : error, mail
error taejun -> 에러를 taejun 이라는 사용자에게 보냄
mail taejun -> 로그파일을 순환시키고 나중에 삭제해야할때
삭제하지 않고 메일로 보내는 것이다.

ㅇ 로그파일 생성
create mode owner group (기본값)
위에서 사용예는 설명했다. create 를 지정하면 순환후 로그
파일을 생성한다. 반대는 nocreate

ㅇ 순환간격 : rotate count
이전 로그파일이 삭제되거나 메일로 보내기전에 순환을 할
횟수 지정. 여기서 0으로 지정하면 예전 로그파일은
무조건 삭제된다.


ㅇ 지정한 로그파일이 없을 경우 : missingok, nomissingok
로그파일이 없으면 기본은 에러를 낸다(nomissingok, 기본값).
missingok 를 지정하면 없더라도 에러를 내지는 않는다.


ㅇ 로그파일의 내용이 없을 경우(비어있을경우)
기본은 ifempty로 내용이 비었어도 순환을 한다.
순환을 하지 않도록 하려면 notifempty 를 지정하면 된다.


ㅇ 순환후 작업 : postrotate/endscript
순환하기전 작업을 하려면 prerotate/endscript
를 사용한다. 일반적으로는 순환후 작업을 할 것이다.
예를 들어 메일관련 로그를 새로 생성했으면 syslogd를
다시 가동시켜야 할 것이다. 이런것들을 지정한다.

ㅇ 파일 또는 디렉토리 포함 : include
다른 파일이나 디렉토리안의 파일을 포함할 경우




자 이에 위의 내용을 토대로 메일의 로그를 조정해보자.
여기서는 /etc/logrotate.d/syslog 에서 메일서버의
로그만 따로 처리를 해보겠다.

# vi /etc/logrotate.d/maillog
weekly
size 500k
rotate 4
compress
errors admin
mail admin
nomissingok
create 0644 root root
/var/log/maillog {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}


/var/log/messages {
postrotate
/usr/bin/killall -HUP syslogd
endscript
}


위의 예제는 그냥 참고로 만든 것이므로 따라할 필요는 없다.
매주마다 한번식 순환시키고 크기가 500k가 넘지 않도록 하며
순환한 파일은 압축을 한다. 에러를 admin 이라는 사용자에게
보내고 순환후 삭제할 파일을 메일로 admin 에게 보낸다.
만약 로그파일이 없으면 에러를 내며 순환후 파일을 생성시키고
이 파일의 모드는 0644 로 소유자와 그룹은 root 로 한다.


서비스의 규모에 따라 로그파일을 순환할 주기를 더 짧게 잡아야
한다. 크기를 지정하는것이 여러모로 효율적일 것이다.




3. 마치며
여기까지 읽었다면 대략 시스템의 로그가 어떻게 작성되고
어떻게 관리를 해야할지 감을 잡았을 것이다.
시스템이 나쁘다는 것을 탓하지 전에 관리자가 얼마나
시스템의 상태를 주기적으로 점검하고 최적화하는지가
중요하다.




### 참고 : 서버 로그를 다른 호스트에 기록하기

클러스터링 시스템을 구성하는 경우 여러 서버로 로그가 나누어집니다.
이럴 경우 중앙의 관리자용 서버로 로그를 집중시킬 수 있습니다.


1. 먼저 확인해야 할 것
/etc/services
syslog 514/udp

로그를 만드는 쪽과 받는 쪽 두군데에서 다 필요합니다.
보통 기본 설정되어있을 것입니다.
메시지를 주고받는데 UDP 포트가 필요하기 때문입니다.


2. 로그를 작성하는 서버에서 필요한 설정.

/etc/syslog.conf

mail.info @admin

이건 mail.info 에 해당하는 로그를 admin 이라는 호스트로 보내는 것입니다.

이왕이면 admin은 DNS에 문제가 생길 수도 있으므로 /etc/hosts에 등록해
두는 것이 좋을 것입니다.

필요하다면 *.* 을 이용 전부를 다 보낼 수도 있겠지요.
이게 좋은게 뭐냐면 시스템이 맛이 가더라도 원격 호스트에도 로그 파일이
남으므로 나중에 분석을 할 수 있다는 것입니다.


3. 로그를 받는 서버에서 필요한 설정
syslogd 대몬을 시작할때 추가 옵션이 필요합니다.
레드햇의 경우 시작파일은 다음과 같은 형태일 것입니다.

/etc/rc.d/init.d/syslog

여기서 대몬을 시작하는 옵션으로

daemon syslogd -m 0 -r -h

이렇게 사용을 합니다.

-m 0 : 기본설정되어있는것으로 변경하지 않아도 됩니다. 이건 지정한 분동안에
MARK 라고 로그파일에 기록을 합니다. 0이면 기록을 하지 않는 것이지요.
-r : 인터넷 도메인 소켓을 이용해 네트웍에서 메시지를 받는 옵션
-h : 기본적으로 syslogd는 원격 호스트에서 받은 메시지를 로그 기록으로 전송하지
않습니다. 이 옵션을 사용하여 원격 호스트에서 받은 로그파일을 전송합니다.
(전송이란 받은 쪽의 로그 파일에 기록한다고 생각하면 됩니다)

man syslogd 를 해보면 도움을 얻을 수 있습니다.

syslogd의 보안을 위한 보안 패키지도 있습니다.



출처  == 해커즈뉴스 ==


작성자 = 문태준 =

syslog 및 기타로그 관련

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다