Practically Useful UNIX Security Administration
김휘강 (Sakai Kim)sakai@major.kaist.ac.kr
Contents
General Security Administration I 부 (지난 호)
개요
password 에 관련된 Secure Administration
General Security Administration II 부 (이번 호)
Process 관리, 감시법
이번 호에서는 지난 호에 이어 General Security Administration 중 System Security 에 대해 다루겠다.
이번 호에서 중점적으로 다룰 내용은 Process 를 관리하고 이상한 프로세스를 찾아내어 조사하는 방법, 그리고 security 에 있어 tracing 을 할 때 절대적으로 요구되는 중요한 로그화일 에는 어떤 것이 있는지를 살펴보고 이 로그 파일을 어떤 식으로 분석해야 하는지에 대해서 살펴보도록 하겠다.
I. General System Administration
1. Process Management & Monitoring
1) Process Management 이란? Process Monitoring 이란?
UNIX 시스템은 멀티유저 체계이기 때문에 System 의 Resource 를 서로 공유하면서 사용하고 있다. 그렇기 때문에 시스템의 부하량을 많이 잡아먹는 프로세스가 다른 유저에 의해 작동되고 있을 경우 다른 유저들은 그만큼 시스템의 리소스를 사용하지 못하게 되어 중요한 작업이 있는 경우에 피해를 볼 수 도 있다.
흔히 No More Process 나 all network port in use 따위의 메시지를 볼 수 있을 것이다. 중요한 일이 있을 때에 이러한 메시지를 보게 되면 짜증이 나게 되고, 다른 사용자들 중에 쓸데 없는 프로세스를 구동 시키고 있다면 프로세스를 kill 해주기를 바랄 것이다.
Process Management 란, 프로세스에 priority 를 할당하여 중요한 작업이 먼저 수행되도록 한다든가, 시스템 부하를 많이 잡는 프로세스를 프로세스의 소유주에게 양해를 구해 kill 한다든가, Zombie 가 된 프로세스가 끊임없이 CPU Time 을 잡고 있을 때 처리해 주는 것이나 사용자가 돌발적인 사태로 process 를 많이 띄워 놓은 상태에서 logout 되었을 때, Idling 상태로 있는 프로세스들 중 CPU Time 을 많이 잡고 있는 프로세스들을 처리해 주는 Administration 을 말한다.
Process Monitoring 은 Process Management 의 일부에 속하는 일인데, 성격이 약간 다르다. 이상한 프로세스( 예를 들어 OS 에서 제공하지 않는 명령어의 이름으로 시스템에 피해를 주는 작업을 하는 경우, 시스템 해킹과 관련된 프로세스) 들을 감지해 내어 이를 처리하는 것을 말한다.
Process Management 의 예
다음은 관리자가 시스템을 사용도중 갑자기 xload 의 그래프가 치솟으며 시스템이 현저하게 느려지는 것을 발견하고 처리를 하는 과정을 담은 예이다.
# uptime
2:17pm up 12 days, 21:25, 5 users, load average: 4.03 , 0.39, 0.21
# w
2:18pm up 12 days, 21:27, 5 user, load average: 4.04 , 0.32, 0.21
User tty login@ idle JCPU PCPU what
exit ttyp8 2:14pm -csh
sakai ttyp9 1:20pm -csh
....
# top
System: miso Tue Mar 25 14:20:06 1997
Load averages: 4.04, 0.37, 0.23
84 processes: 83 sleeping, 1 waiting
Cpu states:
CPU LOAD USER NICE SYS IDLE UNK5 UNK6 INTR SSYS
1 4.04 111.5% 0.0% -0.1% -11.4% -0.0% -0.0% -0.0% -0.0%
Memory: 14172K (2144K) real, 18596K (2612K) virtual, 3696K free Screen # 1/6
CCU TTY PID USERNAME PRI NI SIZE RESD STATE TIME %WCPU %CPU COMMAND
0 ? 14490 sakai 154 20 2008K 600K wait 0:00 10.20 9.90 a.out
0 ? 14459 sakai 154 20 1004K 552K sleep 0:41 7.15 7.13 hanterm
0 p3 14488 sakai 156 20 292K 296K sleep 0:23 2.23 2.22 screen
0 p6 14862 sakai 178 20 204K 232K wait 0:00 0.73 0.55 top
0 ? 3 root 128 20 0K 0K sleep 0:00 0.02 0.02 statdaem
0 ? 2 root 128 20 0K 0K sleep 0:00 0.02 0.02 vhand
0 ? 1 root 168 20 44K 36K sleep 0:02 0.02 0.02 init
시스템의 로드 수치가 상당히 큼을 느끼고, w , top 을 이용하여 현재 시스템에 어떠한 프로세스가 돌고 있는지를 살펴 보았더니 sakai 란 사용자가 실행시키고 있는 a.out 이란 프로그램에 문제가 있음을 발견했다.
그래서 양해를 구한다음 이 프로세스를 kill 하기로 했다.
# talk sakai
[Connection established...]
U r running an odd process now, your programming a.out is using most of system'
s resources, It can do harm another users.
so Could I kill your process a.out now?
-What's Up? root?
Oh, I got it ,
Don't mention it. You can kill my process.
Sorry for doing harm to system....
# kill -15 14490
# uptime
2:17pm up 12 days, 21:25, 5 users, load average: 1.03 , 0.39, 0.21
Process Monitoring 의 예.
어떤 관리자가 자신이 관리하는 시스템에서 패킷로스가 심하게 일어남을 발견하고 누군가 자신의 시스템 내부에서 /dev/le0 등을 모니터링 하거나 스니핑 하지는 않는지 의심하게 되었다. (참고로 스니핑을 하고 있는 동안에 많은 패킷로스가 일어날 수 있다.)
% ping -s localhost
PING localhost: 56 data bytes
64 bytes from localhost (127.0.0.1): icmp_seq=0. time=3. ms
64 bytes from localhost (127.0.0.1): icmp_seq=1. time=2. ms
64 bytes from localhost (127.0.0.1): icmp_seq=2. time=1. ms
64 bytes from localhost (127.0.0.1): icmp_seq=3. time=2. ms
64 bytes from localhost (127.0.0.1): icmp_seq=4. time=4. ms
64 bytes from localhost (127.0.0.1): icmp_seq=5. time=2. ms
64 bytes from localhost (127.0.0.1): icmp_seq=6. time=1. ms
64 bytes from localhost (127.0.0.1): icmp_seq=7. time=3. ms
......
64 bytes from localhost (127.0.0.1): icmp_seq=34. time=1. ms
----arirang.kaist.ac.kr PING Statistics----
34 packets transmitted, 22 packets received, 35% packet loss
round-trip (ms) min/avg/max = 1/2/3
% ifconfig -a
lo0: flags=849 mtu 8232
inet 127.0.0.1 netmask ff000000
le0: flags=863 mtu 1500
inet 203.251.173.1 netmask ffffff00 broadcast 143.248.8.255
sniffer는 Promiscuous mode에서 동작 하는 것임을 우리는 전번 호에서 살펴본 바 있다. 이제 ifconfig 를 통해 sniffer 가 돌고 있음을 발견했으니 이제는 그 프로세스를 찾아내어 kill 을 해야 한다.
그리고 root 의 권한으로 돌고 있는 프로세스들이 주로 위험한 경우가 많으므로 우선적으로 다음과 같은 명령을 사용하여 접근을 하도록 한다.
# ps -ef | grep root
를 통해 이상한 프로세스를 발견해 내도록 한다. 물론 어떠한 프로세스가 해커가 작동시키고 나간 프로세스인지는 신중을 기해 살펴보아야 할 것이다. 해커가 만일 sniff 프로그램을 설치하고 나갔다면 sniff 란 이름으로 설치했을 리 만무하기 때문이다. 시스템 내에서 흔히 돌고 있는 in.telnetd 나 in.uucpd 등의 이름으로 바꾸어 작동시키는 경우가 흔히 있다.
2) 본격적인 Process management & monitoring
우선 프로세스를 살펴보는 프로그램에는 다들 알고 있듯이 /bin/ps 가 있다. 그런데 여러 종류의 다른 OS 를 사용해 본 사람은 느끼겠지만, OS 마다 옵션이 조금씩 달라서 원하는 결과를 얻지 못하는 경우가 있었을 것이다. 자 이제 OS 마다의 ps 옵션들을 살펴보자.
ps 의 옵션은 크게 두 가지 종류로 나눌 수가 있다. BSD 계열의 시스템의 ps와 System V 계열의 시스템에서 사용하는 ps 이다.
먼저 BSD 계열을 살펴보자. 해당되는 OS 에는 SunOS 가 대표적인 예이나 AIX, SunOS , Linux , Digital UNIX , Solaris 에 있는 /usr/ucb/ps 도 BSD 의 ps 이다.
이 계열의 ps 에서 주로 사용되는 옵션에는 다음과 같은 것이 있다.
-ax : 시스템의 모든 프로세스들을 디스플레이 시킨다.
% ps -ax
PID TT S TIME COMMAND
0 ? T 0:00 sched
1 ? S 2:04 /etc/init -
2 ? S 0:12 pageout
3 ? S 85:46 fsflush
137 ? S 3:18 /sbin/gated
146 ? S 0:05 /usr/sbin/rpcbind
148 ? S 0:00 /usr/sbin/keyserv
154 ? S 0:00 /usr/sbin/kerbd
164 ? S 0:29 /usr/sbin/inetd -s
167 ? S 0:00 /usr/lib/nfs/statd
169 ? S 0:04 /usr/lib/nfs/lockd
191 ? S 0:01 /usr/lib/autofs/automountd
..........
-c : 실제의 명령어 이름을 표시한다.
% ps -c
PID TT S TIME COMMAND
25359 pts/40 S 0:00 tcsh
25460 pts/40 O 0:00 ps
-e : 명령어가 수행될 때 쓰인 환경 변수와 , 명령어를 같이 표시해 준다.
% ps -e
PID TT S TIME COMMAND
25359 pts/40 S 0:00 -tcsh TZ=ROK TERM=vt100 PATH=/usr/bin: HOME=/cosmos/use
25469 pts/40 O 0:00 ps -e TZ=ROK TERM=vt100 PATH=.:/cosmos/user/sakai:/usr/
-w : 다른 프로세스 옵션 뒤에 붙여서 Wide 포맷으로 디스플레이 시킨다.
% ps -axw
......
260 ? S 6:56 nmbd
269 ? S 0:57 /usr/local/etc/arns -i le0 -2 -z kaistCompSci -l /usr/lo
272 ? S 0:00 /bin/sh /usr/local/squid/bin/RunCache
276 ? S 82:25 squid -s
......
-ww : 명령어가 한 line 을 넘어가게 되면 ps 의 -w 옵션으로 살펴보아도 표시할 수 없는 경우가 있다. (시스템에 따라 다르다. 어떠한 시스템은 w 만 사용하여도 ww 와 같은 효과를 나타낸다.) 이 때 ww 를 중첩시켜서 사용하면 커맨드 전부를 살펴볼 수 있다.
% ps -axww
......
260 ? S 6:56 nmbd
269 ? S 0:57 /usr/local/etc/arns -i le0 -2 -z kaistCompSci -l
/usr/local/lib/cap/arns.log -f /usr/local/lib/cap/arns.fi
272 ? S 0:00 /bin/sh /usr/local/squid/bin/RunCache
276 ? S 82:25 squid -s
......
특히 e 옵션과 , ww 옵션 은 프로세스를 감시하고 관리하는데 아주 유용한 옵션들이니 기억하기 바란다.
다음으로 System V 계열을 살펴보자. System V 계열의 OS 에는 AIX, Digital UNIX, Solaris, HP-UX, IRIX, SCO UNIX 등이 있다.
전반적으로 BSD 계열의 ps 와 옵션이 같다. 이제 차이가 있는 옵션을 살펴보면 다음과 같다.
e : e 옵션은 BSD 의 환경변수를 보여주는 옵션이 아닌 시스템 내의 모든 프로세스를 디스플레이 시키는 옵션이다.
f : process 의 시작 시간부터 표시하여 full listing 을 시켜주는 옵션이다.
% ps -e
PID TTY TIME COMMAND
0 ? 0:13 swapper
1 ? 0:02 init
2 ? 0:00 vhand
3 ? 0:00 statdaemon
7 ? 0:00 unhashdaemon
10 ? 0:00 lvmkd
11 ? 0:00 lvmkd
12 ? 0:00 lvmkd
13 ? 0:00 lvmkd
6 ? 0:00 sockregd
1399 console 0:00 getty
185 ? 0:00 DIAGMON
75 ? 1:09 syncer
137 ? 0:00 cron
102 ? 0:00 rlbdaemon
83 ? 0:00 nktl_daemon
........
% ps -ef
UID PID PPID C STIME TTY TIME COMMAND
root 0 0 0 Jan 1 ? 0:13 swapper
root 1 0 0 Mar 12 ? 0:02 init
root 2 0 0 Mar 12 ? 0:00 vhand
root 3 0 0 Mar 12 ? 0:00 statdaemon
root 7 0 0 Mar 12 ? 0:00 unhashdaemon
root 10 0 0 Mar 12 ? 0:00 lvmkd
root 11 0 0 Mar 12 ? 0:00 lvmkd
root 12 0 0 Mar 12 ? 0:00 lvmkd
root 13 0 0 Mar 12 ? 0:00 lvmkd
root 6 0 0 Mar 12 ? 0:00 sockregd
root 1399 1 0 Mar 12 console 0:00 /etc/getty console console
root 185 1 0 Mar 12 ? 0:00 DIAGMON
root 75 1 0 Mar 12 ? 1:09 /etc/syncer
root 137 1 0 Mar 12 ? 0:00 /etc/cron
root 102 1 0 Mar 12 ? 0:00 /etc/rlbdaemon
root 83 1 0 Mar 12 ? 0:00 /etc/nktl_daemon 0 0 0 -1 0 1 -2
root 109 85 0 Mar 12 ? 0:00 /etc/netfmt -f /usr/adm/nettl
.LOG00 -F -C -c /usr/adm/conslo
................
프로세스를 살펴볼 때 모든 프로세스의 리스트를 살펴보기란 솔직히 짜증나는 일이다. 그렇기 때문에 원하는 내용만을 살펴보려면 , grep 이나 egrep (environment grep ) 을 이용하여 필요한 내용을 살펴보는 것이 좋다.
다음은 그 예이다.
$ ps -ax | egrep 'PID|sakai'
241 co R 0:02 rm /home/sakai/newest/95/test.txt /home/urd
$ ps -axww | egrep 'PID|sakai'
PID TT STAT TIME COMMAND
241 co R 0:02 rm /home/sakai/newest/95/test.txt /home/sakai/newest/95
/skuld.txt /home/sakai/belldandy.txt /home/sakai/newest/95/cenda.txt
$ ps -auxc | egrep 'PID|sakai'
USER PID %CPU %MEM SZ RSS TT STAT TIME COMMAND
sakai 211 6.7 1.1 824 544 p4 S 0:00 xtetris
다음으로 ps 를 실행시켰을 때 1 라인에 나오는 키워드들이 의미하는 바를 살펴보자.
USER(BSD) , UID (System V)
process 의 소유주를 표시한다.
PID
Process 의 ID 를 표시한다.
%CPU
SunOS 와 Digital UNIX 에서는 사용된 CPU 의 추정치를 표시한다. AIX, Solaris, Linux 에서는 CPUtime 과 경과시간을 표시한다.
%MEM
BSD 계열에서만 표시되는데, 사용된 메모리의 추정치를 표시한다.
SZ
현재 사용중인 가상메모리 또는 페이지를 표시한다.
RSS
현재 사용중인 Real 메모리 상황을 나타낸다.
TT, TTY
현재의 process 의 소유주가 사용중인 터미널 포트를 나타낸다.
STAT(BSD), S (System V)
현재의 프로세스의 상태를 나타낸다. 상태에는 다음과 같은 것들이 있다.
R : Running 중인 상태
S : Sleep 중인 상태
I : Idle(BSD) 상태 또는 Intermediate 상태(System V)
T : Signal 등을 받아서 중지된 상태
Z : 좀비 프로세스
D : BSD 에만 존재하는 상태표시로서 Disk 의 wait 상태를 나타낸다.
P : BSD 에만 존재하는 상태표시로서 Page 의 wait 상태를 나타낸다.
X : System V 에만 존재하는 상태표시로서 현재 메모리 wait 중인 상태를 나타낸다.
K : AIX 에만 존재하는 상태표시로서 유효한 커널의 프로세스를 나타낸다.
W : BSD 에만 존재하는 상태표시로서 swap-out 된 상태를 나타낸다.
N : BSD 에만 존재하는 상태표시로서 Nice 되어 있는 상태를 표시한다.
: BSD 에만 존재하는 상태표시로서 임의로 nice 가 할당된 상태임을 표시한다.
TIME
총 사용된 CPU time 을 표시
COMMAND
실행된 명령어의 이름을 표시
STIME (System V) , START (SunOS)
프로세스가 실행된 시간을 표시
F
process 와 관련된 flag 를 표시
PPID
parent 프로세스의 process ID 를 표시
NI
nice number 를 나타낸다.
C (System V)
CPU 사용 인자와 관련된 항목을 표시
CP (BSD)
실행 priority 를 표시
PRI
실제적인 실행 priority 를 표시
WCHAN
대기중인 event 프로세스를 표시
이제 process 를 감시하는데 필요한 기본적인 명령어는 대략 설명이 된 듯 하니 process management 를 하는데 유용한 툴들을 살펴보자.
top
프로세스를 감시하는데 유용한 프로그램으로 top 이 있다. top 은 리얼타임으로 프로세스의 변화 및 시스템의 전반적인 메모리 사용 상황, CPU 사용 상황들을 함께 보여주므로 상당히 유용한 툴이다.
HP-UX 와 IRIX , Linux 의 경우는 OS 자체에 포함이 되어 있고, 다른 OS 에서는 monitor 패키지를 새로 인스톨을 해야 한다 . 이제 간략한 top 의 사용법을 살펴보자.
top 에서 status 를 업데이트 시키는 시간을 옵션으로 재조정해줄 수 있다.
다음은 각 OS 에서 8 초마다 업데이트 시키라는 top 의 명령이다.
Linux : top d8
HP-UX : top -s 8
IRIX : top -i 8
그리고 top 이 구동되는 화면 안에서 k 를 눌러 원하는 process 를 kill 할수 있고 현재 작동되는 process 들에 r 키를 눌러서 priority 를 재할당 시킬 수도 있다.
다음이 top 의 창 안에서 줄 수 있는 명령들이다.
^L 화면을 redraw 시킨다.
h or ? 도움말을 본다.
i idle proceses 들을 본다.
k 프로세스를 kill 하는데 사용된다.
n or # 입력한 숫자의 프로세스를 보여준다.
q top 을 종료한다.
r process 의 nice 를 다시 지정하여 priority 를 재할당한다.
S status 를 누적시켜서 보여준다.
s update time 을 재조정한다.
pstree
프로세스들의 사항들 (child process , mother process 들의 fork 상황들)을 tree 로 표현하여 보기 좋고, 감시하기 좋게 해 놓은 툴이다. 기본적으로 Linux 에는 포함이 되어있는 툴인데, 다른 OS 에서도 procps 패키지를 설치하면 포함이 되게 된다.
이를 통하여 많은 유용한 일을 할 수 있는데 그 예를 들면 in.telnetd 는 슈퍼데몬인 inetd 에서 호출되어 구동되는 데몬이다. 하지만 해커가 자신의 해킹 프로그램을 ps 를 통해 감시하더라도 감지되지 않기 위해 in.telnetd 란 이름으로 바꾸어 실행시켰다 할 지라도 inetd 에서 호출된 것이 아니므로 pstree 를 이용하여 감지해 낼 수 있게 된다.
Linux_maching% pstree
init-+-agetty
|-crond
|-httpd---10*[httpd]
|-inetd-+-in.rlogind---tcsh
| |-in.telnetd---tcsh-+-pstree
| | `-tcsh
| |-in.telnetd---tcsh---vi
| `-nmbd
|-kerneld
|-kflushd
|-klogd
|-kswapd
|-lpd
|-4*[nfsiod]
|-rpc.mountd
|-rpc.nfsd
|-rpc.portmap
|-screen---2*[tcsh]
|-sendmail
|-sshd
|-syslogd
|-update
|-xconsole
`-xdm-+-X
`-xdm
이 외에도 직접적인 process management 와는 관계가 적지만 memory management 에 사용되는 관련있는 명령어로 vmstat, limit , ulimit , sar(System V) , schedtune(AIX) , dispadmin (Solaris), hinv (IRIX), lsattr(AIX) monitor(AIX), grosview(IRIX) 등이 있으니 참조하기 바란다.
이들 명령 및 Memory Management 와 관련된 사항들은 다음 호에서 다루고자 한다.
3) process 에 priority 할당하기 (nice , renice )
대부분의 유닉스 시스템들은 priority 기반의 round-robin 스케쥴링 알고리즘에 근거하여 CPU 리소스를 여러 사용자들이 사용하게 된다.
또한 모든 명령은 각각의 execution priority 를 가지고 구동 되게 되어 있는데 보통 같은 priority 를 갖는 명령에서는 CPU Time 을 시분할로 할당 받아서 구동 되게 된다.
프로그램 고유의 priority 는 ps -l 옵션을 주어서 NI 필드를 살펴보면 된다.
그리고 priority 가 좀더 높은 명령어라면 CPU 의 사용시간이 좀더 길어지게 처리를 해주므로 priority 가 높은 프로그램이 훨씬 빨리 처리되게 된다.
Priority number 는 -20 에서 +20 까지 있는데 root 가 임의로 할당하여 priority를 재배정시킬 수가 있다. 이 때 사용되는 명령어가 nice 나 renice 인데 관리자가 임의로 priority 를 재할당시킨 경우 current (actual) execution priority 로 할당이 되게 되고, 이를 살펴보기 위해서는 ps -l 옵션을 주어서 PRI 필드를 살펴보면 된다.
Priority number 는 기본적으로 BSD 에서는 0 이 주어지고 , System V 에서는 20 이 주어지는데, 숫자크기가 적을 수록 높은 priority 를 갖는다.
nice 의 사용법은 다음과 같다.
% nice [+|- n] command (C shell built in command )
# nice - [[-] n] command (/usr/bin 에 위치한 프로그램으로서의 nice 명령어)
예를 들어보면,
% nice +6 a.out
# /bin/nice -6 a.out
을 수행시키면 a.out 의 current execution priority 는 BSD 계열에서는 6 , System V 계열에서는 26 의 priority 를 갖게 된다.
% nice -5 important_job
# nice - -5 important_job
위의 경우에는 improtant_job 의 current execution priority 는 BSD 계열의 경우 -5 를 갖게 되고, System V 의 경우 15 의 priority 를 갖게 된다.
nice 의 경우는 프로그램을 수행시키면서 priority 를 할당시켜 명령을 실행시키는 경우이고, 이에 반해 이미 실행시킨 명령의 priority 를 변경시키고 싶은 경우에는 renice 라는 명령어를 사용하면 된다.
전반적인 사용법은 nice 와 동일한데 argument 로 command 대신 process ID가 들어간다는 것이 다르다.
# renice new-nice-number pid
다음은 실행 예이다.
# renice 5 8101
위와 같은 명령어를 수행시키면 8101 프로세스의 priority 는 5 가 된다.
renice 의 경우 AIX , HP-UX 경우에는 사용법이 조금 다르다.
# renice -n 12 8101
8101: old priority 0, new priority 12
과 같이 명령을 주어야 위의 명령어와 같은 효과를 얻을 수 있다.
그리고 , solaris 의 경우에는 priocntl (priority control) 이란 명령어를 사용하여 프로세스에 priority 를 재할당시킬 수 있다.
realtime , time-sharing , interactive 의 클래스로 나누어서 프로세스들을 관리시킬 수 있다.
realtime 으로 실행시키면 priority 할당 및 우선수행 자체는 확실하지만, 시스템 부하량이 증가하는 단점이 있고, time-sharing class 는 CPU time 을 할당 시켜주는 비율을 정해준다. 그리고 interactive 클래스는 프로그램이 입출력이 없으면 priority 가 점차적으로 떨어지게 되는 클래스이다.
이 명령어의 사용법은 다음과 같다.
# priocntl -s -p new-priority -i pid process_id
다음은 Solaris 에서 priocntl 을 수행시키는 예이다.
# priocntl -s -p -5 -i pid 8733
4) Process 를 kill 하기
kill 의 명령어는 보통 많이 사용해 봤기 때문에 특별히 설명하진 않겠다. 하지만 몇 가지 첨언을 하자면 -9 옵션을 이용해서 강제종료를 시킬 경우 잘못하면 좀비 process 를 생성시킬 수 있는 요인이 되므로 -15 옵션을 이용하여 process 를 종료시키기 바란다.
또, kill 과 관련된 명령어로 killall 이 있는데 , 이는 IRIX 와 LINUX 에서 제공되는 명령어다.
자, 이로서 process 관리 및 감시에 관한 내용을 마칠까 한다. 관리자가 항상 명심해야 할 철학이 있다. 다음 내용들이다.
"The analyst must resist the temptation to tune what is measurable rather than what is important"
(AIX version 3.2 , 4.1 의 Performance Tuning Guide 에서)
Resist the temptation to tune something just because it is tunable. If it isn't broken, don't fix it.
시스템을 관리해 본 사람들이라면 무언가 느껴지는 것이 있을 것이다.그리고 또한, 시스템을 우선적으로 생각하는 것도 중요하지만, 항상 사용자들의 다수의 편의를 늘 고려해 주기 바란다.
General Security Administration III 부 (다음 호)
시스템의 로그관리 및 분석법. 관련 명령어 및 툴 소개
======================================================================
(footnote)
# 는 root shell 프롬프트를 뜻한다.
$ 은 일반 사용자의 borne shell 계열 쉘 프롬프트를 뜻한다.
% 는 일반 사용자의 C shell 계열 쉘 프롬프트를 뜻한다.
=====================================================================
References
1. Essential System Administration, O'Reilly & Assoiates, Inc.
2. [General Security Technique - Practically Useful], 김휘강 ,제 4 회 WWW-KR Conference
김휘강 (Sakai Kim)sakai@major.kaist.ac.kr
Contents
General Security Administration I 부 (지난 호)
개요
password 에 관련된 Secure Administration
General Security Administration II 부 (이번 호)
Process 관리, 감시법
이번 호에서는 지난 호에 이어 General Security Administration 중 System Security 에 대해 다루겠다.
이번 호에서 중점적으로 다룰 내용은 Process 를 관리하고 이상한 프로세스를 찾아내어 조사하는 방법, 그리고 security 에 있어 tracing 을 할 때 절대적으로 요구되는 중요한 로그화일 에는 어떤 것이 있는지를 살펴보고 이 로그 파일을 어떤 식으로 분석해야 하는지에 대해서 살펴보도록 하겠다.
I. General System Administration
1. Process Management & Monitoring
1) Process Management 이란? Process Monitoring 이란?
UNIX 시스템은 멀티유저 체계이기 때문에 System 의 Resource 를 서로 공유하면서 사용하고 있다. 그렇기 때문에 시스템의 부하량을 많이 잡아먹는 프로세스가 다른 유저에 의해 작동되고 있을 경우 다른 유저들은 그만큼 시스템의 리소스를 사용하지 못하게 되어 중요한 작업이 있는 경우에 피해를 볼 수 도 있다.
흔히 No More Process 나 all network port in use 따위의 메시지를 볼 수 있을 것이다. 중요한 일이 있을 때에 이러한 메시지를 보게 되면 짜증이 나게 되고, 다른 사용자들 중에 쓸데 없는 프로세스를 구동 시키고 있다면 프로세스를 kill 해주기를 바랄 것이다.
Process Management 란, 프로세스에 priority 를 할당하여 중요한 작업이 먼저 수행되도록 한다든가, 시스템 부하를 많이 잡는 프로세스를 프로세스의 소유주에게 양해를 구해 kill 한다든가, Zombie 가 된 프로세스가 끊임없이 CPU Time 을 잡고 있을 때 처리해 주는 것이나 사용자가 돌발적인 사태로 process 를 많이 띄워 놓은 상태에서 logout 되었을 때, Idling 상태로 있는 프로세스들 중 CPU Time 을 많이 잡고 있는 프로세스들을 처리해 주는 Administration 을 말한다.
Process Monitoring 은 Process Management 의 일부에 속하는 일인데, 성격이 약간 다르다. 이상한 프로세스( 예를 들어 OS 에서 제공하지 않는 명령어의 이름으로 시스템에 피해를 주는 작업을 하는 경우, 시스템 해킹과 관련된 프로세스) 들을 감지해 내어 이를 처리하는 것을 말한다.
Process Management 의 예
다음은 관리자가 시스템을 사용도중 갑자기 xload 의 그래프가 치솟으며 시스템이 현저하게 느려지는 것을 발견하고 처리를 하는 과정을 담은 예이다.
# uptime
2:17pm up 12 days, 21:25, 5 users, load average: 4.03 , 0.39, 0.21
# w
2:18pm up 12 days, 21:27, 5 user, load average: 4.04 , 0.32, 0.21
User tty login@ idle JCPU PCPU what
exit ttyp8 2:14pm -csh
sakai ttyp9 1:20pm -csh
....
# top
System: miso Tue Mar 25 14:20:06 1997
Load averages: 4.04, 0.37, 0.23
84 processes: 83 sleeping, 1 waiting
Cpu states:
CPU LOAD USER NICE SYS IDLE UNK5 UNK6 INTR SSYS
1 4.04 111.5% 0.0% -0.1% -11.4% -0.0% -0.0% -0.0% -0.0%
Memory: 14172K (2144K) real, 18596K (2612K) virtual, 3696K free Screen # 1/6
CCU TTY PID USERNAME PRI NI SIZE RESD STATE TIME %WCPU %CPU COMMAND
0 ? 14490 sakai 154 20 2008K 600K wait 0:00 10.20 9.90 a.out
0 ? 14459 sakai 154 20 1004K 552K sleep 0:41 7.15 7.13 hanterm
0 p3 14488 sakai 156 20 292K 296K sleep 0:23 2.23 2.22 screen
0 p6 14862 sakai 178 20 204K 232K wait 0:00 0.73 0.55 top
0 ? 3 root 128 20 0K 0K sleep 0:00 0.02 0.02 statdaem
0 ? 2 root 128 20 0K 0K sleep 0:00 0.02 0.02 vhand
0 ? 1 root 168 20 44K 36K sleep 0:02 0.02 0.02 init
시스템의 로드 수치가 상당히 큼을 느끼고, w , top 을 이용하여 현재 시스템에 어떠한 프로세스가 돌고 있는지를 살펴 보았더니 sakai 란 사용자가 실행시키고 있는 a.out 이란 프로그램에 문제가 있음을 발견했다.
그래서 양해를 구한다음 이 프로세스를 kill 하기로 했다.
# talk sakai
[Connection established...]
U r running an odd process now, your programming a.out is using most of system'
s resources, It can do harm another users.
so Could I kill your process a.out now?
-What's Up? root?
Oh, I got it ,
Don't mention it. You can kill my process.
Sorry for doing harm to system....
# kill -15 14490
# uptime
2:17pm up 12 days, 21:25, 5 users, load average: 1.03 , 0.39, 0.21
Process Monitoring 의 예.
어떤 관리자가 자신이 관리하는 시스템에서 패킷로스가 심하게 일어남을 발견하고 누군가 자신의 시스템 내부에서 /dev/le0 등을 모니터링 하거나 스니핑 하지는 않는지 의심하게 되었다. (참고로 스니핑을 하고 있는 동안에 많은 패킷로스가 일어날 수 있다.)
% ping -s localhost
PING localhost: 56 data bytes
64 bytes from localhost (127.0.0.1): icmp_seq=0. time=3. ms
64 bytes from localhost (127.0.0.1): icmp_seq=1. time=2. ms
64 bytes from localhost (127.0.0.1): icmp_seq=2. time=1. ms
64 bytes from localhost (127.0.0.1): icmp_seq=3. time=2. ms
64 bytes from localhost (127.0.0.1): icmp_seq=4. time=4. ms
64 bytes from localhost (127.0.0.1): icmp_seq=5. time=2. ms
64 bytes from localhost (127.0.0.1): icmp_seq=6. time=1. ms
64 bytes from localhost (127.0.0.1): icmp_seq=7. time=3. ms
......
64 bytes from localhost (127.0.0.1): icmp_seq=34. time=1. ms
----arirang.kaist.ac.kr PING Statistics----
34 packets transmitted, 22 packets received, 35% packet loss
round-trip (ms) min/avg/max = 1/2/3
% ifconfig -a
lo0: flags=849 mtu 8232
inet 127.0.0.1 netmask ff000000
le0: flags=863 mtu 1500
inet 203.251.173.1 netmask ffffff00 broadcast 143.248.8.255
sniffer는 Promiscuous mode에서 동작 하는 것임을 우리는 전번 호에서 살펴본 바 있다. 이제 ifconfig 를 통해 sniffer 가 돌고 있음을 발견했으니 이제는 그 프로세스를 찾아내어 kill 을 해야 한다.
그리고 root 의 권한으로 돌고 있는 프로세스들이 주로 위험한 경우가 많으므로 우선적으로 다음과 같은 명령을 사용하여 접근을 하도록 한다.
# ps -ef | grep root
를 통해 이상한 프로세스를 발견해 내도록 한다. 물론 어떠한 프로세스가 해커가 작동시키고 나간 프로세스인지는 신중을 기해 살펴보아야 할 것이다. 해커가 만일 sniff 프로그램을 설치하고 나갔다면 sniff 란 이름으로 설치했을 리 만무하기 때문이다. 시스템 내에서 흔히 돌고 있는 in.telnetd 나 in.uucpd 등의 이름으로 바꾸어 작동시키는 경우가 흔히 있다.
2) 본격적인 Process management & monitoring
우선 프로세스를 살펴보는 프로그램에는 다들 알고 있듯이 /bin/ps 가 있다. 그런데 여러 종류의 다른 OS 를 사용해 본 사람은 느끼겠지만, OS 마다 옵션이 조금씩 달라서 원하는 결과를 얻지 못하는 경우가 있었을 것이다. 자 이제 OS 마다의 ps 옵션들을 살펴보자.
ps 의 옵션은 크게 두 가지 종류로 나눌 수가 있다. BSD 계열의 시스템의 ps와 System V 계열의 시스템에서 사용하는 ps 이다.
먼저 BSD 계열을 살펴보자. 해당되는 OS 에는 SunOS 가 대표적인 예이나 AIX, SunOS , Linux , Digital UNIX , Solaris 에 있는 /usr/ucb/ps 도 BSD 의 ps 이다.
이 계열의 ps 에서 주로 사용되는 옵션에는 다음과 같은 것이 있다.
-ax : 시스템의 모든 프로세스들을 디스플레이 시킨다.
% ps -ax
PID TT S TIME COMMAND
0 ? T 0:00 sched
1 ? S 2:04 /etc/init -
2 ? S 0:12 pageout
3 ? S 85:46 fsflush
137 ? S 3:18 /sbin/gated
146 ? S 0:05 /usr/sbin/rpcbind
148 ? S 0:00 /usr/sbin/keyserv
154 ? S 0:00 /usr/sbin/kerbd
164 ? S 0:29 /usr/sbin/inetd -s
167 ? S 0:00 /usr/lib/nfs/statd
169 ? S 0:04 /usr/lib/nfs/lockd
191 ? S 0:01 /usr/lib/autofs/automountd
..........
-c : 실제의 명령어 이름을 표시한다.
% ps -c
PID TT S TIME COMMAND
25359 pts/40 S 0:00 tcsh
25460 pts/40 O 0:00 ps
-e : 명령어가 수행될 때 쓰인 환경 변수와 , 명령어를 같이 표시해 준다.
% ps -e
PID TT S TIME COMMAND
25359 pts/40 S 0:00 -tcsh TZ=ROK TERM=vt100 PATH=/usr/bin: HOME=/cosmos/use
25469 pts/40 O 0:00 ps -e TZ=ROK TERM=vt100 PATH=.:/cosmos/user/sakai:/usr/
-w : 다른 프로세스 옵션 뒤에 붙여서 Wide 포맷으로 디스플레이 시킨다.
% ps -axw
......
260 ? S 6:56 nmbd
269 ? S 0:57 /usr/local/etc/arns -i le0 -2 -z kaistCompSci -l /usr/lo
272 ? S 0:00 /bin/sh /usr/local/squid/bin/RunCache
276 ? S 82:25 squid -s
......
-ww : 명령어가 한 line 을 넘어가게 되면 ps 의 -w 옵션으로 살펴보아도 표시할 수 없는 경우가 있다. (시스템에 따라 다르다. 어떠한 시스템은 w 만 사용하여도 ww 와 같은 효과를 나타낸다.) 이 때 ww 를 중첩시켜서 사용하면 커맨드 전부를 살펴볼 수 있다.
% ps -axww
......
260 ? S 6:56 nmbd
269 ? S 0:57 /usr/local/etc/arns -i le0 -2 -z kaistCompSci -l
/usr/local/lib/cap/arns.log -f /usr/local/lib/cap/arns.fi
272 ? S 0:00 /bin/sh /usr/local/squid/bin/RunCache
276 ? S 82:25 squid -s
......
특히 e 옵션과 , ww 옵션 은 프로세스를 감시하고 관리하는데 아주 유용한 옵션들이니 기억하기 바란다.
다음으로 System V 계열을 살펴보자. System V 계열의 OS 에는 AIX, Digital UNIX, Solaris, HP-UX, IRIX, SCO UNIX 등이 있다.
전반적으로 BSD 계열의 ps 와 옵션이 같다. 이제 차이가 있는 옵션을 살펴보면 다음과 같다.
e : e 옵션은 BSD 의 환경변수를 보여주는 옵션이 아닌 시스템 내의 모든 프로세스를 디스플레이 시키는 옵션이다.
f : process 의 시작 시간부터 표시하여 full listing 을 시켜주는 옵션이다.
% ps -e
PID TTY TIME COMMAND
0 ? 0:13 swapper
1 ? 0:02 init
2 ? 0:00 vhand
3 ? 0:00 statdaemon
7 ? 0:00 unhashdaemon
10 ? 0:00 lvmkd
11 ? 0:00 lvmkd
12 ? 0:00 lvmkd
13 ? 0:00 lvmkd
6 ? 0:00 sockregd
1399 console 0:00 getty
185 ? 0:00 DIAGMON
75 ? 1:09 syncer
137 ? 0:00 cron
102 ? 0:00 rlbdaemon
83 ? 0:00 nktl_daemon
........
% ps -ef
UID PID PPID C STIME TTY TIME COMMAND
root 0 0 0 Jan 1 ? 0:13 swapper
root 1 0 0 Mar 12 ? 0:02 init
root 2 0 0 Mar 12 ? 0:00 vhand
root 3 0 0 Mar 12 ? 0:00 statdaemon
root 7 0 0 Mar 12 ? 0:00 unhashdaemon
root 10 0 0 Mar 12 ? 0:00 lvmkd
root 11 0 0 Mar 12 ? 0:00 lvmkd
root 12 0 0 Mar 12 ? 0:00 lvmkd
root 13 0 0 Mar 12 ? 0:00 lvmkd
root 6 0 0 Mar 12 ? 0:00 sockregd
root 1399 1 0 Mar 12 console 0:00 /etc/getty console console
root 185 1 0 Mar 12 ? 0:00 DIAGMON
root 75 1 0 Mar 12 ? 1:09 /etc/syncer
root 137 1 0 Mar 12 ? 0:00 /etc/cron
root 102 1 0 Mar 12 ? 0:00 /etc/rlbdaemon
root 83 1 0 Mar 12 ? 0:00 /etc/nktl_daemon 0 0 0 -1 0 1 -2
root 109 85 0 Mar 12 ? 0:00 /etc/netfmt -f /usr/adm/nettl
.LOG00 -F -C -c /usr/adm/conslo
................
프로세스를 살펴볼 때 모든 프로세스의 리스트를 살펴보기란 솔직히 짜증나는 일이다. 그렇기 때문에 원하는 내용만을 살펴보려면 , grep 이나 egrep (environment grep ) 을 이용하여 필요한 내용을 살펴보는 것이 좋다.
다음은 그 예이다.
$ ps -ax | egrep 'PID|sakai'
241 co R 0:02 rm /home/sakai/newest/95/test.txt /home/urd
$ ps -axww | egrep 'PID|sakai'
PID TT STAT TIME COMMAND
241 co R 0:02 rm /home/sakai/newest/95/test.txt /home/sakai/newest/95
/skuld.txt /home/sakai/belldandy.txt /home/sakai/newest/95/cenda.txt
$ ps -auxc | egrep 'PID|sakai'
USER PID %CPU %MEM SZ RSS TT STAT TIME COMMAND
sakai 211 6.7 1.1 824 544 p4 S 0:00 xtetris
다음으로 ps 를 실행시켰을 때 1 라인에 나오는 키워드들이 의미하는 바를 살펴보자.
USER(BSD) , UID (System V)
process 의 소유주를 표시한다.
PID
Process 의 ID 를 표시한다.
%CPU
SunOS 와 Digital UNIX 에서는 사용된 CPU 의 추정치를 표시한다. AIX, Solaris, Linux 에서는 CPUtime 과 경과시간을 표시한다.
%MEM
BSD 계열에서만 표시되는데, 사용된 메모리의 추정치를 표시한다.
SZ
현재 사용중인 가상메모리 또는 페이지를 표시한다.
RSS
현재 사용중인 Real 메모리 상황을 나타낸다.
TT, TTY
현재의 process 의 소유주가 사용중인 터미널 포트를 나타낸다.
STAT(BSD), S (System V)
현재의 프로세스의 상태를 나타낸다. 상태에는 다음과 같은 것들이 있다.
R : Running 중인 상태
S : Sleep 중인 상태
I : Idle(BSD) 상태 또는 Intermediate 상태(System V)
T : Signal 등을 받아서 중지된 상태
Z : 좀비 프로세스
D : BSD 에만 존재하는 상태표시로서 Disk 의 wait 상태를 나타낸다.
P : BSD 에만 존재하는 상태표시로서 Page 의 wait 상태를 나타낸다.
X : System V 에만 존재하는 상태표시로서 현재 메모리 wait 중인 상태를 나타낸다.
K : AIX 에만 존재하는 상태표시로서 유효한 커널의 프로세스를 나타낸다.
W : BSD 에만 존재하는 상태표시로서 swap-out 된 상태를 나타낸다.
N : BSD 에만 존재하는 상태표시로서 Nice 되어 있는 상태를 표시한다.
: BSD 에만 존재하는 상태표시로서 임의로 nice 가 할당된 상태임을 표시한다.
TIME
총 사용된 CPU time 을 표시
COMMAND
실행된 명령어의 이름을 표시
STIME (System V) , START (SunOS)
프로세스가 실행된 시간을 표시
F
process 와 관련된 flag 를 표시
PPID
parent 프로세스의 process ID 를 표시
NI
nice number 를 나타낸다.
C (System V)
CPU 사용 인자와 관련된 항목을 표시
CP (BSD)
실행 priority 를 표시
PRI
실제적인 실행 priority 를 표시
WCHAN
대기중인 event 프로세스를 표시
이제 process 를 감시하는데 필요한 기본적인 명령어는 대략 설명이 된 듯 하니 process management 를 하는데 유용한 툴들을 살펴보자.
top
프로세스를 감시하는데 유용한 프로그램으로 top 이 있다. top 은 리얼타임으로 프로세스의 변화 및 시스템의 전반적인 메모리 사용 상황, CPU 사용 상황들을 함께 보여주므로 상당히 유용한 툴이다.
HP-UX 와 IRIX , Linux 의 경우는 OS 자체에 포함이 되어 있고, 다른 OS 에서는 monitor 패키지를 새로 인스톨을 해야 한다 . 이제 간략한 top 의 사용법을 살펴보자.
top 에서 status 를 업데이트 시키는 시간을 옵션으로 재조정해줄 수 있다.
다음은 각 OS 에서 8 초마다 업데이트 시키라는 top 의 명령이다.
Linux : top d8
HP-UX : top -s 8
IRIX : top -i 8
그리고 top 이 구동되는 화면 안에서 k 를 눌러 원하는 process 를 kill 할수 있고 현재 작동되는 process 들에 r 키를 눌러서 priority 를 재할당 시킬 수도 있다.
다음이 top 의 창 안에서 줄 수 있는 명령들이다.
^L 화면을 redraw 시킨다.
h or ? 도움말을 본다.
i idle proceses 들을 본다.
k 프로세스를 kill 하는데 사용된다.
n or # 입력한 숫자의 프로세스를 보여준다.
q top 을 종료한다.
r process 의 nice 를 다시 지정하여 priority 를 재할당한다.
S status 를 누적시켜서 보여준다.
s update time 을 재조정한다.
pstree
프로세스들의 사항들 (child process , mother process 들의 fork 상황들)을 tree 로 표현하여 보기 좋고, 감시하기 좋게 해 놓은 툴이다. 기본적으로 Linux 에는 포함이 되어있는 툴인데, 다른 OS 에서도 procps 패키지를 설치하면 포함이 되게 된다.
이를 통하여 많은 유용한 일을 할 수 있는데 그 예를 들면 in.telnetd 는 슈퍼데몬인 inetd 에서 호출되어 구동되는 데몬이다. 하지만 해커가 자신의 해킹 프로그램을 ps 를 통해 감시하더라도 감지되지 않기 위해 in.telnetd 란 이름으로 바꾸어 실행시켰다 할 지라도 inetd 에서 호출된 것이 아니므로 pstree 를 이용하여 감지해 낼 수 있게 된다.
Linux_maching% pstree
init-+-agetty
|-crond
|-httpd---10*[httpd]
|-inetd-+-in.rlogind---tcsh
| |-in.telnetd---tcsh-+-pstree
| | `-tcsh
| |-in.telnetd---tcsh---vi
| `-nmbd
|-kerneld
|-kflushd
|-klogd
|-kswapd
|-lpd
|-4*[nfsiod]
|-rpc.mountd
|-rpc.nfsd
|-rpc.portmap
|-screen---2*[tcsh]
|-sendmail
|-sshd
|-syslogd
|-update
|-xconsole
`-xdm-+-X
`-xdm
이 외에도 직접적인 process management 와는 관계가 적지만 memory management 에 사용되는 관련있는 명령어로 vmstat, limit , ulimit , sar(System V) , schedtune(AIX) , dispadmin (Solaris), hinv (IRIX), lsattr(AIX) monitor(AIX), grosview(IRIX) 등이 있으니 참조하기 바란다.
이들 명령 및 Memory Management 와 관련된 사항들은 다음 호에서 다루고자 한다.
3) process 에 priority 할당하기 (nice , renice )
대부분의 유닉스 시스템들은 priority 기반의 round-robin 스케쥴링 알고리즘에 근거하여 CPU 리소스를 여러 사용자들이 사용하게 된다.
또한 모든 명령은 각각의 execution priority 를 가지고 구동 되게 되어 있는데 보통 같은 priority 를 갖는 명령에서는 CPU Time 을 시분할로 할당 받아서 구동 되게 된다.
프로그램 고유의 priority 는 ps -l 옵션을 주어서 NI 필드를 살펴보면 된다.
그리고 priority 가 좀더 높은 명령어라면 CPU 의 사용시간이 좀더 길어지게 처리를 해주므로 priority 가 높은 프로그램이 훨씬 빨리 처리되게 된다.
Priority number 는 -20 에서 +20 까지 있는데 root 가 임의로 할당하여 priority를 재배정시킬 수가 있다. 이 때 사용되는 명령어가 nice 나 renice 인데 관리자가 임의로 priority 를 재할당시킨 경우 current (actual) execution priority 로 할당이 되게 되고, 이를 살펴보기 위해서는 ps -l 옵션을 주어서 PRI 필드를 살펴보면 된다.
Priority number 는 기본적으로 BSD 에서는 0 이 주어지고 , System V 에서는 20 이 주어지는데, 숫자크기가 적을 수록 높은 priority 를 갖는다.
nice 의 사용법은 다음과 같다.
% nice [+|- n] command (C shell built in command )
# nice - [[-] n] command (/usr/bin 에 위치한 프로그램으로서의 nice 명령어)
예를 들어보면,
% nice +6 a.out
# /bin/nice -6 a.out
을 수행시키면 a.out 의 current execution priority 는 BSD 계열에서는 6 , System V 계열에서는 26 의 priority 를 갖게 된다.
% nice -5 important_job
# nice - -5 important_job
위의 경우에는 improtant_job 의 current execution priority 는 BSD 계열의 경우 -5 를 갖게 되고, System V 의 경우 15 의 priority 를 갖게 된다.
nice 의 경우는 프로그램을 수행시키면서 priority 를 할당시켜 명령을 실행시키는 경우이고, 이에 반해 이미 실행시킨 명령의 priority 를 변경시키고 싶은 경우에는 renice 라는 명령어를 사용하면 된다.
전반적인 사용법은 nice 와 동일한데 argument 로 command 대신 process ID가 들어간다는 것이 다르다.
# renice new-nice-number pid
다음은 실행 예이다.
# renice 5 8101
위와 같은 명령어를 수행시키면 8101 프로세스의 priority 는 5 가 된다.
renice 의 경우 AIX , HP-UX 경우에는 사용법이 조금 다르다.
# renice -n 12 8101
8101: old priority 0, new priority 12
과 같이 명령을 주어야 위의 명령어와 같은 효과를 얻을 수 있다.
그리고 , solaris 의 경우에는 priocntl (priority control) 이란 명령어를 사용하여 프로세스에 priority 를 재할당시킬 수 있다.
realtime , time-sharing , interactive 의 클래스로 나누어서 프로세스들을 관리시킬 수 있다.
realtime 으로 실행시키면 priority 할당 및 우선수행 자체는 확실하지만, 시스템 부하량이 증가하는 단점이 있고, time-sharing class 는 CPU time 을 할당 시켜주는 비율을 정해준다. 그리고 interactive 클래스는 프로그램이 입출력이 없으면 priority 가 점차적으로 떨어지게 되는 클래스이다.
이 명령어의 사용법은 다음과 같다.
# priocntl -s -p new-priority -i pid process_id
다음은 Solaris 에서 priocntl 을 수행시키는 예이다.
# priocntl -s -p -5 -i pid 8733
4) Process 를 kill 하기
kill 의 명령어는 보통 많이 사용해 봤기 때문에 특별히 설명하진 않겠다. 하지만 몇 가지 첨언을 하자면 -9 옵션을 이용해서 강제종료를 시킬 경우 잘못하면 좀비 process 를 생성시킬 수 있는 요인이 되므로 -15 옵션을 이용하여 process 를 종료시키기 바란다.
또, kill 과 관련된 명령어로 killall 이 있는데 , 이는 IRIX 와 LINUX 에서 제공되는 명령어다.
자, 이로서 process 관리 및 감시에 관한 내용을 마칠까 한다. 관리자가 항상 명심해야 할 철학이 있다. 다음 내용들이다.
"The analyst must resist the temptation to tune what is measurable rather than what is important"
(AIX version 3.2 , 4.1 의 Performance Tuning Guide 에서)
Resist the temptation to tune something just because it is tunable. If it isn't broken, don't fix it.
시스템을 관리해 본 사람들이라면 무언가 느껴지는 것이 있을 것이다.그리고 또한, 시스템을 우선적으로 생각하는 것도 중요하지만, 항상 사용자들의 다수의 편의를 늘 고려해 주기 바란다.
General Security Administration III 부 (다음 호)
시스템의 로그관리 및 분석법. 관련 명령어 및 툴 소개
======================================================================
(footnote)
# 는 root shell 프롬프트를 뜻한다.
$ 은 일반 사용자의 borne shell 계열 쉘 프롬프트를 뜻한다.
% 는 일반 사용자의 C shell 계열 쉘 프롬프트를 뜻한다.
=====================================================================
References
1. Essential System Administration, O'Reilly & Assoiates, Inc.
2. [General Security Technique - Practically Useful], 김휘강 ,제 4 회 WWW-KR Conference
'Unix Linux' 카테고리의 다른 글
[펌] 유닉스 보안 2 (0) | 2005.05.31 |
---|---|
[펌] 유닉스 보안 3 (0) | 2005.05.31 |
정규표현식의 기본 문법 (0) | 2005.02.15 |