달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
운영체제가 부팅하면서 시작하는 작업인 로그파일에 대하여 알아본다. 현재의 시스템에서 일어나고 있는 모든 작업이 로그파일에 기록이 된다. 그러므로 문제가 발생하였을 경우 가장 먼저 해야 할 일이 로그분석이다. 로그파일은 서비스하고 있는 상황에 따라 하루에 몇기가씩 쌓일 수도 있다. 운영체제와 외부에 서비스하고 있는 로그파일만으로 하드디스크가 꽉 채워질 수 있고 DDOS 등의 공격을 받아서도 짧은 시간에 엄청난 속도로 늘어날 수 있다. 이에 대해서 정확하게 분석하는 작업과 함께 주기적으로 파일을 로테이션시켜 부하를 줄여야 한다.





1. 로그파일의 종류

리눅스에서 로그파일은 일반적으로 /var/log에 기록이 된다. 로그파일은 운영하는 서비스에 따라서 차이가 나며 syslog.conf 설정에 따라 다르다. (**주1**)

파일명
기능

boot.log
부팅 및 각종 서비스 시작 및 중지에 대한 기록

cron.log
크론 활동 관련 기록

dmesg
시스템 부팅 관련 기록

lastlog
사용자의 마지막 로그인 시간 기록 (last 명령 이용 확인)

maillog
메일 서비스 관련 기록

messages
커널 에러, 리부팅 메시지, 로그인 실패 등 시스템 콘솔에서 출력된 결과를 기록하고 syslog에 의하여 생성된 메시지도 기록

secure
로그인 인증 및 보안 관련 주요 로그

wtmp
사용자 로그인, 로그아웃 시간, 시스템 종료 시간등 기록

(last 명령 이용 확인)

xferlog
ftp 접근 관련 기록

utmp
현재 로그인한 사용자에 대한 상태 기록

(w, who 등 이용 확인) 레드햇에서는 /var/run/wtmp에 있음

.history
사용자 홈디렉토리에 있으며 사용자가 쉘상에서 작업한 것을 기록











사용자에 따라 sulog, pacct 등이 있을 수 있으며 이외에도 여러 인터넷 서비스에 따라 로그기록을 한다. 또한 일반 텍스트 형태의 파일만 있는 것이 아니라 utmp, utmp 등 바이너리 형태로 로그 기록을 하는 경우도 있다. 로그파일은 시스템에서 발생했던 상황을 모두 기록으로 남기기 때문에 문제가 발생하였을 때 출발점이 될 수 있으며 크래킹 여부를 판단할 수 있는 중요한 근거가 된다.



utmp 파일은 현재 시스템에 로그인한 사용자에 대한 정보를 가지고 있으며 사용자 이름, 터미널 장치 이름, 원격 로그인시 원격 호스트 이름, 사용자가 로그인한 시간 등을 기록한다. 일반 텍스트 파일이 아니기 때문에 who, w 등을 이용하여 내용을 살펴볼 수 있다.



$ w

11:40pm up 18:25, 3 users, load average: 0.05, 0.05, 0.00

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

taejun pts/2 211.55.2.161 10:43am 1.00s 0.14s ? -

taejun pts/5 211.52.1.151 10:53am 17:11 0.08s 0.08s -bash





wtmp 파일은 사용자의 로그인과 로그아웃 정보를 모두 가지고 있으며 시스템의 부팅이나 재부팅에 대한 내용도 포함을 하고 있는 중요한 파일이다. last를 이용하여 확인을 할 수 있다.

lastlog 파일은 사용자가 가장 최근에 로그인을 한 기록을 남기며 시스템에 다시 로그인을 할때마다 갱신이 된다. lastlog 프로그램을 이용하여 확인할 수 있다.



# lastlog

Username Port From Latest

root tty1 Sun Jul 15 02:54:21 +0900 2001

bin **Never logged in**

daemon **Never logged in**

mail **Never logged in**

nobody **Never logged in**

mylove pts/1 211.50.6.251 Sun Jul 15 14:40:53 +0900 2001

mysql **Never logged in**

named **Never logged in**





그런데 크래커가 바보가 아니라면 당연히 크래킹을 해놓고도 그 기록을 계속 남기지는 않을 것이다. 정상적인 로그인 절차를 거칠 경우 사용자의 접속 내역은 utmp, wtmp, lastlog에 기록을 하게 되지만 백도어나 rootkit 등이 설치되어 있을 경우에는 그 사실을 모를 수가 있다. 시스템 accounting 기능(**주2**) 을 이용하면 시스템에서 어떠한 프로그램이 얼마만큼 자원을 차지하고 있는지 알 수 있을 뿐만 아니라 로그인한 사용자가 어떤 프로그램을 실행했는지에 대해서 알 수 있는 단서가 된다. 그렇지만 리눅스에서 기본적으로 설치되어 있는 패키지는 아니며 별도로 설정을 해야 한다.

history 파일은 각 사용자가 접속하여 어떠한 명령을 수록했는지 기록하고 있다. 히스토리 파일을 이용하여 공격자의 행위를 파악할 수 있다.

secure 파일은 위에서 설명을 했던대로 보안과 관련한 로그를 기록하며 telnet, ftp, pop등 인중을 필요로 하는 네트워크 서비스에 대한 기록을 남긴다. 메일서버, 웹서버, 네임서버 등도 응용프로그램 차원에서 개별 로그를 남기며 특정한 서비스에 문제가 생겼을 경우 먼저 로그기록부터 확인을 하여 문제점을 찾고 그 대책을 찾아야 할 것이다.







여기서 걸리는 문제는 계속 쌓여만 가는 로그파일을 계속 주기적으로 모니터링할 수 없다는 것이다. 이런 경우에는 아주 간단하게 자신이 주로 살펴볼 필요가 있는 로그파일에 대하여 grep으로 뽑아내거나 전문적인 로그 관련 유틸리티를 활용할 필요가 있다. 이에 대해서는 swatch 나 logcheck 등을 활용하기 바란다. (**주3) 로그 모니터링툴을 활용하는 경우 제대로 필터링을 하지 않으면 엄청난 스팸 메일이 되어 돌아온다는 것을 기억하기 바란다.





2. 로그파일 설정 - syslog 에 대하여

일반적으로 로깅 기능은 syslog를 이용하여 어떻게 사용할 것인지 지정을 한다. 배포판 설치시 로그파일을 기록하는 패키지가 자동으로 설치된다. 이러한 역할을 하는 패키지가 syslogd 패키지이다.



# 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.gz

/usr/man/man8/klogd.8.gz

/usr/man/man8/sysklogd.8.gz

/usr/man/man8/syslogd.8.gz





시스템 로깅 프로그램은 시스템의 부팅시 초창기에 실행이 된다. 이에 대한 설정은 /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

# 모든 info를 messages에 기록. 여기서 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, news 의 crit 정보 기록



# 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



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



priority는 다음과 같으며 중요도에 따라 나열하고 있다.

debug, info, notice, warning, warn (warning), err, error (err), crit, alert, emerg, panic (emerg)



상세한 내용은 아래와 같다.



emerg : 시스템 패닉

alert : 에러 경고. 즉각 알려야할 내용

crit : 하드 장치 에러와 같은 임계 에러(critical error)

err : 에러

warn : 경고

notice : 비임계 메시지

info : 정보 메시지

debug :문제 추적을 돕는 특수 정보

만약 none 이라고 하면 그에 대한 모든 로그 메시지를 제외하라는 뜻이다.



모든 facility 나 priority 를 지정하려면 * 를 쓰면 되며 여러개를 지정하려면 , 를 사용하면 된다. 그런데 여기서 반드시 알아두야할것이 priority를 지정하면 그와같은 priority부터 그 위의 priority에 관련된 로그를 기록한다는 것이다. 만약 info 를 지정하면 emerg 부터 info 사이의 모든 로그를 기록한다. 만약 단일한 priority를 지정하려면 = 를 사용하면 된다. !는 priority 범위를 제한한다. 이에 대해서는 아래에서 설명하는 예를 참고하자.

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



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



보통 위의 내용이 일반적인 배포판 구성이다. 아마 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

# mail 과 news의 info 만 기록



# Log info and notice messages to messages file

#

*.=info;*.=notice;\

mail.none /var/log/messages



# info 와 notice 에 해당하는 모든 메시지 기록.

# 여기서 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 이상 메시지를 root 와 taejun 사용자에게



*.* @taejun

# 모든 메시지를 taejun 이라는 원격 호스트로

# 위에서 설명했던 것처럼 클러스터링 시스템에서

# 모른 로그 메시지를 한곳에 기록하는 경우 유용





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



# logger -p authpriv.alert -t oh_no_login "test"



# tail -f secure

Jul 10 23:42:12 tunelinux oh_no_login: test





위에서 설명을 한 대로 특정 시스템의 로그를 다른 원격 서버로 보내어 분석할 수 있다. 이에 대해서 설명을 한다.



먼저 확인해야 할 것이 있다.



/etc/services 파일에 아래의 내용이 있는지 확인해보자.

syslog 514/udp



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



로그를 생성하는 서버에서 설정을 하자. /etc/syslog.conf 에 아래의 내용을 추가한다.



mail.info @admin



이건 mail.info 에 해당하는 로그를 admin 이라는 호스트로 보내는 것이다. 이왕이면 admin은 DNS에 문제가 생길 수도 있으므로 /etc/hosts에 등록해두는 것이 좋을 것이다. 필요하다면 *.* 을 이용 전부를 다 보낼 수도 있다. 이런 경우에는 시스템에 아주 심각한 문제가 생긴다고 하더라도 원격 호스트에 로그 파일이 남으므로 나중에 분석을 할 수 있다는 것이다.



이제 로그를 원격에서 받아 기록하는 서버의 설정을 한다. syslogd 대몬을 시작할때 추가 옵션이 필요하다. 레드햇(또는 호환 계열) 배포판의 경우 시작파일은 다음과 같은 형태이다.



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



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



daemon syslogd -m 0 -r -h



이렇게 설정을 한다. 세부 옵션은 아래와 같다.



-m 0 : 기본설정되어있는것으로 변경하지 않아도 된다. 이건 지정한 분동안에 MARK 라고 로그파일에 기록을 한다. 0이면 기록을 하지 않는다.

-r : 인터넷 도메인 소켓을 이용해 네트웍에서 메시지를 받는 옵션

-h : 기본적으로 syslogd는 원격 호스트에서 받은 메시지를 로그 기록으로 전송하지 않는다. 이 옵션을 사용하여 원격 호스트에서 받은 로그파일을 전송한다. (전송이란 받은 쪽의 로그 파일에 기록한다고 생각하면 된다)







3. logrotate 이용한 로그 파일 관리

보안과 시스템을 관리하고 운영하는 측면에서 로그파일이 중요하지만 계속 쌓이기만 하는 로그파일을 그대로 둔다면 시스템에 문제가 발생할 가능성이 크다. 소규모로 서버를 운영하는 경우 로그파일에 그다지 신경을 쓰는 일이 없다. 그렇지만 제공하는 서비스가 많아지고 규모가 커질 경우 예상치 못한 곳에서 문제가 생기는 일이 많다. 그중 하나가 엄청나게 증가하는 로그파일문제이다. 메일의 경우를 예로 들어보자. 전자메일이 전송된 경우 필자의 시스템에서는 maillog와 messages에 동시에 기록이 된다. pop3도 마찬가지이다. 전자메일을 전송하는 경우에는 560바이트 정도 되었고 pop3로 메일을 가져올 경우에는 500바이트 정도 되었다. 여기서 메일주소가 잘못되어 반송된 경우에 남은 로그는 1.2k 정도가 되었다. 웹서버 로그를 보자. 웹서버 로그의 경우 로그기록을 어떻게 하느냐에 따라 다른데 common이 아니라 access, agent, referer를 모두 기록하는 combined를 이용할 경우 한번 접속당 160바이트가 증가한다. common에 비해서는 두배이상 되는 규모이다. Mysql에서도 모든 sql문에 대하여 기록을 남기는 기능을 이용할 경우 db에서 진행되는 모든 sql문이 로그파일에 그냥 기록이 되므로 규모가 큰 파일을 dump하여 다시 import 하였을 경우 로그 파일의 규모가 dump 크기에 비례하여 엄청나게 늘어난다. 로그파일의 크기가 늘어나서 불필요한 하드디스크 공간이 낭비되고 심지어 서비스가 중지될 정도로 심각한 상황이 초래될 수가 있다. 더 나아가 서비스하는데 투여되어야 할 시스템 자원이 로그파일을 기록하는데 데에만 신경을 써서 정작 서비스 자체의 속도나 질이 형편없이 떨어질 가능성도 크다.



리눅스에서 로그 로테이션을 담당하는 패키지가 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.gz

/usr/sbin/logrotate





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





# 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이 제일 처음 생성되고 순환간격마다 예전 cron 은 cron.1 이, cron.1은 cron.2, cron.2 는 cron.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 syslog

# 여기서 가장 중요한 syslog는 messages, 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 에서 메일서버의 로그만 따로 처리를 해보겠다.



# cat /etc/logrotate.d/maillog

weekly

size 500k

rotate 4

compress

errors admin

mail admin

nomissingok

create 0600 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 에게 보낸다. 만약 로그파일이 없으면 에러를 내며 순환후 파일을 생성시키고 이 파일의 모드는 0600 으로 소유자와 그룹은 root 로 한다.



웹서버를 여러 대 운영하고 있고 하루에 한번씩 로그파일을 로테이션시킨다면 logrotate 설정에 중앙의 로그분석 서버로 보내는 작업을 집어넣는 것도 좋은 방법이다. 이런 경우에는 ncftput등의 명령이나 rsync를 이용할 수 있는데 필자는 rsync를 즐겨 쓰는 편이다. (**주4) 알아두면 편리한 프로그램으로 시스템간의 자료 동기화에 주로 사용하며 미러 서버를 운영하는 경우에도 많이 사용하고 있다.





4. 임시파일 관리에 대하여

리눅스 및 유닉스 시스템에서는 상황에 따라 필요하면 임시파일을 생성한다. 보통 /tmp나 /var/tmp를 이용하며 이외에도 맨페이지 등에서 사용하는 임시파일이 있다. 이런 역할을 하는 프로그램이 tmpwatch 패키지이다. cron.daily에 설정이 되어 자동으로 작동을 하도록 되어 있다.



# cat /etc/cron.daily/tmpwatch

/usr/sbin/tmpwatch 240 /tmp /var/tmp

[ -d /var/cache/man ] && /usr/sbin/tmpwatch -f 240 /var/cache/man/{X11R6/cat?,cat?,local/cat?}

[ -d /var/catman ] && /usr/sbin/tmpwatch -f 240 /var/catman/{X11R6/cat?,cat?,local/cat?}



필요에 따라 임시파일을 생성하는 경우가 있는데 이것이 악용이 된다면 시스템을 공격하는데 사용될 수가 있다. 또한 불필요한 파일 때문에 하드 디스크 공간을 낭비하는 일은 없어야 할 것이다. 위의 스크립트가 아니라고 하더라도 find 명령을 이용하여 일정한 시간이 지난 파일을 주기적으로 삭제하는 것도 한가지 방법이다.
Posted by tornado
|