posted by 구름너머 2012. 12. 27. 18:05

Practically Useful UNIX Security Administration
김휘강 (Sakai Kim) sakai@major.kaist.ac.kr

http://cafe.naver.com/define/82

 

======================================================================================
 

Contents


General Security Administration II 부(지난 호)


Process 관리, 감시법


General Security Administration III 부(이번 호)


시스템의 로그 관리 및 분석법.

이번호에서는 지난호에 이어 General Security Administration 중 System log file Management , 에 대해 다루겠다. 이번 호에서 중점적으로 다룰 내용은 시스템에 존재하는 로그화일들을 분석하고 문제점을 발견하는 법, 이를 통해서 해커가 침입을 했는지 유무를 구분해 내고 추적하는 법에 대해 살펴보도록 하겠다.

 


General Security(로그분석)
1. 로그화일들
시스템 내부에는 어떠한 로그화일들이 생기는가? 물론 구동시키고 있는 프로그램이나 daemon 에 따라 더 많이 존재할 수도 있고, 덜 존재할 수도 있지만, 일반적으로 다음과 같은 로그화일들이 존재하고 있다.

 


sulog - su 명령어 관련 기록


.history - 사용자 히스토리 화일


utmp - 현재 사용자 리스트.


wtmp - 로긴, reboot 정보.


lastlog - 사용자 최종 로긴 정보.


pacct - 사용자 명령 정보.


messages - 커널 에러, 리부팅 메시지.


syslog - 메일 디버깅 정보.


 

각각에 대해 자세히 살펴보기로 하자.

1.1. sulog
모든 UNIX 시스템에서는 superuser 가 되는 시도를 logging (메시지를 화일로 저장해 기록하는 것) 하도록 구현되어 있다. 이러한 로그화일들은 누가 superuser 가 되었는지 조사할 수 있는 자료가 되기 때문에 아주 유용하다.

superuser 가 되는 명령어로 su 가 있고, su에 대한 log 화일인 sulog 는 다음의 디렉토리에 보관이 되게 된다.

  


SCO UNIX , Solaris

/etc/default/su 화일에 SULOG 화일의 위치를 지정해 줄 수 있음


AIX

/var/adm/sulog


Digital UNIX

/var/adm/sialog


HP-UX 9.x

/usr/adm/sulog


HP-UX 10.x , IRIX

/var/adm/sulog


SunOS

Syslog facility 를 사용하여 메시지를 남기게 된다.


Linux

/etc/login.defs 에서 SULOG 화일의 위치를 지정해 줄 수 있음.


sudo 를 사용하는 경우

/var/adm/sudo.log 에 저장이 된다.


 

su 는 또한 argument 를 주어 su username 을 하면 username 으로 로긴할 수 있으므로 sulog 에는 root 로 su 한 것 외에도 다른 유저로 su 를 실행시킨 결과까지 logging 이 되고 있다.

다음은 그 화일의 내용이다. 다음의 형태로 저장이 된다.

SU 날짜 시간 성공유무(+/-) tty fromID-toID

SU 04/18 18:41 + ttypb guard-wkshin
SU 04/18 18:44 + ttypb guard-wjshin
SU 04/19 00:50 + ttyp2 chester-guard
SU 04/19 06:27 + ttyp1 sakai-root
SU 04/19 06:29 + ttyp1 sakai-root
SU 04/19 06:29 + ttyp1 sakai-root
SU 04/19 06:32 + ttyp1 sakai-root


 

위의 화일을 보면 sakai 란 사용자가 root 로 4/19 일 6:32 분에 ttyp1 에서 su 를 했음을 알 수 있다.

1.2. .history
% history
1 12:06 ls
2 12:06 clear
3 12:06 finger
4 12:06 cd /usr
5 12:07 bdf
6 12:07 cd /users
7 12:07 cd syscore
8 12:07 ls -asl
9 12:07 vi bounds
% cat .history
ls
clear
finger
cd /usr
bdf
cd /users
cd syscore
ls -asl
vi bounds


 

history 는 사용자가 어떠한 명령을 실행시켰는가를 보여주는 명령이고, 이명령에 대한 로그화일은 홈디렉토리의 .history 화일이다. 이 화일은 단순히 shell 의 history 관련 명령이나 history control 을 위해 있는 것은 아니다.

해커의 침입이 있을 때 root 의 상태에서 어떠한 명령을 내렸는지 알수도 있는 것이다. 하지만 해커가 어떠한 사용자의 account 로 침입을 했다면, 작업을 하고 난 뒤, 증거를 없애기 위해

% set history=0

등과 같은 명령을 수행하여 기록된 history 를 없애는 것이 보통이므로 그다지 큰 기대를 하긴 어렵지만, 해커가 실수로 저 명령을 수행하지 않았을 수도 있으니 관심을 가질 필요는 있다고 생각한다.

.cshrc , .login 과 같은 startup 화일에서 history 를 보관하도록 지정해 두는 것이 좋다.


csh 계열 사용자인 경우

set history = 100

set savehist = 100


ksh 계열 사용자

export HISTSIZE = 100

export HISTFILE= /var/adm/.rh


1.3. utmp
utmp 는 현재 사용자의 리스트를 저장하는 화일이다. w, who 와 같은 명령을 통해 현재 사용자 상황을 파악할 수 있다. 보통 /etc/utmp 나 /var/adm/utmp 로 저장이 된다.

1.4. wtmp
wtmp 는 utmp 와 같은 data structure 를 사용하고 있는데, 주로 login 이나 reboot 와 관련된 정보를 담고 있다. 보통 /etc/wtmp 나 /var/adm/wtmp 로 저장이 된다.

1.5. lastlog
lastlog 는 사용자가 마지막으로 로긴한 것은 언제인지에 대한 정보가 저장이 된다. 보통 lastlog 는 /var/adm/lastlog 로 저장이 되고, AIX 의 경우에는 /etc/security 디렉토리에 저장이 된다.

last명령을 통해서 lastlog, wtmp 에 대한 정보를 볼 수 있는데 ,argument 로 keyword 를 주어 해당사항만 볼 수 있는 장점이 있다. 다음은 그 예이다.

$ last
sakai pts/14 A.miso.co.kr Fri Nov 8 15:05 계속 로그인 중
vector console Fri Nov 8 14:05 - 14:22 (00:16)
gangster pts/13 B.miso.co.kr Fri Nov 8 13:15 - 13:24 (00:09)
jahng ftp night Fri Nov 8 13:03 - 13:08 (00:04)
$ last console
root console Mon Apr 21 12:07 - 12:08 (00:00)
w3master console Mon Apr 21 12:06 - 12:07 (00:00)
root console Mon Apr 21 11:48 - 11:59 (00:10)
root console Mon Apr 21 11:23 - 11:37 (00:13)
root console Mon Apr 21 11:12 - 11:22 (00:09)
$ last reboot
reboot system boot Fri Apr 18 22:15
reboot system boot Thu Apr 17 09:19
reboot system boot Thu Apr 17 00:17
reboot system boot Wed Apr 9 20:43
$ last sakai -3
sakai pts/12 eve.kaist.ac.kr Fri Nov 8 12:51 계속 로그인 중
sakai pts/0 cspc15.kaist.ac. Fri Nov 8 12:25 계속 로그인 중
sakai pts/0 cspc15.kaist.ac. Fri Nov 8 12:00 - 12:23 (00:22)
.login 에 last login 로긴시마다 last -3 을 이용하여 침입당했는지 점검하는 것도 좋은 방법이다.


1.6. pacct
모든 사용자가 로긴한 후 로그아웃할 때가지 입력한 command 와 시간, 작동된 tty 등을 저장한다. 하지만 로그화일의 사이즈가 쉽게 증가하여 시스템의 리소스를 많이 차지하므로 대부분의 시스템에서는 이를 logging 하고 있지 않으나, logging 한다면 시스템에 문제가 생겼을 때 hacker 를 추적하고, 이 hacker 가 무슨 작업을 했는지를 쉽게 알 수 있게 된다. 단, command 의 argument 로 무엇을 입력하였는지까지는 로그가 남지 않는 단점이 있다.

보통 /var/adm/pacct 에 위치한다.

관련된 명령어로는 lastcomm, acctcom, acctcms 가 있다. 이에 대해 자세히 살펴보도록 하자.


lastcomm

lastcomm 은 SCO UNIX 와 IRIX 를 제외한 모든 UNIX 시스템에서 제공되는 명령이다. 실행되었던 모든 명령을 기본적으로 보여주게 된다. 다음은 실행 예이다.

# lastcomm
lpd F root ___ 0.08 secs Mon Sep 19 15:06
date sakai ttyp7 0.02 secs Mon Sep 19 15:06
sh cenda ttyp3 0.05 secs Mon Sep 19 15:04
calculus D mtdog ttyq8 0.95 secs Mon Sep 19 15:09
more X urd ttypf 0.14 secs Mon Sep 19 15:03
mail S root ttyp0 0.95 secs Mon Sep 19 15:03
로그는 다음과 같은 형식으로 남는다.

process 를 수행한 명령어, 데몬 : Flag : ID : tty : CPU time : 시작한 시간이 Flag 에는 다음과 같은 것이 있다.


S : Superuser 가 사용한 명령


F : fork 후에 사용된 명령


D : core 를 덤프하고 종료된 명령


X : Signal 에 의해 종료된 명령

즉 위의 log 를 보면, lpd 는 init process 에 의해 fork 되었으므로 F flag 을 가지게 되고, root 가 실행시켰으며 daemon process 이므로 잡고 있는 tty 는 없다는 것을 알 수 있다.

명령도, last 명령과 비슷하게 keyword 를 주어 정보를 얻을 수 있다.

# lastcomm mtdog
calculus D mtdog ttyq8 0.95 secs Mon Sep 19 15:09


 

lastcomm 과 비슷한 역할을 하는 명령으로 acctcom, acctcms 이 있다. 이에 대해 살펴보도록 하자.


acctcom

acctcom 은 System V 계열에서 제공되는 명령어이다. (Linux 에서는 포함이 되어 있지 않다.) 다음은 실행 예이다.

# acctcom
COMMAND START END CPU
NAME USER TTYNAME TIME TIME (SECS)
calculus mtdog ttyq8 15:52:49 16:12:23 0.95
grep sakai ttyq3 15:52:51 15:52:55 0.02


 

명령을 통해 실행시킨 command 이름, 사용자, tty , 시작시간, 종료시간, CPU time 등을 알 수 있다. 또한 옵션을 주어 필요한 정보를 얻어낼 수 있다.

# acctcom -u root -n vi
COMMAND START END CPU
NAME USER TTYNAME TIME TIME (SECS)
vi root tty01 10:33:12 10:37:44 0.04


acctcom 명령에 단점이 있다면 명령이 실행된 date 가 나오지 않아 /usr/adm/pacct 화일과 대조를 해보아야 한다는 점이다.

 


acctcms

이 프로그램 역시 System V 계열에서 제공되는 명령어 이다.( 역시 Linux 에는 포함되어 있지 않다.) 이 명령을 통해서 주로 실행된 명령어의 통계적 분석을 할 수 있는 장점이 있다.다음은 그 실행 예이다.

 

# acctcms -a -o -n /var/adm/pacct
NON-PRIME TIME COMMAND SUMMARY
COMMAND NUMBER TOTAL TOTAL
NAME CMDS KCOREMIN CPU-MIN
Ls 26 0.00 0.02
Grep 21 0.80 0.01
More 15 0.10 0.03
...............
fuckfuck 1 0.26 1.10


위의 실행결과를 살펴보면 fuckfuck 이란 명령은 자세히 조사해야 할 필요가 있음을 알 수 있다. 사용빈도도 1 일뿐 아니라 , 해당 커맨드의 이름이 OS 에 없는 명령이기 때문이다.

1.7. messages
보통 /var/adm/messages 로 저장이 되며 커널 에러, 리부팅 메시지, 로긴 실패, su 로그 등이 남는 화일이다. 다음은 그 예이다.

 

% cat /var/adm/messages
Apr 19 12:44:13 miso named[93]: zoneref: Masters for secondary zone 15.104.192.in-addr.arpa unreachable
Apr 19 12:45:23 miso telnetd[22005]: gethostbyaddr: librb126.kaist.ac.kr != 143.248.8.126
Apr 19 12:46:57 miso login: REPEATED LOGIN FAILURES ON ttype FROM sgs115.kaist.ac., x
Apr 19 16:18:08 miso vmunix: /: file system full
Apr 19 16:18:38 miso su: 'su soyeon' succeeded for acorn on /dev/ttyq5


1.8. syslog
위에서도 살펴 보았지만, 시스템 내에는 수많은 로그화일이 이곳저곳에 남게 된다. 이를 전체적으로 관리를 할 필요가 있는데 즉, 메시지들의 분산을 해결한 것이 syslog facility 이다.

log 화일이 저장되는 위치는 /etc/syslog.conf 에서 지정할 수 있다.

/etc/syslog.conf 에서 다음과 같은 내용을 정의할 수 있다. (단, DG-UX 의 경우에는 syslog 의 configuration 화일은 /var/adm/sysyslog.dated/auth.log 에 위치한다. 또한 IRIX 의 경우에는 syslog.conf 가 다른 OS 들의 것에 비해 기능이 확장되어 filtering 을 할 program 을 각 항목마다 지정해 줄 수 있다.

다음은 IRIX 에서의 syslog.conf 의 예이다.

*.alert |/var/adm/sysmonpp /var/adm/SYSLOG

Linux 의 경우에는 klogd 를 syslogd 대신에 사용한다.)

syslog.conf 는 다음과 같은 형태로 저장이 된다.

facility.level destination

facility 는 로그정보를 요청한 프로그램 종류로 구분지어지는데 다음과 같다.

kern (kernel 에서 요청한 경우)

mail (mail subsystem 에서 요청한 경우)

lpr (printing subsystem 에서 요청한 경우)

daemon (System server processes 에서 요청한 경우)

auth (login authentication system 에서 요청한 경우)


level 은 severity level 를 의미하는데 다음과 같은 단계로 구분지을 수 있다.

심각한 정도는 emerg > alert > crit > err > warn > notice > info > debug 순이다.

 

emerg (System 이 "panic" 을 일으킬 정도로 심각(emergency)한 상황)
alert (즉시 주의를 요하는 serious 한 에러가 발생한 경우)
crit (하드웨어 같은 device 족에서 critical 한 에러가 발생한 경우)
err (Errors , 에러들)
warn (Warning, 경고들)
notice (critical 하진 않은 메시지들)
info (유용한 정보를 담고 있는 메시지들)
debug (문제해결을 할 때 도움이 될만한 외부정보들)
none (facility 에서 무시하는 정보들)
mark (몇분마다 메시지들을 생성할 것인지를 결정한다. 디폴트 값은 20 분이다.)


mark (몇분마다 메시지들을 생성할 것인지를 결정한다. 디폴트 값은 20 분이다.)

주의할 점은 mart 를 제외한 나머지 level 들은 *.alert , *.debug 등과 같이 facility 를 wild card 를 사용하여 나타낼 수 있지만, mark 의 경우에는 wild card 를 사용할 수 없다는 것이다.

다음은 /etc/syslog.conf 의 예이다. 예제 화일을 보면 위에 설명한 내용들이 쉽게 이해가 갈 것이다.

*.err /dev/console
*.err;daemon,auth.notice;mail.crit /var/adm/messages
lpr.debug /var/adm/lpd-errs
mail.debug /var/spool/mqueue/syslog
*.alert root
*.emerg root,sysadmins, operators
auth.info;*.warn @hamlet
*.debug /dev/tty01


위의 예는 다음과 같은 뜻이다.


모든 facility 에서 발생한 err 메시지들은 /dev/console 에 뿌려준다.


모든 facility 에서 발생한 에러 메시지, daemon 과 auth facility 에서 발생한 notice 메시지들, mail facility 에서 발생한 crit 메시지들은 /var/adm/messages 에저장한다.


lpr facility 에서 발생한 debug 메시지들은 /var/adm/lpd-errs 에 저장한다.


mail facility 에서 발생한 debug 메시지들은 /var/spool/mqueue/syslog 화일에 저장한다.


모든 facility 에서 발생한 alert 메시지들은 root 에게 메일로 전송한다.


모든 facility 에서 발생한 emerg 메시지들은 root, sysadmins, operators 에게 메일로 전송한다.


auth facility 에서 발생한 info 메시지들과 모든 facility 에서 발생한 warn 메시지들은 hamlet 이란 호스트에 로그를 남긴다.


모든 facility 에서 발생한 debug 메시지들은 /dev/tty01 에 뿌려준다.


2. 로그화일 점검하기
앞에서는 로그화일 들의 의미가 무엇이고, 어떠한 사항들이 어떠한 로그화일에 남는다는 것을 살펴보았다.

즉, 로그화일은 시스템 내에 있었던 일들, 문제가 될만한 사항등을 기록으로 남겨주기 때문에 중요한 자료인 것이다. 이를 통해 시스템이 crash 되었을 때 디버그 할 수 있게 되는 것이고, 또한 시스템에 해커가 침입했는지, 또 침입한 후에 무슨 일을 했는지를 알 수 있는 근거가 되는 것이다. 하지만 해커도 바보가 아닌 이상 머리를 쓴다.

호스트에 침입한 후, 자신과 관계되는 로그화일을 전부 지우거나, 편집해서 자신에 대한 기록을 모두 지우고 나가는 것이 보통이다. 가령 telnet 을 통해 침입했다면 messages, utmp , wtmp 등을 지우려 할 것이고, 로그아웃하기 전에 set history=0 등과 같은 명령을 실행하고, pacct 화일을 삭제하여 수행한 명령에 대한 기록을 지울 것이다.

이런 식으로 특정 ID 에 대한 로그들을 모두 지워주는 프로그램도 해커들 사이에 유통이 되고 있다. 그 예로 wtmp , lastlog 와 같은 화일에서 자신의 기록을 지우는 프로그램으로 zap.c , zap2.c 등이 있고, 이는 anonymous ftp site 에도 공개되어 있을 정도이다.

또한 들어와서 수행시키는 명령도 가급적 정보를 남기지 않으려 노력할 것이다.

ftp 를 통해 화일을 전송시켰다면 프롬프트상에서는 ftp -n 을 입력해 history file 이나 pacct 화일에서는 어느곳으로 접속을 시도했는지 모르도록 할 것이고 , 원래 OS 에서 제공하는 프로그램의 이름이 아닌 다른 이름으로 aliasing 을 하여 명령을 수행하는 것이 보통이다.

결론적으로 말해 아무리 log 를 강력하게 남겨도 ,해커는 강력하게 지우고 간다는 점을 잊지 말라는 것이다. 그렇기 때문에 정기적으로 로그 화일을 점검,분석하는 것이 요구된다는 것과 또한 로그화일들에 대한 백업이 중요하다.

그렇다고 절망적인 것은 아니다. lastlog , pacct , wtmp 는 고유한 data structure 를 사용하는 non-text 화일이기 때문에, 해커가 자신의 정보를 삭제하였다면 화일에서 삭제한 부분에 공백이 생기게 되어 이를 통해 로그화일이 해커에 의해 변조되었는지 유무를 파악할 수 있다.

이런 일을 하는 툴에는 다음과 같은 것이 있다. 이 프로그램들은 DFN-CERT 에서 개발된 툴들이다.

chkacct 의 경우 dot 화일들(e.g. .rhosts )까지 점검을 하게 된다.


chkacct

ftp://ftp.kreonet.re.kr/pub/security/tools/etc/chkacct


chklastlog

ftp://ftp.kreonet.re.kr/pub/security/tools/etc/chklastlog


chkwtmp

ftp://ftp.kreonet.re.kr/pub/security/tools/etc/chkwtmp


다음은 위의 프로그램들의 실행 예이다.

% chklastlog
user ley deleted from lastlog!
% chkwtmp
1 deletion(s) between Thu Sep 29 08:23:57 1994 and Thu Sep 29 14:11:58 1994


이런 부수적인 툴 외에도 OS 자체에서 제공하는 명령을 이용하여 log 화일들을 점검해 줄 수 있다.

AIX 의 경우 /etc/security/ 에 다양한 종류의 로그화일들을 생성시키는데 다음은 user 에 기록된 자료를 조사하는 예이다.

이를 통해 사용자들의 실패한 로긴의 횟수를 파악할 수 있다. 실패한 로긴수가 많은 사용자의 경우 적절한 조치를 취하면 된다.

 

# egrep '^[^*].*:$|gin_coun' /etc/security/user |\
awk {if (NF >1 && $3>3) {print s,$0}} ;\
NF==1 {s=$0}'
sakai: unsuccessful_login_count = 27


위의 명령과 같은 역할을 해주는 명령어도 다른 OS 에서 존재한다.

Linux 의 경우 shadow 패키지를 설치한 경우 /var/adm/faillog 란 화일에 로그인 실패한 경우를 기록하게 된다. 관련된 명령어로는 faillog 가 있다.

# faillog -p
Username Failures Maximum Latest
root 2 0 Fri Mar 17 17:4..
sakai 5 0 Fri Mar...


3. 맺으며
단순한 로그화일 분석에 너무 지면을 할애한 건 아닌지 모르겠다. 하지만 로그화일 분석은 상당히 중요한 보안의 한 부분이라는 점을 잊지 말기 바란다.


General Security Administration IV 부 (다음 호)


다음호에서는 File System 에 대한 관리를 보안에 관련지어 다루어 보겠다.

(footnote)

# 는 root shell 프롬프트를 뜻한다.

$ 은 일반 사용자의 borne shell 계열 쉘 프롬프트를 뜻한다.

% 는 일반 사용자의 C shell 계열 쉘 프롬프트를 뜻한다.


 

Reference


System Administration, O'Reilly & Assoiates, Inc.


[General Security Technique - Practically Useful], 김휘강, 제 4 회 WWW-KR Conference