본문 바로가기

Learning/└◆리눅스 서버 보안

02_로그보안 01_Log Server Guide

Log Server Guide

목적 : 로그 기록 체계, 로그 기록 분석, 로그 서버 구축

 

01. 리눅스 로그 개요

로그 기록 용도

사용자 및 서버의 활동 기록

시스템 공격에 대한 흔적 기록

서버 장애에 대한 흔적 기록

로그 기록을 통한 성능 카운트

 

-> 옛날 로그 기록은 거의 필요가 없다

-> 따라서, 오래된 로그 기록들의 관리 정책을 잘 세워야 한다.

 

(주의) 로그 기록을 이해하지 못하는 관리자에게는 아무런 쓸모가 없는 파일에 불과하다.

따라서 로그 기록을 분석하는 방법도 중요하다.

 로그 기록이 사용되는 실무적인 예
사용자 활동량이 많은 서버(접속해서 사용하는 사용자들)

 

서버 관리자가 자신이 맡고 잇는 서버에 접속하고 난후 작업 순서

1. 서버 관리자 접속

2. 서버 점검 포인트

     첫번째, 현재 사용량 점검

     CPU I/O, MEM I/O, DISK I/O, Network I/O, 프로세스 사용량 점검

     -> sar, vmstat, mpstat, netstat, top, ps, iostat, df, du, quot ...

 

     두번째, 이전 사용량 점검

     로그 기록 -> /var/log/messages, /var/log/secure, /var/log/xferlog....

 

     세번째, 서버의 목적에 맞는 사용량 점검

     사용자가 사용하고 있는 프로세스 점검

     -> top, gnome-system-monitor, ps, who, w, watch.....

 

로그의 위치

/var/log    일부 BSD 계열, FreeBSD, LInux

/var/run    일부 Linux

 

리눅스 기본 로그 파일

/var/log/messages        메일,뉴스,인증,크론 메세지를 제외한 시스템의 전반적인 메세지를 기록하는 로그파일

리눅스에서는 가장 많은 메세지를 담고 있는 파일이다.

(TUI) # tail -f /var/log/messages

(GUI) # gnome-system-log &

/var/log/secure            개인인증을 기록하는 로그파일(su, telnet, ssh)

/var/log/dmesg             시스템이 부팅할 때 메세지를 기록하는 로그 파일, dmesg 명령어가 이 파일을 참조 #dmesg

/var/log/lastlog            사용자의 가장 마지막에 로그인한 시간을 기록하는 로그파일

/var/log/cron                crontab, at 명령어를 통해 실행했던 작업을 기록하는 로그파일

/var/log/xferlog             FTP 서버에서 업로드/다운로드을 기록하는 로그파일

/var/log/wtmp                사용자의 로그인/로그아웃 시간을 기록하는 로그파일 last명령어가 이 파일을 참조한다.

/var/run/utmp                현재 로그인한 사용자 정보를 기록하는 로그 파일 who명령어가 이 파일을 참조한다.

[EX1] 기본 로그 파일 확인

# cd/var/log ; ls

 

[EX2] 로그 확인(GUI방식)

GNOME : GTK+

KDE      : QT

시스템 모니터링

# top                                    # gnome-system-monitor

# tail -f /var/log/messages    # gnome-system-log

 

새로운 로그 파일 추가

# gnome-system-log &

"File" > "Open" > "messages.1" 파일 선택

or

# tail -f /var/log/messages (# alias mlog='tail -f /var/log/messages' --> ~/.bashrc)

# tail -f /var/log/secure (# alias mlog='tail -f /var/log/secure' --> ~/.bashrc)

 

02. syslog 체계

syslog 체계

리눅스 시스템에서 기존에 존재하는 로그 파일을 쓰지 않고 새로운 로그 파일을 생성하거나, 또는 로그 레벨을 변경하여 더 많은 메세지를 남기도록 하기 위해서는 /etc/syslog.conf 파일의 이해와 syslog 체계에 대해서 알아 두어야 한다.


리눅스 운영체제에서 메세지 생성에 관해서는 syslogd 데몬에 의해서 총괄 관리 되고 있다. 시스템 메세지가 생성이 되면 메세지는 syslogd 데몬에게 전달이 되고 syslogd 데몬은 /etc 디렉토리에 존재하는 syslog.conf 파일의 설정을 확인 하여 적당한 위치로 로그 기록을 출력 하게 된다.


/etc/syslog.conf 파일에는 “어디에서 메세지가 생성이 되면 어디에 메세지를 남겨라”라고 설정 되어 있다. 그럼, syslogd 데몬은 /etc/syslog.conf 파일에 설정된대로 생성된 메세지를 적당한 곳에 기록하게 된다.


시스템 로깅 관리는 syslogd 데몬을 통해 이루어지고, syslogd 데몬이 읽어 들이는 주설정 파일이 /etc/syslog.conf 파일이기 때문에 시스템 관리자에게 /etc/syslog.conf 파일을 관리하는 것은 중요한것이다.

 

03. /etc/syslog.conf 파일

/etc/syslog.conf 파일의 형식은 Selector 필드와 Action 필드로 구분된다. Selector 필드는 다시

Facility와 Level로 구분된다. Facility는 메세지의 종류를 나타내고 Level은 메세지의 난이도(중요도)가 된다.

Action 필드는 로그가 기록되는 곳을 지정하게 된다.

 

(/etc/syslog.conf 파일의 필드 구분)

Selector    [TAB/SPACE]    Action

Facility.Level    [TAB/SPACE]    Action
EX) user.notice    /var/log/test.log

 

Facility : 메세지의 종류

 

 

Level   : 메세지의 난이도

 

Action  : 메세지 기록 위치

 

/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;news.none;authpriv.none;cron.none /var/log/messages

메일(mail),뉴스(news),개인인증(authpriv),크론(cron) 메세지를 제외한 대부분의 메세지를 /var/log/messages 파일에 기록한다.

 

# The authpriv file has restricted access.

authpriv.* /var/log/secure

개인적인 인증에 관련한 부분은 /var/log/secure 파일에 기록한다.(su, sshd)

 

# Log all the mail messages in one place.

mail.* -/var/log/maillog

메일에 관련한 모든 메세지는 /var/log/maillog 파일에 기록한다.

 

# Log cron stuff

cron.* /var/log/cron

크론(cron) 메세지 모두를 /var/log/cron 파일에 기록한다.

 

# Everybody gets emergency messages

*.emerg *

모든 경우 위험한 메세지(패닉 상태)는 모든 사용자에게 뿌린다.

 

# Save news errors of level crit and higher in a special file.

uucp,news.crit /var/log/spooler

uucp,news에 대한 critical 이상 메세지는 /var/log/spooler 파일에 기록한다.

 

# Save boot messages also to boot.log

local7.* /var/log/boot.log

미리 예약된 local7 종류에 대한 모든 메세지(부팅시의 메세지)/var/log/boot.log 파일에 기록한다.

 

#

# INN

#

news.=crit /var/log/news/news.crit

news.=err /var/log/news/news.err

news.notice /var/log/news/news.notice

 

 

04. logger 명령어

logger 명령어는

임의의 메세지를 생성시키는 역할을 가진다.

주로 테스트 용도로 사용된다.

 

명령어 형식

# logger "System rebooted"    (# logger -p user.notice "System rebooted")

Default Value: user.notice

 

# logger -p user.err "System rebooted"

# logger -p local0.notice "System Messages"

 

/etc/syslog.conf 파일에 auth.notice 라고 설정이 되어 있다면, notice는 notice 이상의 메세지를 모두 포함한다.

(notice -> warning -> err -> crit -> emerg). logger 명령어를 통해 auth.notice 메세지와 auth.crit 메세지를

생성하게 되면, /etc/syslog.conf 파일에 따라 콘솔창에 로그 메세지가 남겨지게 된다.

 

 

05. syslog

(네트워크 설정) VMware > VM > Settings > Network Adapter(NAT -> Bridge)

 

# export LANG=C

# vi /etc/hosts

# setip

# service network restart

 

# hostname

# ifconfig eth0

# netstst -nr

# cat /etc/resolv.conf

 

인증 관련 기록(기본 체계를 사용하는 경우)

 

 

/etc/syslog.conf 파일 설정 확인

# grep auth /etc/syslog.conf

 

/var/log/secure 로그 파일 모니터링

# tail -f /var/log/secure

(su 명령어 수행 로그)

Mar 23 03:44:24 linuxXXX su: pam_unix(su-l:session): session opened for user user01 by root(uid=0)

Mar 23 03:44:27 linuxXXX su: pam_unix(su-l:session): session closed for user user01

 

(telnet 명령어 수행 로그)

Mar 23 03:46:36 linuxXXX login: pam_unix(remote:session): session opened for user root by LOGIN(uid=0)

Mar 23 03:46:40 linuxXXX login: pam_unix(remote:session): session closed for user root

 

(ssh 명령어 수행 로그)

Mar 23 03:48:26 linuxXXX sshd[5832]: Accepted password for root from 127.0.0.1 port 41144 ssh2

Mar 23 03:48:26 linuxXXX sshd[5832]: pam_unix(sshd:session): session opened for user root by (uid=0)

Mar 23 03:48:34 linuxXXX sshd[5832]: pam_unix(sshd:session): session closed for user root 

 

su 명령어 수행

# su - user01 ; exit

telnet 명령어 수행

# telnet localhost ; exit

ssh 명령어 수행

# ssh localhost ; exit

 

 

메일 로그 기록

# grep mail /etc/syslog.conf

# tail -f /var/log/maillog

[TERM2]

# mailx user01

test

.

Cc: <ENTER>

 

크론(cron) 로그 기록

# grep cron /etc/syslog.conf

# tail -f /var/log/cron

Mar 23 04:07:30 linuxXXX crontab[6971]: (root) BEGIN EDIT (root) <----- crontab -e

Mar 23 04:07:43 linuxXXX crontab[6971]: (root) REPLACE (root)

Mar 23 04:07:43 linuxXXX crontab[6971]: (root) END EDIT (root)

Mar 23 04:07:53 linuxXXX crontab[6986]: (root) LIST (root) <----- crontab -l

Mar 23 04:08:01 linuxXXX crond[4318]: (root) RELOAD (cron/root)

Mar 23 04:08:01 linuxXXX crond[6988]: (root) CMD (/bin/date >> /tmp/date.log)<--- crontab 정기작업 수행

Mar 23 04:09:01 linuxXXX crond[7022]: (root) CMD (/bin/date >> /tmp/date.log)

Mar 23 04:10:01 linuxXXX crond[7054]: (root) CMD (/bin/date >> /tmp/date.log)

..... (중략) .....

Mar 23 04:10:54 linuxXXX crontab[7087]: (root) DELETE (root) <----- crontab -r

 

[TERM2] crontab 명령어 수행

# crontab -e

# crontab -l

# crontab -r

 

** 새로운 로그 파일 생성

# vi /etc/syslog.conf

..... (중략) .....

#

# INN

#

news.=crit /var/log/news/news.crit

news.=err /var/log/news/news.err

news.notice /var/log/news/news.notice

 

#

# Syslog Test

#

local0.notice /var/log/file.log   <-- 내용 추가

 

로그 파일 생성

# touch /var/log/file.log

# chmod 600 /var/log/file.log

# ls -l /var/log/file.log

 

서비스 적용

# service syslog restart

 

로그 파일 모니터링

# tail -f /var/log/file.log

Mar 23 04:24:03 linuxXXX root: Notice Messages(linuxXXX)

Mar 23 04:25:26 linuxXXX root: Critical Messages(linuxXXX)

 

Mar 23 04:24:03            메세지 생성 시간

linuxXXX                   메세지 생성 서버

root:                      메세지 생성 주체

Notice Messages(linuxXXX)  메세지

 

메세지 생성

[TERM2]

# logger -p local0.notice "Notice Messages(Linux)"

# logger -p local0.crit "Critical Messages(Linux)"

 

/etc/syslog.conf 파일 편집

# vi /etc/syslog.conf

..... (중략) .....

#

# INN

#

news.=crit /var/log/news/news.crit

news.=err /var/log/news/news.err

news.notice /var/log/news/news.notice

 

#

# Syslog Test

#

local0.notice       /var/log/file.log  

local1.=notice      /var/log/file1.log    <-- 내용 추가

위 작업 반복

# touch /var/log/file1.log

# chmod 600 /var/log/file1.log

 

# service syslog restart

# tail -f /var/log/file1.log

 

# logger -p local1.notice "Notices Messages"

# logger -p local1.crit "Critical Messages"

-> 메세지가 남겨지지는 않는다.

-> /var/log/messages 파일안에 내용을 확인해보자.

 

 

(정리) 로그 생성

 

() 기본 로그 체계를 사용하는 경우

- /var/log/secure

- /var/log/maillog

- /var/log/cron

() 새로운 로그를 생성하는 경우

- syslogd 체계를 사용하는 경우

- 스크립트 내에서 직접 생성하는 경우

() 원격 로그 서버 구축

 

 

[참고] 로그 서버 구축

여러대의 서버를 관리하는 경우 각 서버의 로그 기록을 각각 확인하고 관리하는 방법은 많은 시간을 소비하는 작업이 된다.

따라서, 여러대의 서버에 쌓이는 로그 기록을 한대의 로그 서버로 전송할 수 있다.

 

HOSTA 서버에서는 자신의 서버에서 생성되는 local0.notice 이상의 메세지를을 HOSTB 서버로 넘기는 설정을 하고

HOSTB 서버에서는 이 넘겨진 메세지를 /var/log/file.log 파일에 남도록 설정한다.

 

@HOSTA Server

/etc/syslog.conf 파일 편집

# vi /etc/syslog.conf

 local0.notice       @172.16.9.252

local1.=notice       /var/log/file1.log

HOSTB 서버를 입력한다.

 

/etc/sysconfig/syslog 파일 편집 (Log Server 쪽에서 설정하는 파일)

# vi /etc/sysconfig/syslog

# Options to syslogd

# -m 0 disables 'MARK' messages.

# -r enables logging from remote machines

# -x disables DNS lookups on messages recieved with -r

# See syslogd(8) for more details

SYSLOGD_OPTIONS="-r -m 0" <----- '-r' 옵션 추가

# Options to klogd

# -2 prints all kernel oops messages twice; once for klogd to decode, and

# once for processing with 'ksymoops'

# -x disables all klogd processing of oops messages entirely

# See klogd(8) for more details

KLOGD_OPTIONS="-x"

#

SYSLOG_UMASK=077

# set this to a umask value to use for all log files as in umask(1).

# By default, all permissions are removed for "group" and "other". 

-> 리눅스 시스템은 기본적으로 시스템 로그 메세지를 외부로 보내질 못한다.

-> 따라서, 설정이 별도로 필요하다.

-> /etc/sysconfig/syslog 설정은 로그서버(EX:172.16.9.252) 서버에서 수행이 되어 있어야 한다.

-> 실습시에서는 모든 서버에서 수행한다.

 

서비스 적용 및 확인

# service syslog restart

# pgrep -lf syslogd

# logger -p local0.notice "Notice..."

 

@HOSTB Server

# tail -f /var/log/file.log

 

 

[참고] 백업 로그를 생성하는 방법

 

백업 로그를 생성하는 방법

 

백업 스크립트의 로그 파일 생성 방법

() 리다이렉션 기호를 사용하는 경우

# /root/bin/backup.sh > /var/log/backup.log 2>&1

 

() 백업 스크립안에 구문을 사용하는 경우

# vi /root/bin/backup.sh

--------------------------------------

#!/bin/bash

exec 1> /var/log/backup.log 2>&1

.......

 

--------------------------------------

 

실습 준비

 

/home/* --- backup.sh ---> /backup/backup_0830.tar.gz

 

/home : 백업 받을 디렉토리

/backup : 백업 파일이 생성되는 디렉토리

/root/bin/backup.sh : 백업 스크립트

 

# mkdir -p /backup

# mkdir -p /root/bin

# vi /root/bin/backup.sh

----------------------------------------------

#!/bin/bash

 

cd /home

tar cvzf /backup/backup_`date +%m%d`.tar.gz .

----------------------------------------------

 

# chmod 700 /root/bin/backup.sh

 

백업 스크립트 동작 확인

# /root/bin/backup.sh

-> 출력 내용 생략

 

# ls -l /backup

-> backup_0830.tar.gz (# tar tvzf /backup/backup_0830.tar.gz)

 

백업스크립트 실행시 백업 로그 생성

# /root/bin/backup.sh > /var/log/backup.log 2>&1

# cat /var/log/backup.log

-> 출력 내용 생략

 

백업 스크립트에 기능 추가 및 확인

백업 스크립트에 추가되는 기능(백업 시작 시간과 백업 종료 시간 기록)

 

# vi /root/bin/backup2.sh

---------------------------------------------------

#!/bin/bash

 

echo >> /var/log/backup.log

echo >> /var/log/backup.log

 

echo "===== Backup START : `date` ===========" >> /var/log/backup.log

 

/root/bin/backup.sh >> /var/log/backup.log 2>&1

 

echo "===== Backup STOP : `date` ===========" >> /var/log/backup.log

 

---------------------------------------------------

 

# chmod 700 /root/bin/backup2.sh

 

# > /var/log/backup.log

# /root/bin/backup2.sh

#

 

# more /var/log/backup.log

-> 출력 내용 생략

 

# /root/bin/backup2.sh

# more /var/log/backup.log

-> 출력 내용 생략

 

# vi /root/bin/backup.sh

----------------------------------------------

#!/bin/bash

 

cd /home

zztar cvzf /backup/backup.`date +%m%d`.tar.gz .

 

----------------------------------------------

 

# /root/bin/backup2.sh

# cat /var/log/backup.log

-> 출력 내용 생략

 

백업 스크립트에 기능 추가 및 확인

백업 스크립트에 추가되는 기능(백업 성공 유/무 기록)

 

# vi /root/bin/backup2.sh

---------------------------------------------------

#!/bin/bash

 

echo >> /var/log/backup.log

echo >> /var/log/backup.log

 

echo "===== Backup START : `date` ===========" >> /var/log/backup.log

 

/root/bin/backup.sh >/dev/null 2>&1

if [ $? -eq 0 ] ; then

echo "Backup : [ O K ]" >> /var/log/backup.log

else

echo "Backup : [ FAIL ]" >> /var/log/backup.log

fi

 

echo "===== Backup STOP : `date` ===========" >> /var/log/backup.log

 

---------------------------------------------------

 

# /root/bin/backup2.sh

# cat /var/log/backup.log

-> 출력 내용 생략

 

백업 스크립트에 기능 추가 및 확인

백업 스크립트에 추가되는 기능(logger CMD + syslogd 연동)

 

# vi /root/bin/backup2.sh

---------------------------------------------------

#!/bin/bash

 

echo >> /var/log/backup.log

 

echo "===== Backup START : `date` ===========" >> /var/log/backup.log

 

/root/bin/backup.sh >/dev/null 2>&1

if [ $? -eq 0 ] ; then

logger -p local0.notice "Backup [ O K ]"

else

logger -p local0.warn "Backup [ FAIL ]"

fi

 

echo "===== Backup STOP : `date` ===========" >> /var/log/backup.log

 

---------------------------------------------------

 

# /root/bin/backup2.sh

# cat /var/log/file.log

-> 출력 내용 생략

 

 

완성된 백업 스크립트

 

# vi /root/bin/backup2.sh

---------------------------------------------------

#!/bin/bash

 

LOG_FILE=/var/log/backup.log

echo >> $LOG_FILE

 

echo "===== Backup START : `date` ===========" >> $LOG_FILE

 

/root/bin/backup.sh >>/dev/null 2>&1

if [ $? -eq 0 ] ; then

echo "Backup [ O K ]" >> $LOG_FILE

else

echo "Backup [ FAIL ]" >> $LOG_FILE

fi

 

echo "===== Backup STOP : `date` ===========" >> $LOG_FILE

 

---------------------------------------------------

 

crontab 등록한 예

# crontab -e

* * * * * /root/bin/backup2.sh /* 실습용 구문 */

0 1 * * * /root/bin/backup2.sh /* 실무용 구문 */

 

(복원) # crontab -r 

 

 

06. 로그 파일 관리

 

로그 로테이션(Log Rotation)

/var/log 디렉터리 안에 있는 많은 로그파일은 기존의 파일에 첨가되는 형태로 기록되기 때문에 그냥 두게 되면 크기는

계속 커지게 된다. 그럼 관리하기 힘들고, 로그 파일 안에서 검색하는 속도도 떨어지게 된다. 이를 방지하기 위해서

로그 파일을 정기적으로 조각으로 나누어야 한다. 이런 작업을 하는 프로그램으로 logrotate 명령어가 있다.

 

# cat /etc/logrotate.conf

# see "man logrotate" for details

# rotate log files weekly

weekly

특별히 명시하지 않은 로그 파일에 대해서는 일주일(weekly)마다 rotate 한다.

 

# keep 4 weeks worth of backlogs

rotate 4

최대 4번까지 rotate를 허용한다.(EX: logfile, logfile.1, logfile.2, logfile.3, logfile.4)

 

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

create

로그 파일을 rotate 한 후에 비어 있는 로그 파일을 생성한다.

 

# uncomment this if you want your log files compressed

#compress

로그 파일을 압축하는 옵션이다. 기본값은 활성화 되어 있지 않다. 용량 문제에 지장이 없다면 압축하지 않을 것을 권장한다.

 

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

대부분의 RPM 패키지로 설치되는 데몬들은 이 디렉토리에 로그 파일 정책 파일이 생성된다. 각각의 로그 파일을 rotate 시킬수 있도록 하는 설정이다.

# no packages own wtmp -- we'll rotate them here

/var/log/wtmp {

monthly

minsize 1M

create 0664 root utmp

rotate 1

}

로그 파일(wtmp)은 어떤 패키지에 의해서도 설정되지 않기 때문에 따로 설정한다. 다른 로그 파일들은 /etc/logrotate.d 내의 파일들에 모두 각각 설정하고 있다. 한달마다 rotate 하며, 최대 1회까지만 rotate 한다. 관련 파일인 /var/log/utmp 파일을 664 퍼미션을 가지고 소유자는 root로 생성한다.

 

# system-specific logs may be also be configured here.

시스템에서 특별하게 지정하고 싶은 로그 파일들이 있다면 여기에 정의한다.

/var/log/lastlog {

monthly

rotate 3

}

한달마다 rotate 하며 최대 3회가지 rotate 한다.

 

# cd /etc/logrotate.d

# ls

 

# cat syslog

 

# ls -l /var/log/messages*

# ls -l /var/log/secure*

# ls -l /var/log/boot.log*

 

오래된 로그 삭제

로그 파일이름이 고정되어 있는 경우 /var/log/messages, /var/log/server.log

로그 파일이름이 고정되어 있지 않은 경우 /var/log/server_1020.log

 

실무에서 사용하는 로그 파일 포맷 Server_1020.log (10월20일 로그파일)

# find / -name core -type f

# find / -user user01 -group user01

# find / -mtime [-7|7|+7]

# find / -size [-10M|10M|+10M]

# find / -perm [-755|755]

# find / -name core -type f -exec rm {} \;

 

# find /Log_Dir -name "*.log" -type f -mtime +30 -exec rm -f {} \;

정상적으로 동작하는 명령어

 

/Log_dir ----- server_0101.log

   server_0102.log
   server_0103.log

# crontab -e

0    3    1       *    *     find /Log_dir1 -name "*.log" -type f -mtime +30 -exec rm -f {} \;

매월 1일 3시 정각 /Log_dir 안의 로그 파일들을 최근 30일 로그만 남기고 모두 삭제한다.