'이것저것 > 낙서장' 카테고리의 다른 글
[펌] 방송사에서도 못찾은 닭집 (0) | 2004.07.19 |
---|---|
[펌] 이제부터 다시- 전인권 (0) | 2004.07.12 |
하하... 첫페이지 너무 느려 (0) | 2004.07.08 |
[펌] 술 주정의 모든 것 (0) | 2004.06.23 |
[펌] 공감 가는 야그*^^* (0) | 2004.06.22 |
[펌] 방송사에서도 못찾은 닭집 (0) | 2004.07.19 |
---|---|
[펌] 이제부터 다시- 전인권 (0) | 2004.07.12 |
하하... 첫페이지 너무 느려 (0) | 2004.07.08 |
[펌] 술 주정의 모든 것 (0) | 2004.06.23 |
[펌] 공감 가는 야그*^^* (0) | 2004.06.22 |
첫 페이지 로딩이 너무 느려서... 쓴 포스트 입니다 ... 캬캬
술좀 깨자~~~
[펌] 이제부터 다시- 전인권 (0) | 2004.07.12 |
---|---|
[펌] 넥타이매는법.. (0) | 2004.07.08 |
[펌] 술 주정의 모든 것 (0) | 2004.06.23 |
[펌] 공감 가는 야그*^^* (0) | 2004.06.22 |
월요일... ㅋㅋ (0) | 2004.06.07 |
####################################
#
# MSN 차단 목록 ...
#
####################################
iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp --dport 1863 -j DROP
iptables -t nat -A PREROUTING -s 192.168.1.190 -d 207.46.110.0/24 -p tcp --dport 1:65535 -j DROP
iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp -d 207.46.104.20 --dport 1:65535 -j DROP
iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp -d 61.100.182.0/25 --dport 1:65535 -j DROP
한줄로 막기...
# 65.54.131.249 <-- https 로 id 인증하는 서버
##### ---- 차단 일 : 2004-07-07 ---- ##########
iptables -t nat -A PREROUTING -s 192.168.1.190 -p tcp -d 65.54.131.249 --dport 443 -j DROP
[펌] temp..정리하기전.. (0) | 2004.08.11 |
---|---|
[펌] 20만통 메일과 sendmail (0) | 2004.07.09 |
[펌] 프로세스죽이기 (0) | 2004.07.07 |
간단하게 ftp 에 접속하는법 (0) | 2004.07.06 |
[펌] rsync 의 미러링 기능을 이용한 백업 (0) | 2004.07.05 |
ddt 8469 8463 7 20:29 ? 00:01:03 /home/ddt/phoenix/phoenix-bin ddt 8471 8469 0 20:29 ? 00:00:00 /home/ddt/phoenix/phoenix-bin그럼 어떻게 죽이는지 알아보자.
$ ps -ef |grep phoenix (눈으로 pid를 확인한다) $ kill pid
$ ps x |grep phoenix | awk '{print $1}' | xargs kill
$ pkill phoenix
물론 고수들이 이렇게 하는지 확인은 되지 않았다
# reboot !
[펌] 20만통 메일과 sendmail (0) | 2004.07.09 |
---|---|
[허접] 내부 IP MSN 차단 .... ㅡㅡ (0) | 2004.07.07 |
간단하게 ftp 에 접속하는법 (0) | 2004.07.06 |
[펌] rsync 의 미러링 기능을 이용한 백업 (0) | 2004.07.05 |
[펌] 웹서버 동기화를 위한 rsync의 사용 (0) | 2004.07.05 |
어디서 보긴 했는데 어디인지 모름 ㅡㅡ
간단하게 shell 에서 ftp 에 접근할 때 사용하기 좋음..
/tmp 디렉토리에 test.tar.gz 파일이 있을 경우 아래와 같은 스크립트를
만들어 두고 cron 에 등록하면 시간에 맞춰 ftp 에 업로드 됨.
#!/bin/bash
USERNAME=gildong
PASSWORD=1234
HOST=111.111.111.111
PUT_FILES=test.tar.gz
{
echo user $USERNAME $PASSWORD
echo bi
echo prompt
echo cd log_backup
echo lcd /tmp
echo put $FILE_NAME
echo bye
} | ftp -n -v $HOST > /tmp/log
[허접] 내부 IP MSN 차단 .... ㅡㅡ (0) | 2004.07.07 |
---|---|
[펌] 프로세스죽이기 (0) | 2004.07.07 |
[펌] rsync 의 미러링 기능을 이용한 백업 (0) | 2004.07.05 |
[펌] 웹서버 동기화를 위한 rsync의 사용 (0) | 2004.07.05 |
리눅스 서비스에 있던것들 종류.. (0) | 2004.07.05 |
mysql replication 사용....
데이터 복제는 두가지 설정으로 나누어 진다.
* master 설정
* slave 설정
mysql 은 이미 설치되어 있다는 전제하에 설명하며,
두대의 서버에 각각 설치되었다고 가정한다.
master 서버의 ip 는 111.111.111.111 로 가정하고
slave 서버의 ip 는 222.222.222.222 로 가정한다.
먼저 master 설정...
1. Master Server 에 새로운 사용자 등록...(권한은 all 로 했지만 Repl_slave_priv 만 준다고 함).
(전체 데이터베이스 복제를 위해 *.* 로 한다..... 디비는 딱 세개 있음 ㅡㅡ)
grant all on *.* to 'tornado'@'%' identified by '패스워드' with grant option;
2. 권한을 줬으면 mysql 데이터베이스에 user 테이블에 현재 생성한 유져가 잘 들어있는지 체크한다.
3. my.cnf 파일을 고쳐주어야 한다. 보통 mysql 설치후 /etc/ 디렉토리에 복사해 놓고 사용하는데
없다면 MYSQL_HOME/support-files 디렉토리에 보면
-rw-r--r-- 1 root mysql 2686 6¿u 3 10:04 MySQL-shared-compat.spec
-rw-r--r-- 1 root mysql 773 6¿u 3 10:04 magic
-rw-r--r-- 1 root mysql 4874 6¿u 3 10:04 my-huge.cnf
-rw-r--r-- 1 root mysql 4850 6¿u 3 10:04 my-large.cnf
-rw-r--r-- 1 root mysql 4833 6¿u 3 10:04 my-medium.cnf
-rw-r--r-- 1 root mysql 2418 6¿u 3 10:04 my-small.cnf
-rwxr-xr-x 1 root mysql 24917 6¿u 3 10:04 mysql-4.0.17.spec
-rwxr-xr-x 1 root mysql 676 6¿u 3 10:04 mysql-log-rotate
-rwxr-xr-x 1 root mysql 5432 6¿u 3 10:04 mysql.server
-rw-r--r-- 1 root mysql 24917 6¿u 3 10:04 mysql.spec
이렇게 파일이 존재한다.
이중에... my-small.cnf 를 /etc/my.cnf 로 복사한다.
cp my-small.cnf /etc/my.cnf
4. vi 로 /etc/my.cnf 를 열어본다...
# vi /etc/my.cnf 로 보면 아래와 같은 부분이 있다.
log-bin
server-id = 1
이 부분이 주석처리 되면 안되며, server-id 는 master 서버와 slave 서버 사이에서 유일한 값이어야 한다.
6. Database 및 Table 생성
mysql 에는 test 디비가 있는데 그곳에 아래와 같이 테이블을 만든다.
create table a ( name varchar(50) );
7. Database 복사.
위에처럼 생성했다면 mysql/data/test 디렉토리에 a 테이블에 관련된 세개의 파일이 생성된다.
그럼 해당 Table 을 무식하게(?) 압축해서 slave 의 test 디렉토리로 이동한다.
[root@localhost data]# tar cvzf test.tar.gz ./test
./test/
./test/a.frm
./test/a.MYI
./test/a.MYD
You have new mail in /var/spool/mail/root
[root@localhost data]#
압축된 파일을 slave 서버의 mysql/data/ 디렉토리에 옮긴후 압축을 푼다.
# tar xvzf test.tar.gz
이제 Slave 서버 셋팅이다.
1. my.cnf 파일 수정하기..
master 서버의 my.cnf 를 복사한 것과 같은 방법으로 /etc/my.cnf 를 만들어 준다.
# vi /etc/my.cnf
파일을 보다가 server-id = 1 이라고 되어있는 부분이 있으면
server-id = 2 로 바꾸어 준다.
아래와 같이 master 서버의 주소와 사용자를 적어준다.
# Replication Configure
master-host=111.111.111.111
master-user=tornado
master-password=패스워드
master-port=3306
2. mysql 데몬 다시 시작하기.
master 서버 및 slave 서버의 데몬을 다시 시작한다.
./bin/safe_mysqld --user=mysql &
3. master 서버에서의 상태 보기.
show master status;
위 명령을 치면 master 서버의 상태를 보여준다.
그곳에 보이는 파일과 slave 에서 보이는 파일이 동일해야 한다.
4. slave 서버에서의 상태보기.
show slave status;
위 명령을 치면 master 와는 틀리게 컬럼이 좀 여러개가 보인다.
그중에 master 에 적혀 있는 파일이 정확하게 있는지 확인한다.
만약 없다면 slave 의 data/ 디렉토리에 있는 모든 파일(디렉토리는 빼고!!!) 을 싹 지운다.
보통 xxx-bin 과 같은 파일일 것임..
만약 컬럼 중간에 에러 비스무리한 것이 있다면... 잘 읽어보라.
5. slave 서버 시작/중지하기.
slave start ; <-- 슬레이브 시작하기
slave stop ; <-- 슬레이브 중지하기..
이렇게 중지해도 양쪽의 로그파일이 있기 때문에
중간에 중단되었다 해도 중단된 시점부터 다시 백업해준다.
6. 테스트
master 서버의 test 디비에서 아까 만들었던 a 테이블에 쿼리를 날려본다.
insert into a values('tornado');
마스터/슬레이브 서버에서 각각 select * from a; 를 해보고
데이터가 동일한지 확인해서 같으면 끝...
7. 문제점???
pk 컬럼의 중복 및 짜잘한 오류가 생겼을 경우 slave 가 죽는 현상이 벌어짐 ㅡㅡ
해결책 ... 모름.. 아시는 분 덧글 부탁 ^^
[MySQL] Got error 28 from storage engine (0) | 2008.03.03 |
---|---|
[MySQL] mysqld_multi 사용법, 데몬 두 개 운영하기 (0) | 2006.11.03 |
mysql 관리 툴 EMS (0) | 2006.09.30 |
[Mysql] GRANT로 사용자 추가하기 (0) | 2006.08.28 |
[펌] 데이터베이스 관리 (0) | 2004.06.30 |
rsync 의 미러링 기능을 이용한 백업
/***************************************************************/
* rsync 백업 서버 구축에 대해서
rsync 는 원격에서 미러링 서버를 구축할때 사용되는 유틸이다.
옵션에 따라 파일의 수정 날짜를 비교해서 수정된 파일만 업데이트 할 수있기 때문에 처음 한 번만 풀 백업 해두면 그 다음 부턴 아주 빠른 속도로 업데이트 할 수있다.
서버에는 REDHAT 8.0 또는 REDHAT 7.x, REDHAT 9 가 설치되어있고,
백업 서버 역시 REDHAT8.0 이 설치되어있다.
우선 백업 계획은 서버들로부터 새벽 4시경에 1차 백업서버로 매일 백업을 받고,
1주 단위로 1차 백업 서버의 데이터를 일요일 새벽 5시에 2차 백업 서버로 전송받는다.
일단 백업 대상이 되는 서버들에 rsync 가 설치되어 있는지 확인해보고 없으면 rpm 바이너리를 받아서 설치한다.
]#rpm -qa rsync
rsync-2.5.7-0.8
참고로 rsync 에 최근 보안 결함이 발견 되었으니 반드시 최근 버전을 받아서 설치하도록...
http://updates.redhat.com/8.0/en/os/i386/rsync-2.5.7-0.8.i386.rpm
]#rpm -Uvh rsync-2.5.7-0.8.i386.rpm
rsync 는 ssh 를 이용한 방법과 873포트를 이용한 접속 방법이 있다.
나는 873 포트를 이용해서 xinetd 데몬으로 동작하도록 설정한다.
초기에는 default 로 xinetd 에서 rsync 가 disable 로 설정되어있으므로
아래와 같이 열어준다.
]#vi /etc/xinetd.d/
# default: off
# description: The rsync server is a good addition to am ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no => (요부분을 yes 로...)
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
rsync 의 설정파일은 /etc/rsyncd.conf 인데 rsync 설치후에도 존재하지 않는다. 긴장하지 말고 생성해주면 된다.
백업할 대상은 /home 파티션과 /usr/local/mysql/data 디렉토리, 그리고 메일,proftp 등의 설정이 들어있는 /etc 전체로 했다.
]#vi /etc/rsyncd.conf
[www] =>rsync 에서 사용할 alias name
path = /home =>실제 디렉토리 절대 경로
comment = webservice-dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = ***.***.***.*** =>접근을 허용할 백업 서버 ip
max connections = 1
timeout = 300
[mysql]
path = /usr/local/mysql/data
comment = mysqldata-dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = ***.***.***.***
max connections = 1
timeout = 300
[etc]
path = /etc
comment = config-dir
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = ***.***.***.***
max connections = 1
timeout = 300
이렇게 해서 저장하면 설정은 끝났다.
슈퍼 데몬을 재시작하고
]#/etc/rc.d/init.d/xinetd restart
포트가 열려있는지 netstat 이나 telnet 명령으로 873포트를 확인해본다.
]#telnet localhost 873
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
@RSYNCD: 26
]#netstat -na | grep LISTEN
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
unix 2 [ ACC ] STREAM LISTENING 1285 /tmp/mysql.sock
873 포트가 보인다면 설정은 OK
이제 백업 당할 서버들의 설정은 끝났고, 1차 백업 서버를 세팅할 차례다.
백업할 서버 역시 rsync 가 설치 되어있는지 확인해보고 없으면 설치한다.
1차 백업 서버에 접속한 상태로 아까 세팅해 놓은 백업 당할 서버에 rsync
포트로 접속이 가능한지 테스트 해본다.
]#telnet ***.***.***.*** 873
Trying 127.0.0.1...
Connected to ***.***.***.***.
Escape character is '^]'.
@RSYNCD: 26
이렇게 대기 상태면 OK
만약 connect refuse 가 나오면 백업당할 서버의 세팅을 처음부터 다시 살펴본다.
이제 백업 과정을 기록할 로그 파일을 수동으로 만들것이다.
적당한 디렉토리( 예를 들면 /home/rsync-log)를 생성하고 파일을 기록할 수 있도록 권한을 조정한다.(좀 나은 방법이 있을텐데....허접한 관계로...)
cron 에 등록해서 하루에 1번 새벽 네시에 백업하기로 했으므로 우선
/etc/crontab 을 수정한다.
]#vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
01 4 * * * root run-parts /etc/cron.daily
00 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
/etc/cron.daily 디렉토리에 있는 놈들을 매일 새벽 4시1분에 실행 하도록 되었다.
이제 /etc/cron.daily 에 백업 스크립트만 생성하면 된다.
]#vi /etc/cron.daily/backup.sh
#!/bin/bash
startbackup=`date +%Y%m%d%H%M%S`
touch /home/rsync-log/$startbackup.start
rsync -avz ***.***.***.***::www /home/svr_92/www/
rsync -avz ***.***.***.***::mysql /home/svr_92/mysql/
rsync -avz ***.***.***.***::etc /home/svr_92/etc/
endbackup=`date +%Y%m%d%H%M%S`
touch /home/rsync-log/$endbackup.end
위의 설정은 백업을 시작할때 날짜를 이름으로 가지는 빈파일을 /home/rsync-log/ 에 생성하고 백업이 끝난후에 다시 같은 위치에 시간이 기록된 파일을 생성시켜서 나중에 백업에 걸린 시간을 비교할 수 있게 되어 있다.
-a는 아카이브 모드. 심볼릭 링크, 속성, 퍼미션, 소유권 등 보존
-v 전송 상태를 보여줌
-z 전송시 압축을 함.
rsync 에는 이 외에도 옵션이 많으므로 자세히 살펴볼 필요가 있다..!!
여기까지 해서 1차 백업 서버의 세팅이 끝났고, 이제 2차 백업 서버를 세팅할텐데........ 똑같으니까 생략한다.
참고로 내가 관리하는 20대의 서버에 40 GByte 정도의 데이터를 전송받는데
초기에 8시간 정도가 걸렸고, 그 이후 매일 실시되는 백업은 업데이트 과정이라서 매 5분 정도에 백업이 끝나는 것을 아까 백업하면서 기록한 rsync-log 로 확인 했다. 아마도 rsync 가 압축전송을 해서 이런 속도가 나오는것 같음..
5분만에 20대의 백업이 완료되다니....!!
/***********************************************************************/
* http://manblog.intizen.com/kjh0523/913370
[펌] 프로세스죽이기 (0) | 2004.07.07 |
---|---|
간단하게 ftp 에 접속하는법 (0) | 2004.07.06 |
[펌] 웹서버 동기화를 위한 rsync의 사용 (0) | 2004.07.05 |
리눅스 서비스에 있던것들 종류.. (0) | 2004.07.05 |
proftpd 로그 파일 지정 (0) | 2004.07.05 |
1 장 : rsync의 소개와 설치 | |
![]() | |
일반적으로 웹서비스를 시작하는 회사에서 사용자가 늘어감에 따라서 웹서버의 증설을 하는 경우 시스템 관리자가 첫번째로 맞닥뜨리는 문제중에 하나가, 각각의 웹서버에 있는 정보의 동기화입니다. 웹서버가 한대일경우는 이러한 문제로 고민할 필요가 없겠지만, 트래픽증가로 웹서버를 증설했을경우 각각의 웹서버로 매일 업데이트되는 정보를 일일이 올려준다면 정말 귀찮은 작업이 되겠죠? 그렇지만 걱정하지 마세요. 리눅스의 rsync가 이 문제를 간단하게 해결해 드릴테니까요. 눈치 빠른 분들은 rsync가 무엇인지 앞의 말들로 어느정도 이해 하셨으리라 봅니다. 간단하게 rsync는 여러대의 서버들이 동일한 정보를 가질수 있도록 해주는 서버동기화 프로그램이라고 할수있습니다. NT를 접해보신 분들이라면 미러링(mirroring)에 대해서 아실겁니다. 로컬에서는 특정하드디스크나 파티션의 정보를 다른 하드디스크나 파티션으로 동일하게 복제해주는것이죠. 미러링의 개념은 NT에만 국한된것은 아닙니다. NT에서 자체제공하는 옵션으로 미러링을 제공하듯이 리눅스에서도 rsync나 기타 다른 프로그램으로 미러링을 지원하죠. 물론 rsync는 로컬에서 로컬로는 미러링을 할수없지만, 로컬과 원격지의 미러링을 지원합니다. 보통 anonymous ftp서버나 웹서버의 미러링에 많이 쓰이죠. rsync의 개념이 대강 잡히시죠? 그럼 이제부터 rsync라는 녀석을 어떻게 설정해야할지, 또 어떻게 써야할지에 대하여 설명하겠습니다. 일반적으로 redhat배포판 6.2에는 rsync-2.4.1-2 버젼이, 또 7.1-kr에는 rsync-2.4.6-2버젼이 기본으로 깔려있습니다. 만약 없으시다면, http://rsync.samba.org/ftp/rsync/ 에서 최신판을 받아서 설치하세요. 우선 받으시면 컴파일을 하셔야겠죠?
|
|
|
간단하게 ftp 에 접속하는법 (0) | 2004.07.06 |
---|---|
[펌] rsync 의 미러링 기능을 이용한 백업 (0) | 2004.07.05 |
리눅스 서비스에 있던것들 종류.. (0) | 2004.07.05 |
proftpd 로그 파일 지정 (0) | 2004.07.05 |
Proftpd 접속 느릴때.... (0) | 2004.07.05 |
[펌] rsync 의 미러링 기능을 이용한 백업 (0) | 2004.07.05 |
---|---|
[펌] 웹서버 동기화를 위한 rsync의 사용 (0) | 2004.07.05 |
proftpd 로그 파일 지정 (0) | 2004.07.05 |
Proftpd 접속 느릴때.... (0) | 2004.07.05 |
iptables 마스커레이딩 환경에서 서비스 막기. (0) | 2004.07.02 |
Log 파일이 안남아서 첨에 당황함...
proftpd.conf 파일에서... 아래의 부분을 <Global 영역에 설정한 후 로그 생성됨
ExtendedLog /var/log/proftpd.log ALL
ALL 은 포맷이당... proftpd 사이트 참고요함..
[펌] 웹서버 동기화를 위한 rsync의 사용 (0) | 2004.07.05 |
---|---|
리눅스 서비스에 있던것들 종류.. (0) | 2004.07.05 |
Proftpd 접속 느릴때.... (0) | 2004.07.05 |
iptables 마스커레이딩 환경에서 서비스 막기. (0) | 2004.07.02 |
[kltp 펌]웹로그분석기 설치기 - Awstats (2) | 2004.07.02 |
현재 방화벽 환경 하에서 돌아가는 ftp 인데 "익명 계정" 은 접속을 처음부터 불허하고 있다.
계정사용자만 사용하는데(iptables 에서 허가된 ip 에서만) ftp 에 처음 접속시
로그인 창이 뜰때 까지 시간이 좀 걸리고,
로그인 하고 파일 List 가 뜰때까지 시간이 좀 걸렸다.
proftpd.conf 파일에서 아래와 같이 설정을 추가한 후, 데몬을 다시 시작하니 빨라짐 .. ^^
UseReverseDNS off
IdentLookups off
리눅스 서비스에 있던것들 종류.. (0) | 2004.07.05 |
---|---|
proftpd 로그 파일 지정 (0) | 2004.07.05 |
iptables 마스커레이딩 환경에서 서비스 막기. (0) | 2004.07.02 |
[kltp 펌]웹로그분석기 설치기 - Awstats (2) | 2004.07.02 |
[kltp 에서 펌]Apache 에서 DoS 공격 막기 (1.3.x 2.x 모두) (0) | 2004.07.02 |
FORWARD 로 막으니까 잘 됨..
아직 iptables 에 대한 이해가 떨어져서... 스크립트가 지저분 함..
msn 은 자료전송까지는 잘 되는데... 화상채팅 안되는듯...
아래는 /etc/init.d/iptables 에 저장한 내용...
# nat 로 내부 아이피 이용하기. (192.168.1.0 ~ 192.168.1.255)
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to-source 218.xxx.xxx.xx7
# ftp 허용 (21 번포트)
iptables -A FORWARD -p tcp --dport 21 -j ACCEPT
iptables -A FORWARD -p tcp --sport 21 -j ACCEPT
iptables -A FORWARD -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -p tcp --sport 20 -j ACCEPT
# ssh 허용 (22번 포트)
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --sport 22 -j ACCEPT
# telnet 허용 (23 번 포트)
#iptables -A FORWARD -p tcp --dport 23 -j ACCEPT
#iptables -A FORWARD -p tcp --sport 23 -j ACCEPT
# SMTP 허용 (25 번 포트)
iptables -A FORWARD -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -p tcp --sport 25 -j ACCEPT
# Time 서버 포트 허용(37 번 포트)
iptables -A FORWARD -p tcp --dport 37 -j ACCEPT
iptables -A FORWARD -p tcp --sport 37 -j ACCEPT
# NickName 허용(43 번 포트)
iptables -A FORWARD -p tcp --dport 43 -j ACCEPT
iptables -A FORWARD -p tcp --sport 43 -j ACCEPT
# Domain 포트 허용(53 번 포트)
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp --sport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --sport 53 -j ACCEPT
# HTTP 허용 (80 번 포트)
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 80 -j ACCEPT
# POP3 허용 (110 번 포트)
iptables -A FORWARD -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -p tcp --sport 110 -j ACCEPT
# ntp 허용 (123 번 포트)
iptables -A FORWARD -p tcp --dport 123 -j ACCEPT
iptables -A FORWARD -p tcp --sport 123 -j ACCEPT
# imap 허용 (143 번 포트)
iptables -A FORWARD -p tcp --dport 143 -j ACCEPT
iptables -A FORWARD -p tcp --sport 143 -j ACCEPT
# snmp 허용 (161 번 포트)
iptables -A FORWARD -p tcp --dport 161 -j ACCEPT
iptables -A FORWARD -p tcp --sport 161 -j ACCEPT
# https 허용 (443 번 포트)
iptables -A FORWARD -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -p tcp --sport 443 -j ACCEPT
# rsync 허용 (873 번 포트)
iptables -A FORWARD -p tcp --dport 873 -j ACCEPT
iptables -A FORWARD -p tcp --sport 873 -j ACCEPT
# imaps 허용 (993 번 포트)
iptables -A FORWARD -p tcp --dport 993 -j ACCEPT
iptables -A FORWARD -p tcp --sport 993 -j ACCEPT
# pop3s 허용 (995 번 포트)
iptables -A FORWARD -p tcp --dport 995 -j ACCEPT
iptables -A FORWARD -p tcp --sport 995 -j ACCEPT
# 네이트온 메신저 거부 (5004 번 포트)
iptables -A FORWARD -p tcp --dport 5004 -j ACCEPT
iptables -A FORWARD -p tcp --sport 5004 -j ACCEPT
# MSN 서비스 제어.... 1863 포트
iptables -A FORWARD -p tcp --dport 1863 -j ACCEPT
iptables -A FORWARD -p tcp --sport 1863 -j ACCEPT
iptables -A FORWARD -d 207.46.110.0/25 -j ACCEPT
iptables -A FORWARD -d 207.46.104.20 -j ACCEPT
# 연결된 상태에 대한 수신 허용
# 이 부분 없애니까 FTP 송수신에 문제 생김... 반드시 RELATED 해줘야 함...
# 특정 서비스와 연관된 포트는 허용하는 것 같음...
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 위에 열어준 서비스 이외의 모든 포트 막기.
iptables -A FORWARD -p tcp -j DROP
proftpd 로그 파일 지정 (0) | 2004.07.05 |
---|---|
Proftpd 접속 느릴때.... (0) | 2004.07.05 |
[kltp 펌]웹로그분석기 설치기 - Awstats (2) | 2004.07.02 |
[kltp 에서 펌]Apache 에서 DoS 공격 막기 (1.3.x 2.x 모두) (0) | 2004.07.02 |
[펌] 인터넷 보안 방화벽( Firewall) 시스템 (0) | 2004.07.02 |
웹로그분석기 설치기 - Awstats 글쓴이 : 문용우 (2004년 03월 03일 오전 10:56) 읽은수: 2,667 [ 아파치 # 트랙백(0) ![]() ![]() |
![]() # HowTo - Awstats 웹로그 분석 설치 # # # # 2004.03.03 linuxxer # # # #################################### * Webalizer 를 많이 사용하시지만 awstats는 좀더 화려한(?) 인터페이스와 다양한 정보를 제공해줍니다. [목차] 1. 준비사항 2. Setup / Configure 3. Complete 1. 준비사항 프로젝트 싸이트 : http://awstats.sourceforge.net 다운로드 : http://awstats.sourceforge.net/files/awstats-6.1.tgz 웹로그분석이기 때문에 Web Server는 이미 설치가 되어 있어야 합니다. ( Apache 설치문서는 많이 있기 때문에 별도 설명을 하지 않음을 양해해 주시기 바랍니다. ) 2. Setup / Configure 다운로드 받은 압축파일을 푸시면 docs 디렉토리안에 *.html 파일들이 Install 방법과 Plug-in사용법등 다양하게 정보를 같이 제공하고 있읍니다. (프로젝트 홈페이지에 Install 방법 없읍니다. 꼭 *.html 을 보세요.) tar xvfz awstats-6.1.tgz mv awstats-6.1/ /usr/local/awstats chmod 755 /usr/local/awstats mkdir /etc/awstats mkdir /var/lib/awstats cd /usr/local/awstats/tools ./configure.pl (3가지정도를 물어보는데 잘 읽어보시면 뭔말인지 아실겁니다.) 만일 요기까지 잘 따라 하셨다면 에러가 없을겁니다. configure.pl 을 잘 실행 시키셨다면 자신이 정한 name으로 awstats.[정한 name].conf 파일이 생성되어 있을겁니다. 이 파일을 여서서 52라인으로 가보시면 LogFile="/var/log/httpd/mylog.log" 되어 있읍니다. 이것을 LogFile="[자신이 사용하는 웹서버의 access 로그]" 를 지정하시면 됩니다. 제가 사용하는 예를 보여드리면 LogFile="/usr/local/apache/logs/access_log" 사용하고 있읍니다. :wq /usr/local/awstats/tools/ 아래보시면 httpd_conf 파일이 있읍니다. 이 파일을 vi로 여셔서 내용전체를 웹서버가 설치된 conf/httpd.conf 파일의 맨 하단에 붙여넣으시면 됩니다. :wq 3. Complete 간단하게 다 되었읍니다 ^^ 이제 웹브라우져로 확인을 해봐야겠죠! http://[웹서버]/awstats/awstats.pl?config=[자신이 정한 name] 한글화도 아주 잘 되어 있읍니다. 자... 웹로그분석이니 Cron 작업도 빼 먹으면 안되겠죠? vi /etc/crontab 하셔서 0-59/6 * * * * root /usr/local/awstats/wwwroot/cgi-bin/awstats -update -config=[자신이 정한 name] :wq 로그분석 시간간격은 조정하시면 됩니다. ************************************** 관련 문의 사항은 : linuxxer@chollian.net |
Proftpd 접속 느릴때.... (0) | 2004.07.05 |
---|---|
iptables 마스커레이딩 환경에서 서비스 막기. (0) | 2004.07.02 |
[kltp 에서 펌]Apache 에서 DoS 공격 막기 (1.3.x 2.x 모두) (0) | 2004.07.02 |
[펌] 인터넷 보안 방화벽( Firewall) 시스템 (0) | 2004.07.02 |
[펌] 웹 로그 통계 내기 - AWStats (0) | 2004.06.30 |
Apache 에서 DoS 공격 막기 (1.3.x 2.x 모두) 글쓴이 : 좋은진호 (2003년 08월 29일 오후 06:55) 읽은수: 3,854 [ 아파치 # 트랙백(0) ![]() ![]() |
![]() 작성일 : 2003.8.20(수) apache v1.3.x 수정일 : 2003.8.25(월) apache v2.x 부분 추가 특정 URL이나 IP일 경우나 특정한 브라우저를 이용하여 DoS(Denial of Service, 서비스거부) 공격이 들어온다면 httpd.conf 에서 SetEnvIf, SetEnvIfNoCase 등과 Allow, Deny 설정으로 간단히 막을 수 있겠지만 일정한 유형이 없다면 해결점을 찾기가 쉽지 않다. 다행히 Apache용 mod_dosevasive 모듈로 DoS 공격을 쉽게 막을 수 있다. 며칠전 1.7버전 발표로 apache 2.x에서도 정상적으로 이 모듈을 이용할 수 있게 됐다. 1. mod_dosevasive 설치 http://www.nuclearelephant.com/projects/dosevasive/ 에서 mod_dosevasive (현재 최신버전은 1.7)을 받아온다. 1) 기존에 사용하던 apache 1.3.x에 모듈만 추가할 때 mod_dosevasive.tar.gz 을 푼다음 apxs로 설치 ---------------------------------------------- # tar xvfz mod_dosevasive.tar.gz # cd dosevasive # /bin/apxs -iac mod_dosevasive.c ... [activating module `dosevasive' in /usr/local/apache/conf/httpd.conf] cp mod_dosevasive.so /usr/local/apache/libexec/mod_dosevasive.so chmod 755 /usr/local/apache/libexec/mod_dosevasive.so ... ---------------------------------------------- httpd.conf의 LoadModule, AddModule는 apxs가 알아서 추가해준다. 2) apache 1.3.x부터 새로 컴파일할 할 때 mod_dosevasive.tar.gz 을 apache_source_홈/src/modules 에 푼 다음 기존에 apache 컴파일하는 것과 동일한 방법으로 하되, --add-module=... 옵션만 추가해준다. ---------------------------------------------- ./configure --prefix=/usr/local/apache \ --enable-module=all --enable-shared=max \ --add-module=src/modules/dosevasive/mod_dosevasive.c <-- 추가함 make make install ---------------------------------------------- 3) apache 2.x에 모듈만 붙일 때 /bin/apxs -iac mod_dosevasive20.c 2. 설정 httpd.conf 에 아래 설정이 있는지 확인한다. apache 1.3.x ---------------------------------------------- ... LoadModule dosevasive_module libexec/mod_dosevasive.so ... AddModule mod_dosevasive.c ---------------------------------------------- apache 2.x ---------------------------------------------- LoadModule dosevasive20_module modules/mod_dosevasive20.so ---------------------------------------------- httpd.conf에는 다음과 같이 설정을 추가한다. ( 단, 아래 설정 중에 apache 2.x일 때는 < IfModule mod_dosevasive20.c> 로 ) ---------------------------------------------- < IfModule mod_dosevasive.c> DOSHashTableSize 3097 DOSPageCount 3 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 30 < /IfModule> ---------------------------------------------- DOSHashTableSize 3097 hash table의 크기. IP, URI등을 분석하기 위한 공간으로 쓰이는 것 같은데 정확히는 모르겠다. 접속이 많은 서버이면 수치를 높인다. DOSPageCount 3 DOSPageInterval 1 DOSPageInterval에서 지정한 시간(초단위)동안 같은 페이지를 3번 요청한 경우 해당 클라이언트 IP를 블럭킹한다. 블럭킹되는 동안에 사용자에게는 403(Forbidden) 코드가 전송된다. DOSSiteCount 50 DOSSiteInterval 1 DOSSiteInterval에서 지정한 시간동안 어느 페이지나 이미지든 요청 건수가 50번을 넘는 경우 해당 클라이언트 IP를 블럭킹한다. 403코드 보내는 것은 마찬가지. HTML 내에 이미지가 10개이면 요청 건수는 HTML포함하여 11번이 되므로 이미지가 많은 사이트는 숫자를 크게한다. DOSBlockingPeriod 30 블럭킹된 IP는 30초동안 접속을 할 수 없다. 3. 모듈 사용을 중지하려면 차단 기능을 이용하지 않기 위해 DOSPageCount 0 DOSSiteCount 0 와 같이 하면 모듈 내부의 default값을 이용해서 동작하므로 LoadModule, AddModule를 주석 처리하는 방법을 써야한다. 또는 Count값을 상당히 큰 수를 지정할 수도 있겠다. 4. 차단하는지 테스트 간단한 테스트 툴로 test.pl을 제공한다. 12번째 줄에 printf("%03d ", $_ ); 를 추가하고 apache를 실행시킨 다음 perl test.pl을 해보면 200 OK, 403 Forbidden 된 것을 쉽게 확인할 수 있을 것이다. DOSPageCount, DOSSiteCount 수치를 너무 낮게 하면 정상적인 접속에 대해서도 차단될 수 있으므로 주의해야 한다. 수치를 낮추고, 같은 페이지를 reload(Ctrl+R)를 여러번했더니 바로 403 페이지가 등장. 403 페이지를 별도로 만드는 것이 좋을 듯 싶다. httpd.conf에 ErrorDocument 403 ... 설정 으로 html을 만들어두면 방문자에게 도움이 되지 않을까... 이젠 ab, lynx 등으로 게시물 조회수를 순간적으로 올린다거나, 시스템 로드를 증가시키는 것까지도 어느정도 막을 수 있을 것이다. ※ syslog 로 로그 남기는 기능과 DOSEmailNotify, DOSSystemCommand 옵션은 제대로 적용 되지 않아 이 글에 적지 않았다. 정상동작이 확인되면 그 때 추가할 것이다. |
iptables 마스커레이딩 환경에서 서비스 막기. (0) | 2004.07.02 |
---|---|
[kltp 펌]웹로그분석기 설치기 - Awstats (2) | 2004.07.02 |
[펌] 인터넷 보안 방화벽( Firewall) 시스템 (0) | 2004.07.02 |
[펌] 웹 로그 통계 내기 - AWStats (0) | 2004.06.30 |
[펌] 고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 (0) | 2004.06.30 |
1. 서 론
2. 방화벽시스템의 기본개념
2-2. 방화벽시스템의 기본 구성요소
3. 시스템 구축방안
인터넷은 미국 국방성에서 개발한 TCP/IP(Transmission Control Protocol/Internet Protocol) 을 사용하는 네트웍들의 네트웍으로서, 전세계적으로 수천 개의 네트웍과 수 백만대의 호스트로 연결된 네트웍이다. 초기에는 학교, 연구소 등을 접속한 학술 및 연구망으로 활용되다가 최근에는 상용망으로 확장되었다.
TCP/IP 네트웍 프로토콜 구조는 전세계의 정보 자원에 대해 이기종간 효율적인 상호 접속을 제공하는 연동을 보장하지만, UNIX 시스템과 통신 유틸리티의 소스 개방으로 인하여 여러 가지 보안상의 문제점을 가지고 있어서, 침입자에 의한 피해 사례가 계속해서 증가하고 있는 실정이다.
인터넷 가입 기관의 시스템이나 네트웍에 피해를 주는 사례는 Telnet을 통한 네트웍 침입 이용뿐만 아니라 침입 후에 시스템에 대한 여러 가지 불법적인 행위, Internet Worm과 같은 불법 프로그램 유통 등 여러 가지 사례들이 보고되고 있다. 이러한 침해 사례는 유형에 따라 예방하고 막을 수 있는 방법을 계층적으로 모델을 세우는 방법들이 연구되고있으며, 해당 계층에 대한 실질적인 보안 도구 개발, 보안 사고에 대비한 보안 정책과 절차를 제시하는 연구 개발, 그리고 IETF(Internet Engineering Task Force) SAAG(Security Area Advisory Group) 산하의 여러 보안 작업 그룹은 각종 보안 서비스를 제공하는 네트웍 응용 프로그램 개발 등 여러 분야에서 연구 개발이 진행되고 있다.
최근 인터넷 보안 관련 시스템 중에서 특정 기관의 보안 사고를 막을 수 있는 방화벽(Firewall) 시스템에 대한 연구 개발 및 구축이 활발하게 진행되고 있다. 방화벽 시스템은 기관의 보안 정책에 따라 인가된 인터넷 서비스에 대한 액세스는 허용하고, 인가되지않은 서비스에 따르는 트래픽을 철저하게 막음으로써 효율적인 보안 서비스를 제공하도록 한다. 물론 이 방화벽 시스템을 구현하는 것이 기관의 보안을 완전하게 보장하지는 않지만, 가장 효과적이고 비용이 비교적 적게 드는 방법이라고 할 수 있다. 본 고에서는 보안 취약성으로부터 호스트를 보호하는 방법으로서의 방화벽 시스템의 기본 개념과 방화벽 시스템 구성요소, 방화벽 시스템 제품, 그리고 참고문헌을 소개하고자 한다.
방화벽의 원래 의미는 건물에서 발생한 화재가 더 이상 번지는 것을 막는 것이다. 이 의미를 인터넷에 적용한다면, 이는 네트워크의 보안 사고나 위협이 더 이상 확대되지 않도록 막고 격리하는 것이라고 할 수 있다. 이는 특히 어떤 기관의 내부 네트워크를 보호하기 위해서는 외부에서의 불법적인 트래픽이 들어오는 것을 막고, 허가하거나 인증된 트래픽만 허용하는 적극적인 방어 대책이라고 할 수 있다.
[그림 1] 인터넷 접속과 위험 지대(Zone of Risk)
방화벽 시스템의 기본 목표는 네트워크 사용자에게 가능한 한 투명성을 보장하면서 위험 지대를 줄이고자 하는 적극적인 보안 대책을 제공하는 것이다. 다음 [그림 1]은 일반적인 인터네트에 접속되어 있는 네트워크를 나타내고 있는데, 외부와의 투명한 접근을 허용하므로 서 내부 망 전체가 위험 지대임을 보여주고 있으며, [그림 2]의 경우는 외부와 내부 네트워크간의 유일한 경로에 방화벽 시스템을 둠으로써 방화벽 시스템이 보안 서비스를 제공하여 불법적인 트래픽을 거부하거나 막을 수 있는 것이다. 물론 투명성을 보장하지는 않지만 내부 네트워크를 안전지대로 만들 수 있는 것이다.
[그림 2] 방화벽 시스템의 개념
방화벽 시스템의 구축은 호스트에 대한 보안을 강화시킴으로써 사이트에 많은 이점을 제공한다. 방화벽을 구축,사용함에 있어서의 이점을 요약하면 다음과 같다.
가. 위협에 취약한 서비스에 대한 보호
방화벽은 네트워크에 대한 보안을 강화하고, 기본적으로 안전하지 않은 서비스를 필터링(filtering)함으로써 서브넷 상에 있는 호스트에 위험을 감소시킬 수 있다. 즉, 단지 선택된 프로토콜만이 방화벽을 통과시키므로 서 서브넷 네트워크 환경은 위험에 덜 노출되게 된다.
나. 호스트 시스템에 대한 액세스 제어
방화벽은 또한 호스트 시스템에 대한 액세스를 제어할 수 있다. 예를 들면, 외부 네트워크에서 내부 네트워크에 있는 호스토로 접속하고자 할 때, 원하지 않는 액세스는 차단할 수 있다. 따라서 사이트는 메일 서버나 NIS같은 특별한 경우를 제외하고 외부로부터의 액세스를 차단할 수 있다.
다. 보안의 집중
방화벽은 대부분의 수정된 소프트웨어와 추가되는 보안 소프트웨어를 여러 호스트에 분산시키는 것과는 달리 원하는 호스트에 방화벽을 설치할 수 있다는 점에서 실제적으로 경제적일 수 있다. 특별히, 일회용(one-time) 패스워드 시스템과 그 밖의 추가적인 인증 소프트웨어를 방화벽에 설치할 수 있다.
[그림 3] 일회용 패스워드 시스템
라. 확장된 프라이버시
프라이버시는 대체적으로 해가 되지 않는 것으로 생각되는 정보가 실제로 공격에 유용하게 사용할 수 있는 실마리를 제공할 수 있기 때문에 어떤 사이트에서는 중요시 된다. 방화벽을 사용하면, 원하는 사이트는 finger와 DNS(Domain Named Service)와 같은 서비스를 막을 수 있다. finger는 마지막 로깅 시간과 메일과 다른 아이템을 읽었는지와 같은 사용자 정보를 알려준다. 그러나, finger는 침입자에게 시스템이 얼마나 자주 사용되는지, 시스템에 연결된 유저가 있는지, 그리고 침해될 수 있는 지에 관한 정보를 알려줄 수 있다.
방화벽은 또한 사이트 시스템에 관한 DNS 정보를 막을 수 있다. 그래서 사이트 명과 IP 주소를 인터넷 호스트이 사용할 수 없게 해준다. 원하는 사이트는 이러한 정보를 막음으로써 침입자에 유용한 정보를 숨길 수 있다.
마. 네트워크 사용에 대한 로깅과 통계자료
시스템에 대한 모든 액세스가 방화벽을 통과 한다면, 방화벽은 액세스를 로그할 수 있고, 네트워크 사용에 대한 유용한 통계 자료를 제공한다. 의심이 가는 활동에 대해 적절한 경고 기능을 제공하는 방화벽은 방화벽과 네트워크가 침입 시도를 받고 있는지 또는 침입 되었는지에 대한 세부 사항을 제공해 준다.
바. 정책 구현
방화벽은 네트워크 액세스 제어 정책에 대한 구현을 제공한다. 사실상, 방화벽은 사용자와 서비스에 대한 액세스를 제어할 수 있다. 그래서, 네트워크 액세스 정책은 방화벽에 의해서 구현될 수 있다. 그러나 방화벽이 없다면, 이러한 정책들은 전적으로 사용자의 협조에 의존해야 한다. 사이트에서는 사용자의 협조에 의존할 수도 있으나 일반적으로 인터넷 사용자에게는 의존 할 수 없다.
방화벽 시스템에 대한 여러 토론 그룹에서는 방화벽 시스템에 대한 일반적인 용어 정의 및 개념을 규정하였다. 그리고 방화벽 시스템이 가지는 여러 가지 기능과 보안 대처 수준에 따라 여러 가지 유형의 방화벽 시스템이 존재할 수 있다. 여기서는 일반적인 방화벽 시스템의 구성요소에 대하여 기술한다.
가. 네트워크 정책(Network Policy)
방화벽 시스템의 설계, 설치, 사용에 직접적으로 영향을 줄 수 있는 두 가지 레벨의 네트워크 정책이 있다. 상위-레벨 정책은 명확한 내용 즉, 제한된 네트워크로부터 서비스를 허용할 것인가 또는 명확하게 거부할 것인가를 정의하는 네트워크 액세스 정책, 이러한 서비스를 어떻게 사용할 것인가, 그리고 이러한 정책의 예외 조건 등을 말한다. 하위-레벨 정책은 어떻게 방화벽이 실질적으로 액세스를 제한하고 상위-레벨 정책에서 정의한 서비스를 필터링할 것인가에 대한 사항이다.
나. 방화벽 시스템의 사용자 인증 시스템(Advanced Authentication)
방화벽 시스템은 한 기관의 네트워크 전체를 보호해야 하므로 일반적으로 유닉스 시스템에서 사용되는 단순한 패스워드로 사용자를 인증하는 방법을 사용하지 않는다. 좋은 인증 수단으로 스마트카드(Smartcards), 인증 토큰(Authentication tokens), Biometrics, 그리고 소프트웨어 메커니즘 등을 사용한다. 현재 많이 사용하고 있는 우수한 인증 시스템으로는 일회용 패스워드이다. 즉 매번 사용자가 로그인을 시도할 때 마다 매번 새로운 패스워드를 이용하는 것으로, 이는 침입자가 최근 이용하고 있는 sniffer에 의한 패킷 가로채기를 통해 시스템의 사용자ID와 패스워드를 알아내서 침입하는 것을 근본적으로 막아준다.
다.패킷 필터링(Packet Filtering)
IP 패킷 필터링은 통상 라우터 인터페이스를 지나는 패킷을 필터링하기 위해 설계된 패킷 필터링 라우터(packet filtering router)에 의해 행해진다. 패킷 필터링 라우터는 IP 패킷중 다음을 전부 또는 일부를 필터링할 수 있다.
- source IP address
- destination IP address
- TCP/IP source port
- TCP/IP destination port
라. 응용 계층 게이트웨이(Application Level Gateway)
응용 계층 서비스는 축적전달(Store-and-Forward) 방법을 사용하는 경우가 많은데, 이는 게이트웨이에서 수행하는 방법과 같다. 게이트웨이는 송신자 응용 서비스가 보내는 정보를 그대로 전달하면 되는 것이다. 실제로 이 게이트웨이에서는 보안을 위한 특별한 서비스가 제공된다. 예를 들어 내부와 외부간의 모든 응용 레벨의 트래픽에 대해 로깅이나, Telnet이나 FTP 등에서 사용자 인증이 필요한 경우에 우수한 인증 방법을 사용한다. 이 응용 계층의 게이트웨이 기능은 프럭시 서버(Proxy Server)라는 서버 기능을 제공하게 된다. 예를 들어 외부의 전자우편 클라이언트가 내부의 어떤 호스트내 전자우편 서버와 접속하기를 원하면, 중간에 프럭시 서버가 이를 받아 다시 내부의 서버에게 전달하는 방식이 된다.
[그림 4] 응용 레벨 게이트웨이
마. 스크린 라우터(Screen Router)
어떤 기관이 인터넷에 접속할 경우 라우터(Router)라는 인터넷 패킷을 전달하고 경로배정(Routing)을 담당하는 장비를 사용하게 된다. 이러한 라우터는 단순 장비가 아니라 패킷의 헤더 내용을 보고 필터링(스크린)할 수 있는 능력을 가지고 있다. 네트워크 레벨의 IP(Internet Protocol) 데이터그램에서는 출발지 및 목적지 주소에 의한 스크린, TCP(Transmission Control Protocol) 레벨의 패킷에서는 네트워크 응용을 판단하는 포트(Port) 번호에 의한 스크린, 프로토콜별 스크린 등의 기능을 제공하게 된다. 이 스크린 라우터만으로도 어느 정도 수준의 보안 접근 제어를 통해 방화벽 시스템 환경을 구현할 수 있으나 라우터에서 구현된 펌웨어의 수준으로는 제한점이 많고 복잡한 정책을 구현하기 어려우므로 보통 스크린 라우터와 다음에서 설명하는 베스쳔 호스트를 같이 운영한다.
[그림 5] 스크린 라우터
바. 베스쳔 호스트(Bastion Hosts)
베스쳔 호스트는 방화벽 시스템이 갖는 기능 중 가장 중요한 기능을 제공하게 된다. 원래 베스쳔(Bastion)은 중세 성곽의 가장 중요한 수비부분을 의미하는데, 방화벽 시스템 관리자가 중점 관리하는 시스템이 된다. 그래서 방화벽 시스템의 중요 기능으로서 액세스 제어 및 응용 시스템 게이트웨이로서 프럭시 서버의 설치, 인증, 로그 등을 담당하게 된다. 그러므로 이 호스트에는 외부의 침입자가 주로 노리는 시스템이 므로 일반 사용자의 계정을 만들지 않고 해킹의 대상이 될 어떠한 조건도 두지 않는 가장 완벽한 시스템으로서 운영되어야 한다. 현재 판매되고 있는 방화벽 시스템은 이러한 베스쳔호스트를 제공하는 것이라고 보면 된다.
사. 이중 네트워크 호스트(Dual-Homed Hosts)
이중 네트워크 호스트는 2개 이상의 네트워크에 동시에 접속된 호스트를 말하며 보통 게이트웨이 호스트라는 시스템이다. 2개의 네트워크는 외부 네트워크와 내부 네트워크를 의미하고, 이 두 네트워크간의 유일한 패스를 제공하도록 조정된다. 즉 동적인 경로 배정과 경로 정보 전달을 배제하므로 모든 내.외부 트래픽은 이 호스트를 통과하도록 하여 베스쳔 호스트의 기능을 여기에 구현하는 것이다.
[그림 6] 이중 네트워크 호스트
아. 스크린 호스트 게이트웨이(Screen Host Gateway)
스크린 호스트 게이트웨이 개념은 이 시스템을 내부 네트워크에 두어 스크린 라우터가 내부로 들어가는 모든 트래픽을 전부 스크린 호스트에게만 전달되도록 하겠다는 것이다. 또한 스크린 라우터는 내부에서 외부로 가는 모든 트래픽에 대해서도 스크린호스트에서 출발한 트래픽만 허용하고 나머지는 거부하게 된다. 그래서 내부와 내부네트워크사이의 경로는 외부 네트워크 - 스크린 라우터 - 스크린 호스트 - 내부 네트워크 이외의 경로는 결코 허용하지 않게 된다. 이 스크린 호스트도 결국 베스쳔 호스트, 이중 네트워크 호스트의 개념이 집합된 시스템이다.
[그림 7] 스크린 호스트 게이트웨이
자. 스크린 서브넷(Screen Subnet)
스크린 서브넷은 일명 DMZ(DeMiliterization Zone)의 역할을 외부 네트워크와 내부 네트워크사이에 두겠다는 것으로서 완충 지역 개념의 서브넷을 운영하는 것이다. 여기에 스크린 라우터를 이용하여 이 완충 지역을 곧장 통과 못하게 하지만 외부 네트워크에서도 내부 네트워크에서도 이 스크린 서브넷에 접근할 수는 있다. 특히 어떤 기관에서 외부로 공개할 정보 서버(Information Server), 즉 익명FTP서버, 고퍼(Gopher) 서버, 월드와이드웹(WWW) 서버 등을 여기에서 운영하면 된다.
[그림 8] 스크린 서브넷
차. 암호 장치(Encryption Devices)
암호 장치는 어떤 기관의 네트워크가 공공의 인터넷을 통해 여러 지역으로 분산되어 있을 경우에 적합하다. 즉 어떤 본사 네트워크가 방화벽 시스템을 구축하였을 때 지역적으로 떨어진 지점 네트워크도 본사 네트워크처럼 보호되어야 하는 것이다. 이 경우 본사와 지점 네트워크간에 인터네트로 연결되었다면 안전을 보장하기 어려우므로 두 지점 사이를 암호 장비를 이용하여 가상 사설 링크(VPL, Virtual Private Link)로 만들어 운영하면 된다. 그러므로 서 두 개의 네트워크는 하나의 안전한 네트워크로 만드는 것이다. 종단간 암호 방식은 데이터나 패스워드 등이 도청 되는 것을 막는 방식을 원하는 사설 백본(Private Backbone)에 여러 인터넷 접속점을 가진 기관에서 유용할 것이다.
[그림 9] 암호 장치
방화벽 시스템을 구축하는 개념에는 2가지 유형 즉,
* 네트워크 레벨(Network Level) 방화벽 시스템,
* 응용 레벨(Application Level) 방화벽 시스템
이 있다. 이러한 2가지 유형에 대해 어떤 것이 좋고 어떤 것이 나쁘다는 식의 판단을 내리기는 어려운 점이 있지만 기관의 요구사항에 어떤 것이 부합되는지를 잘 판단해야 한다.
네트워크 레벨의 시스템은 IP 패킷의 Source/Destination 주소와 포트에 의해 결정된다. 단순한 라우터는 낡은 방식의 네트워크 레벨 방화벽을 제공하는데, 이것은 어떤 패킷이 동작하는지 어떠한 네트워크에서 왔는지를 판단해야 하는 복잡한 규칙에 대해 판단하기 어렵다. 하지만 현재의 네트워크 레벨 방화벽은 매우 복잡해져서 허용된 접속들의 상태와 어떤 종류의 데이터 내용 등을 관리할 수 있다.
한가지 중요한 차이점은 네트워크 레벨 방화벽이 라우트를 직접 제어할 수 있으며, 할당된 IP 블럭을 정당하게 사용할 수 있도록 해준다는 점이다. 네트워크 레벨 방화벽은 매우 빠르며, 사용자에게 투명한 서비스를 보장한다.
* 네트워크 레벨 방화벽의 사례 : "스크린 호스트 방화벽" 이라고 할 수 있으며, 호스트에 대한 액세스 제어가 네트워크 레벨에서 동작하는 라우터에서 이루
어지며, 이때의 호스트가 베스쳔 호스트이다.
* 네트워크 레벨 방화벽의 사례 : "스크린 서브넷 방화벽"으로 구현될 수 있으며 이것은 네트워크 레벨에서 동작하는 라우터가 하나의 전체 네트워크에 대한
액세스 제어를 할 수 있음을 말한다. 스크린 호스트의 네트워크란 점만 빼면 스크린 호스트와 유사한다.
응용 레벨 방화벽은 2개의 네트워크 간에 항상 직접적인 트래픽을 막고, 트래픽에 대해 로그, Audit 기능 등이 지원되는 프락시를 실행하는 기계를 말한다. 프락시 응용은 방화벽의 소프트웨어 부분이므로 많은 로그와 액세스 제어 기능을 제공하는 것이 좋다. 응용 레벨 방화벽은 주소 번환기로서 사용될 수 있다. 어느 한 쪽에서 들어와 다른 쪽으로 나가기 때문에 처음 시도한 접속에 대해 효과적인 마스킹할 수 있다. 이렇게 중도에 응용을 가지는 것은 어떤 경우에는 성능에 문제를 가질 수 있으며, 투명성이 보장되지 않는다. TIS 툴킷 등에 구현된 것과 같은 초기 응용 레벨 방화벽은 일반 사용자에게 투명하지도 않으며, 어떤 연습이 필요하다. 최근의 응용 레벨 방화벽은 투명성이 보장되며, 보다 상세한 감사 보고와 네트워크 레벨 방화벽보다 보다 안전한 보안 모델을 제공하고 있다.
* 응용 레벨 방화벽 사례 : "이중 네트워크 게이트웨이가 있을 수 있으며, 프락시를 실행하는 고도의 보안 기능이 제공되는 시스템이다. 이것은 2개의 네트
워크 인터페이스를 가지고 하나의 네트워크 인터페이스에 대해서는 모든 트래픽이 그냥 통과되는 것을 막는다.
미래의 방화벽 시스템은 네트워크 레벨과 응용 레벨 방화벽의 혼합형에 해당된다. 이는 네트워크 레벨에서는 보다 상위의 기능을 가지려 하고 응용 레벨에서는 보다 하위 기능을 갖고자 하기 때문이다. 최종 결과는 아마 매우 빠른 패킷 스크린 기능과 모든 트래픽에 대한 로그와 감사 등이 예측되며, 특히 네트워크를 통해 전달되는 트래픽의 보호를 위해 암호 기법이 사용될 것이다.
앞에서 설명한 구성요소를 가지고 실질적으로 방화벽 시스템에서 요구하는 대부분의 기능을 구현할 수 있는데, 방화벽 시스템의 가장 중요한 목적인 내부 네트워크의 보호라는 관점에서 다음의 고려 사항을 염두에 두고 방화벽의 설계 및 사양을 작성하거나, 구현 혹은 설치를 어떻게 할 것인지를 판단해야 한다.
첫째, 가장 중요한 관심사로서 해당 조직이 어떻게 시스템을 운영할 것인지에 대한 정책을 반영하는 것으로서, 매우 중요한 네트워크에서의 작업을 제외하고는 모든 접속을 거부하는 식의 시스템을 운영할 것인가 아니면 덜 위협적인 방법으로 접속해 오는 트래픽에 대해 조사하고 점검하는 방식으로 시스템을 운영할 것인가라는 선택을 할 수 있다. 이러한 선택은 보안 결정권자에 달려있다.
둘째, 어느 정도 수준의 감시, 백업 및 제어를 원하는가 라는 문제이다. 첫번째 문제로서 기관이 받아들일 수 있는 위험 수준이 세워졌다면, 이제 어떤 것을 감시하고, 허용하고, 거부할 것인가라는 체크리스트를 작성해야 한다. 즉, 기관의 전체적인 목적을 결정하고 위험 평가에 근거한 필요성 분석을 하며, 구현하고자 계획하여 사양을 마련했던 목록과 구별될 수 있는 문제점을 가려낸다.
셋째, 경제적인 문제이다. 우리가 여기에서 정확하게 지적할 수 있지는 못하지만 이것을 구매하는데 드는 비용과 구현에 드는 비용을 정확하게 정량적으로 산출하는 것이 중요하다. 예를 들어 완전한 방화벽 제품의 구매 비용은 무료에서 100,000 달러에 이를 수 있으며, 방화벽 시스템의 우선 설치 및 구현에 드는 비용 뿐 아니라 지속적으로 드는 비용과 지원비 등을 계산해야 한다.
넷째, 기술적인 측면에서 몇 가지 결정해야 할 것이 있는데, 기관 내부의 네트워크와 네트워크 서비스 제공자 사이에서의 고정적 트래픽 라우팅 서비스 등에 대해서도 결정하야 한다. 트래픽라우팅은 라우터에서의 IP 수준의 스크린 규칙이나 혹은 프락시게이트웨이나 서비스에서의 응용 수준 등에서 구현되어야 한다.
다섯째, telnet, ftp, news 등의 프락시를 설치되는 외부에 노출된 기계가 외부 네트워크에 둘 것인가 혹은 하나 이상의 내부 기계와 통신을 허용하는 필터링으로서의 스크린 라우터를 만들 것인가를 결정해야 한다. 각각의 접근 방식은 장단점이 있는데, 프락시 기계가 고급 수준의 기록성과 잠재적인 보안 기능을 많이 구현해야 하는 만큼 또한 비용이 많이 요구되기 때문이다. 프락시는 요구되는 서비스 마다 따로 설계되어야 하며, 편리성과 보안에 드는 비용은 상대적이다.
그리고 앞의 내용과 중복되기는 하지만 다음 사항도 고려해야 한다.
- 손실 제어(Damage Control) : 방화벽 시스템이 침해 당할 수 있다면, 내부 네트워크로 들어오기 위해 어떤 취약점들이 이용될 수 있으까?
- 위험 지역(Zone of risk) : 일반적인 관리 상황에서 위험이 있는 곳이 얼마나 큰가? 이 것의 측정은 외부에서 손쉽게 접근 가능한 내부망의 호스트 수와 라우터 수이다.
- 시스템 실패 환경(Failure mode) : 만약 방화벽 시스템이 침해 당한다면 얼마나 쉽게 이것을 탐지할 수 있는지, 얼마나 쉽게 미리 감지되어지는지, 침투 수법, 경로 등을 검사하는데 필요한 정보가 얼마나 남아 있을 수 있는지를 검토한다.
- 쉬운 이용 환경(Ease of use) : 일반 사용자가 사용할 경우 방화벽 시스템이 얼마나 불편함을 주는지를 고려한다.
- 기본 입장(Stance) : 자신의 기관에서 설치할 방화벽 시스템의 기본적인 구축 개념이 무엇인지를 정확하게 정의해야 한다. 즉 네트워크 레벨의 방화벽을 구현할 것인가, 아니면 응용 레벨의 방화벽을 구현할 것인가 하는 것을 말한다.
현재 어떤 기관이 인터넷에 연동할 때 가장 효과적인 보안 대책은 방화벽(Firewall)을 설치하는 것라고 할 수 있지만, 방화벽의 상용 제품은 하드웨어 플랫폼, 컨설팅, 네트워크 재 설계 등으로 인한 비용이 많이 된다. 따라서 비용에 해당하는 완벽한 보안 해결책을 제공받을 수 있는지 의문이 있을 수 있다.
방화벽이 가장 우수한 해결책이라 하더라도, 먼저 공개 도구를 설치하거나 라우터 등에서 방화벽의 설치 및 운영 경험을 갖는 것이 중요하다. 라우터에서 제공하는 패킷 스크린 기능은 외부의 어떤 특정 네트워크, 호스트 등에 대해 또한 응용 프로토콜 등에 대한 액세스 제어 기능을 제공하므로 가장 기본적인 방화벽을 만들 수 있고 그밖에 필요한 사용자 인증, 응용 계층 프락시 등은 공개 도구를 이용하여 사용자 인터페이스나 여러 관리 지원 기능 등을 해결할 수 있다.
방화벽이 완전한 보안을 제공하는 것은 아니다. 방화벽은 단지 인터넷 등의 전산망에서의 보안 격리만을 제공할 뿐이며, 또한 이에 대한 비효율적인 운영과 완전하지않은 정책 채택은 더 문제가 될 수 있다. 방화벽은 단순히 전산망의 기술적인 보안 문제를 해결할 뿐이며, 그 밖에 호스트에서의 보안 문제, 보안 감시, 중앙집중적인 보안 관리, 정책, 교육 등이 총 망라되어야 할 것이다. 집중적으로 보안을 담당할 인력을 보강하고 구체적인 대책과 관리에 신경을 쓴다면 효율적인 대책을 수립할 수 있다.
- 네트워크 보안을 위해 자체적인 방화벽 환경의 구축,
- 각 호스트별 접근 제어로서 TCPWRAPPER 등의 설치,
- 시스템 및 각 응용 프로그램 등의 최신 버젼 패치(Patch),
- 시스템 보안 감시 및 일일 주간 체크리스트의 활용,
- 주기적인 부분/전체 백업,
- 보다 우수한 사용자 인증 방법
등의 채택은 가장 필수적인 보안 기술 대책 요소라고 할 수 있다. 물론 이러한 대책을 지원하는 공개 소프트웨어 도구는 많이 있으며, 또한 담당 인력의 주의와 노력이 요구된다.
[kltp 펌]웹로그분석기 설치기 - Awstats (2) | 2004.07.02 |
---|---|
[kltp 에서 펌]Apache 에서 DoS 공격 막기 (1.3.x 2.x 모두) (0) | 2004.07.02 |
[펌] 웹 로그 통계 내기 - AWStats (0) | 2004.06.30 |
[펌] 고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 (0) | 2004.06.30 |
[펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) | 2004.06.30 |
다양한 웹로그 분석 프로그램들이 존재하며, 지금 소개하려고 하는 AWStats 는 GNU GPL 을 따르는 훌륭한 웹 로그 분석 도구이다.
다운로드는 http://awstats.sourceforge.net 에서 받을 수 있다. 공식 사이트에는 apache 와 iis 의 두가지를 설명하고 있지만, 현재 필자가 설치해본 것이 redhat linux 에서 apache 를 사용중인 경우였으므로 이 경우를 예를 들어 설명하기로 하겠다. IIS의 경우도 그리 어렵지 않으니 IIS 유저들은 공식홈페이지의 문서를 참고하도록 하자.
Apache 웹서버 웹서버의 로그가 NCSA combined/XLF/ELF 의 포맷으로 기록되도록 세팅해야 한다. 우선 초기 아파치 세팅시에 특별히 로그포멧을 건드린 기억이 없다면 지금 상태 그대로 두면 된다.
시작
아파치 설정파일인 httpd.conf (아마도 /usr/local/apache/conf 정도에 있을거라 생각한다. ) 를 열고, CustomLog 웹서버로그위치 common 이라고 되어있는 부분을 찾는다.
보통 CustomLog /usr/local/apache/logs/access_log common 이런식으로 되어있을것이다.
이 부분을 찾아내서 다음과 같이 수정한다.
CustomLog 웹서버로그위치 combined
(보통 기본값인 위와 같이 CustomLog /usr/local/apache/logs/access_log common 하면 된다)
뒤에 붙은 common, combined 등은 httpd.conf 의 CustomLog 부분 바로 위에 LogFormat 이라는 이름으로 설정되어 있는 로그타입 중 하나이다.
만약 자신의 httpd.conf 에 combined 라는 이름으로 정의된 LogFormat 이 없다면 다음과 같이 추가하도록 한다.(보통 다 있다)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
한가지 주의해야 할 점은, 기존에 남아있던 로그내용이 현재의 새로 세팅한 로그내용과 달라서 AWStats 를 실행해도 분석할 수 없을 뿐만 아니라 아직 변경된 httpd.conf 의 내용을 웹서버가 읽어들이지 않았으므로
1. 기존의 로그파일을 삭제하고
2. 웹서버를 새로 시작하도록 한다. ( /usr/local/apache/bin/apachectl restart )
그리고 나서 브라우저로 웹사이트에 접속한 다음 로그파일(access_log)을 열어보도록 하자.
다음과 같은 식으로 로그가 남으면 AWStats 를 실행할 준비가 끝난 것이다.
62.161.78.75 - - [dd/mmm/yyyy:hh:mm:ss +0000] "GET / HTTP/1.1" 200 1234 "http://www.from.com/from.html" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
자신에게 적당한 AWStats 파일을 다운받도록 한다.
awstats-6.1.tgz 를 /usr/local 에 다운받았다고 가정하자.
tar xzvf awstats-6.1.tgz 라고 입력하면, /usr/local/awstats-6.1 이라는 경로 밑으로 파일들이 생성될 것이다.
/usr/local/awstats-6.1/wwwroot/cgi-bin 으로 이동한 다음 awstats.pl, awstats.model.conf 파일과 lang, lib, plugins 서브디렉토리를 웹서버의 cgi-bin 디렉토리( /usr/local/apache/cgi-bin)로 복사한다.
(필자의 경우는 다운받은 다음 압축을 풀었는데 lang 디렉토리가 없었다. 아마 미러링 하는곳에서 압축을 잘못했던가 그랬던거 같다. 그래서 다른파일을 다운받은 다음 lang 디렉토리만 복사해 넣었다. Lang 디렉토리에는 AWStats 의 결과파일 생성시 언어변환 부분이 담겨 있으므로 중요하다. 없으면 다른파일에서라도 추출해서 꼭 복사해 넣도록 하자)
그리고 마찬가지로 /usr/local/awstats-6.1/wwwroot/icon 디렉토리에 있는 내용들을 웹문서 루트경로인 /home/계정명디렉토리/public_html/icon 정도에 복사하면 될 것이다.
/usr/local/apache/cgi-bin 디렉토리에 있는 awstats.model.conf 파일을 awstats.자기도메인명(myvirtualhostname).conf 으로 하나를 더 만든 후 /usr/local/awstats-6.1/wwwroot/cgi-bin 에 복사한다.
awstats.자기도메인명(myvirtualhostname).conf 파일을 열고 다음의 내용을 편집한다.
1.LogFile 의 내용을 웹서버의 httpd.conf 에서 설정한 것과 동일하게 셋팅한다.
(위에서 /usr/local/apache/logs/access_log 와 같이 셋팅했다)
2.LogFormat 을 1로 설정한다(기본 1, NCSA apache combined/ELF/XLF로그포맷의 의미)
3.DirIcons 를 위에서 icon 을 복사한 그 경로로 설정해준다.(보통 /icon 으로 셋팅한다)
4.SiteDomain 을 자신의 웹서버의 도메인명으로 설정해준다. ( mydoman.com 같은식으로 )
5.웹로그 분석내용이 한글로 보길 원하면, Lang 파라메터 부분을 찾아서 Lang="kr"로 수정.
그 외에 필요한 부분은 읽어보고 수정을 하면 된다.(더 이상 할거 없당)
설정내용을 보면 웹페이지상에서 웹로그분석을 할 수 있도록 하는 기능을 비롯해서 다양한 부가기능이 있다. 한번씩 시도해 보기 바란다.
웹로그로부터 통계파일 생성하기
우선 telnet 커맨드상에서 다음과 같이 실행해보도록 하자.
스크립트 1
./awstats.pl -config=myvirtualhostname -update
위의 라인을 실행하기 위해서는 awstats.myvirtualhostname.conf 파일이 있어야 한다. 만약 이 파일이 없으면 awstats.conf 파일을 로딩한다. 그러면 다음과 같은 식의 결과가 출력될 것이다.
Lines in file: 225730 Found 5 dropped records, Found 124 corrupted records, Found 0 old records, Found 225601 new records.
다만 방금 로그파일을 삭제했던 사용자라면 로그가 얼마 없으므로 위와 같은 정도의 결과는 나오지 않을 것이다. 위와 같이 수행하면 웹로그파일을 분석한 결과가 텍스트로 cgi-bin 이하에 저장된다.
웹로그가 쌓여도 위의 커맨드를 실행하지 않으면 반영되지 않으므로 crontab 등을 이용해서 정기적으로 통계내용을 업데이트 할 수 있도록 한다.
다음은 awstats 의 권고안이다.
- 10,000 visitors a month Launch AWStats once a day
- 50,000 visitors a month Launch AWStats once every 4 hours
- 250,000 visitors a month Launch AWStats once an hour
- 1,000,000 visitors a month Launch AWStats once an hour
위 얘기가 이얘기다. 한달에~
- 10,000명의 방문자가 있다면 하루에 한번
- 50,000명의 방문자가 있다면 매 4시간에 한번
- 250,000명의 방문자가 있다면 한시간마다
- 1,000,000명의 방문자가 있다면 한시간마다.
통계결과 읽기 통계파일을 읽어서 결과물로 html을 생성하도록 한다. 공식문서에는 하나하나 차례대로 만드는 걸 먼저 설명하고 있지만, 그렇게 할 부지런한(?) 독자는 없을거라 생각하고, 아주 게으르고 편리한 방법으로 해보도록 하자.
awstats 를 처음 설치한 곳(/usr/local/awstats-6.1/tools/)를 보면 awstats_buildstaticpages.pl 이라는 파일이 있다. 이 펄 스크립트가 귀찮은 처리과정을 한번에 해결해주는 유틸리티이다.
다음과 같이 입력해 보자.
스크립트 2
/usr/local/awstats-6.1/tools/awstats_buildstaticpages.pl -config=자기도메인명(myvirtualhostname) -awstatsprog=/usr/local/apache/cgi-bin/awstats.pl -dir=/usr/local/apache/htdocs/stats
이와 같이 입력하면 각종 결과들이 /usr/local/apache/htdocs/stats 디렉토리에 만들어진다. (stats 디렉토리는 미리 만들어져 있어야 한다.)
-awstatsprog 는 awstats.pl 이 있는 cgi-bin의 경로이고,
-dir 은 결과가 만들어질 디렉토리이다.
하지만 이렇게 하면 스크립트 1 이 수행될때마다 스크립트 2를 수행해야 한다. crontab 에 시간차를 두고 두번 등록할 것인가? 이 또한 깔끔하지 못하다.
이 문제는 단지 스크립트 2 의 뒤에다가 -update 옵션을 붙여주는 것으로 간단히 해결된다.
/usr/local/awstats-6.1/tools/awstats_buildstaticpages.pl -config=자기도메인명(myvirtualhostname) -awstatsprog=/usr/local/apache/cgi-bin/awstats.pl -dir=/usr/local/apache/htdocs/stats -update
그리고 바로 위의 내용을 그대로 카피해서 stats.cron 라는 화일로 만들어서 /etc/cron.daily/ 또는 /etc/cron.hourly/에 복사해넣으면 간단하게 해결된다.
물론 이렇게 하면 처음에 설정했던 crond 작업(스크립트 1)은 crond 에서 제거해야 불필요한 서비스가 실행되는 것을 막을 수 있을 것이다.
이젠 웹브라우저에서 확인만 하면 된다.
awstats.자기도메인명(myvirtualhostname).conf 의 자기도메인명(myvirtualhostname)을 아래에 적용한다.
http://나의도메인주소/cgi-bin/awstats.pl?config=자기도메인명(myvirtualhostname) 엔터
끝이당...^^
[kltp 에서 펌]Apache 에서 DoS 공격 막기 (1.3.x 2.x 모두) (0) | 2004.07.02 |
---|---|
[펌] 인터넷 보안 방화벽( Firewall) 시스템 (0) | 2004.07.02 |
[펌] 고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 (0) | 2004.06.30 |
[펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) | 2004.06.30 |
[펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) | 2004.06.30 |
시스템과 관리자용 명령어의 좋은 예는 /etc/rc.d 에 있는 시작, 종료 스크립트들입니다. 이 명령어들은 보통 시스템 관리나 파일시스템을 긴급하게 고치려고 할 때 루트가 사용합니다. 이들 몇몇은 잘못 쓰면 시스템을 망가트릴 수 있기 때문에 사용에 주의를 요합니다.
chown 명령어는 파일의 소유권을 바꿔줍니다. root가 특정 사용자가 소유한 파일을 다른 사용자용으로 바꾸려고 할 때 유용하게 쓰입니다. 하지만, 일반 사용자는 자신이 소유한 파일조차도 소유권을 바꿀 수 없습니다. [1]
root# chown bozo *.txt |
chgrp 명령어는 파일의 그룹 소유권을 바꿔줍니다. 이 명령어를 쓰려면 그 파일의 소유자이고 바꾸려는 그룹의 멤버여야 합니다(혹은 root이거나).
chgrp --recursive dunderheads *.data # $PWD 디렉토리의 모든 하위 디렉토리("recursive"에 의해)의 # 모든 "*.data" 파일들은 "dunderheads" 그룹이 그 소유권을 갖습니다. |
관리자용 명령어인 useradd는 시스템에 사용자 계정을 추가해 주고 그 사용자용으로 지정된 홈 디렉토리를 만들어 줍니다. useradd와 쌍을 이루는 userdel는 시스템에서 사용자 계정을 삭제해 주고 [2] 해당 파일들도 삭제해 줍니다.
참고: adduser 명령어는 useradd의 동의어로서, 보통 useradd를 가르키는 심볼릭 링크 파일입니다.
id 명령어는 현재 사용자의 실제 ID와 유효 사용자 ID, 그룹 ID를 보여줍니다. 내부 bash 변수인 $UID, $EUID, $GROUPS와 짝을 이룹니다.
bash$ id uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio) bash$ echo $UID 501 |
예 9-4 참고.
시스템에 현재 로그인해 있는 모든 사용자를 보여줍니다.
bash$ who bozo tty1 Apr 27 17:45 bozo pts/0 Apr 27 17:46 bozo pts/1 Apr 27 17:47 bozo pts/2 Apr 27 17:49 |
-m을 주면 오직 현재 사용자에 대한 자세한 정보만을 보여줍니다. who am i나 who The Man처럼 who에 아무 인자나 두 개 넘겨주면 who -m 이라고 한 것과 같습니다.
bash$ who -m localhost.localdomain!bozo pts/2 Apr 27 17:49 |
whoami는 who -m 과 비슷하지만 사용자 이름만 보여줍니다.
bash$ whoami bozo |
로그인 되어 있는 사용자와 그 사용자와 관련된 모든 프로세스를 보여 줍니다. 이는 who의 확장 버전인데, w의 출력에 grep으로 파이프를 걸어서 특정한 사용자나 프로세스를 찾을 수 있습니다.
bash$ w | grep startx bozo tty1 - 4:22pm 6:41 4.47s 0.45s startx |
현재 사용자의 로그인 이름을 /var/run/utmp에서 찾아서 보여줍니다. 위에서 설명한 whoami와 거의 동일한 명령어입니다.
bash$ logname bozo bash$ whoami bozo |
그렇지만...
bash$ su Password: ...... bash# whoami root bash# logname bozo |
다른 사용자(substitute user)로 프로그램이나 스크립트를 실행 시킵니다. rjones란 사용자로 쉘을 새롭게 시작하고 싶으면 su rjones라고 하면 됩니다. 옵션 없이 su만 실행시키면 기본적으로 root 로 받아들입니다. 예 A-10를 참고하세요.
로그인 하고 있는 모든 사용자를 보여줍니다. 이 명령어는 who -q 와 거의 비슷한 명령어입니다.
사용자가 로그인 해 있던 시간을 /var/log/wtmp 에서 읽어서 보여줍니다. 이 명령어는 GNU 계정 유틸리티(accounting utility) 중 하나입니다.
bash$ ac total 68.08 |
사용자가 마지막으로 로그인 한 시간을 /var/log/wtmp에서 읽어서 보여줍니다. 이 명령어는 외부에서 로그인 한 정보도 보여줄 수 있습니다.
현재 사용자가 속해 있는 그룹을 보여줍니다. 내부 변수인 $GROUPS에 해당하는 명령어이지만 숫자가 아닌 그룹 이름으로 보여줍니다.
bash$ groups bozita cdrom cdwriter audio xgrp bash$ echo $GROUPS 501 |
로그아웃 없이 사용자의 그룹 ID를 변경하기. 이 명령어를 쓰면 새 그룹의 파일에 접근할 수 있게 됩니다. 사용자는 보통 동시에 여러 그룹의 멤버이기 때문에 이 명령어를 쓸 일은 별로 없습니다.
현재 사용자의 터미널 이름을 보여줍니다. 서로 다른 한텀, 엑스텀 윈도우는 서로 다른 터미널로 인식되는것에 주의하세요.
bash$ tty /dev/pts/1 |
터미널 세팅을 보여주거나 변경해 줍니다. 이 복잡한 명령어는 스크립트에서 쓰여 터미널 동작이나 출력하는 방법을 제어할 수 있습니다. info 페이지를 참고하고, 조심해서 공부하세요.
예 13-1. 지움 글자(erase character) 세팅하기
#!/bin/bash # erase.sh: "stty"로 입력시의 지움 글자(erase character)를 세트하기. echo -n "이름이 뭐에요? " read name # 아무 글자나 치고 지우려고 해보세요. # 안 될 겁니다. echo "이름이 $name 군요." stty erase '#' # "hashmark" (#) 를 지움 글자로 세트. echo -n "이름이 뭐죠? " read name # 마지막에 친 글자를 # 으로 지워보세요. echo "$name 가 당신 이름이군요." exit 0 |
예 13-2. 비밀스런 비밀번호: 터미널 에코 끄기
#!/bin/bash echo echo -n "비밀번호를 넣으세요 " read passwd echo "비밀번호는 $passwd 입니다." echo -n "누군가가 어깨 너머로 당신을 보고 있었다면, " echo "당신의 비밀번호를 알아냈을 수도 있습니다." echo && echo # "and list"로 묶인 라인 피드 두 줄" stty -echo # 화면 에코를 끕니다. echo -n "비밀번호를 다시 넣으세요 " read passwd echo echo "비밀번호는 $passwd 입니다." echo stty echo # 화면 에코를 킵니다. exit 0 |
stty를 창조적으로 써서 사용자가 ENTER를 안 눌러도 어떤 키를 눌렀는지를 알아낼 수 있습니다.
예 13-3. 키누름 알아내기
#!/bin/bash # keypress.sh: 키누름 알아내기("hot keyboard"). echo old_tty_settings=$(stty -g) # 현재 세팅을 저장. stty -icanon Keypress=$(head -c1) # GNU 시스템이 아니라면 # $(dd bs=1 count=1 2> /dev/null) echo echo "\""$Keypress"\" 키가 눌렸습니다." echo stty "$old_tty_settings" # 원래 세팅으로 복구. # Thanks, Stephane Chazelas. exit 0 |
예 9-3 참고.
터미널 세팅을 보여주거나 초기화 함. stty보다 기능이 떨어집니다.
bash$ tset -r Terminal type is xterm-xfree86. Kill is control-U (^U). Interrupt is control-C (^C). |
시리얼 포트 매개변수를 세트하거나 보여줍니다. 루트로 실행시켜야 하고 보통은 시스템 셋업 스크립트에서 찾을 수 있습니다.
# /etc/pcmcia/serial 스크립트에서 발췌: IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'` setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQ |
터미널용 초기화 프로세스가 getty나 agetty를 써서 사용자의 로그인을 설정해 줍니다. 이 명령어들은 사용자의 쉘 스크립트에서 쓰이지 않기 때문에 쉘 스크립트에서 이런 기능을 쓰려면 stty를 쓰기 바랍니다.
현재 사용자의 터미널에 대한 쓰기 접근을 제어합니다. 접근을 못 하게 설정되면 네트워크에 있는 다른 사용자가 현재 터미널로 write를 하지 못하게 해 줍니다.
작은 정보: 여러분이 텍스트 파일을 편집하고 있는데 갑자기 피자 주문 메세지가 뜨면 아주 짜증날 것입니다. 다중 사용자 네트워크에서는, 방해받기 싫을 때 여러분의 터미널에 대한 쓰기 접근을 막고 싶은 경우가 생길겁니다.
"write all"의 앞글자를 따서 wall이 된 이 명령어는 현재 로그인 되어 있는 모든 사용자에게 메세지를 날립니다. 원래는 유용한 시스템 관리자용 도구입니다. 예를 들어, 시스템에 문제가 생겨서 잠깐 동안 다운 시켜야 할 필요가 생겼을 때 모든 사용자들에게 경고를 할 수 있게 해 줍니다(예 17-2 참고).
bash$ wall System going down for maintenance in 5 minutes! Broadcast message from bozo (pts/1) Sun Jul 8 13:53:27 2001... System going down for maintenance in 5 minutes! |
참고: mesg로 쓰기가 막혀있는 터미널은 wall 메세지를 받을 수 없습니다.
시스템 부팅 메세지를 표준출력으로 보여 줍니다. 디버깅 할 때, 어떤 디바이스 드라이버가 설치됐는지 확인할 때, 사용중인 시스템 인터럽트가 무엇인지 확인할 때 편하게 쓸 수 있습니다. 스크립트에서 dmesg의 출력을 grep이나 sed, awk로 파싱해서 쓸 수 있습니다.
시스템 사양(OS, 커널 버전등)을 표준출력으로 보여줍니다. -a 옵션을 주면 시스템 정보를 아주 자세하게 보여주고(예 12-4 참고), -s 옵션을 주면 OS 종류만 보여줍니다.
bash$ uname -a Linux localhost.localdomain 2.2.15-2.5.0 #1 Sat Feb 5 00:13:43 EST 2000 i686 unknown bash$ uname -s Linux |
시스템 아키텍쳐를 보여줍니다. uname -m 과 동일한 명령어입니다. 예 10-24를 참고하세요.
bash$ arch i686 bash$ uname -m i686 |
/var/account/pacct 파일에 저장돼 있는 이전 명령어들에 대한 정보를 알려줍니다. 옵션으로 명령어와 사용자 이름을 지정해 줄 수 있습니다. 이 명령어는 GNU 계정 유틸리티(accounting utility)중의 하나입니다.
시스템의 모든 사용자가 마지막으로 로그인한 시간을 보여줍니다. 이 명령어는 /var/log/lastlog 파일을 참조합니다.
bash$ lastlog root tty1 Fri Dec 7 18:43:21 -0700 2001 bin **Never logged in** daemon **Never logged in** ... bozo tty1 Sat Dec 8 21:14:29 -0700 2001 bash$ lastlog | grep root root tty1 Fri Dec 7 18:43:21 -0700 2001 |
경고 |
/var/log/lastlog 파일에 읽기 퍼미션이 없는 사용자가 이 명령어를 실행시키면 실패합니다. |
현재 열려 있는 파일들을 보여줍니다. 이 명령어는 현재 열려 있는 모든 파일들에 대한 자세한 표와 각각의 파일에 대한 소유자, 크기, 관련 프로세스등의 정보를 보여 줍니다. 당연히, lsof의 출력은 파이프를 통해 grep나 awk로 넘겨서 파싱해서 분석할 수 있습니다.
bash$ lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root mem REG 3,5 30748 30303 /sbin/init init 1 root mem REG 3,5 73120 8069 /lib/ld-2.1.3.so init 1 root mem REG 3,5 931668 8075 /lib/libc-2.1.3.so cardmgr 213 root mem REG 3,5 36956 30357 /sbin/cardmgr ... |
시스템 콜과 시그널을 추적해서 진단하고 디버깅해 주는 도구입니다. 가장 간단하게 실행시키는 방법은 strace COMMAND라고 치는 것입니다.
bash$ strace df execve("/bin/df", ["df"], [/* 45 vars */]) = 0 uname({sys="Linux", node="bozo.localdomain", ...}) = 0 brk(0) = 0x804f5e4 ... |
이 명령어는 리눅스에서의 truss 입니다.
메모리와 캐쉬 사용량을 탭이 들어간 형태로 보여줍니다. 이 명령어의 출력은 grep이나, awk, Perl을 써서 파싱하기에 알맞은 형태입니다. procinfo 명령어는 free가 보여주는 정보 이외에 더 많은 정보도 보여줍니다.
bash$ free total used free shared buffers cached Mem: 30504 28624 1880 15820 1608 16376 -/+ buffers/cache: 10640 19864 Swap: 68540 3128 65412 |
사용하지 않는 램 용량을 보려면:
bash$ free | grep Mem | awk '{ print $4 }' 1880 |
/proc 가상 파일시스템에서 여러 정보와 통계를 뽑아내서 광범위하고 자세하게 보여 줍니다.
bash$ procinfo | grep Bootup Bootup: Wed Mar 21 15:15:50 2001 Load average: 0.04 0.21 0.34 3/47 6829 |
설치된 하드웨어 디바이스의 목록을 보여줍니다.
bash$ lsdev Device DMA IRQ I/O Ports ------------------------------------------------ cascade 4 2 dma 0080-008f dma1 0000-001f dma2 00c0-00df fpu 00f0-00ff ide0 14 01f0-01f7 03f6-03f6 ... |
디스크의 파일 사용량을 재귀적으로 보여줍니다. 특별히 지정하지 않으면 현재 디렉토리에 대해서 동작합니다.
bash$ du -ach 1.0k ./wi.sh 1.0k ./tst.sh 1.0k ./random.file 6.0k . 6.0k total |
파일시스템 사용량을 탭이 들어간 형태로 보여 줍니다.
bash$ df Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda5 273262 92607 166547 36% / /dev/hda8 222525 123951 87085 59% /home /dev/hda7 1408796 1075744 261488 80% /usr |
주어진 파일(디렉토리나 디바이스 파일도)에 대해서 자세한 통계(statistics)를 알려줍니다.
bash$ stat test.cru File: "test.cru" Size: 49970 Allocated Blocks: 100 Filetype: Regular File Mode: (0664/-rw-rw-r--) Uid: ( 501/ bozo) Gid: ( 501/ bozo) Device: 3,8 Inode: 18185 Links: 1 Access: Sat Jun 2 16:40:24 2001 Modify: Sat Jun 2 16:40:24 2001 Change: Sat Jun 2 16:40:24 2001 |
존재하지 않는 파일에 대해서 stat을 실행시키면 에러 메세지를 냅니다.
bash$ stat nonexistent-file nonexistent-file: No such file or directory |
가상 메모리(virtual memory) 통계(statistics)를 보여줌.
bash$ vmstat procs memory swap io system cpu r b w swpd free buff cache si so bi bo in cs us sy id 0 0 0 0 11040 2636 38952 0 0 33 7 271 88 8 3 89 |
라우팅 테이블이나 활성화되어 있는 네트워크 연결같은 네트워크 통계와 정보를 보여 줍니다. 이 유틸리티는 /proc/net(28장)에서 정보를 얻어 옵니다. 예 28-2을 참고하세요.
시스템이 얼마나 오랫동안 돌고 있었는지 관련 통계와 함께 보여줍니다.
bash$ uptime 10:28pm up 1:57, 3 users, load average: 0.17, 0.34, 0.27 |
시스템의 호스트명을 보여줍니다. 이 명령어는 /etc/rc.d 에 들어 있는 셋업 스크립트에서 호스트명을 설정해 줍니다(/etc/rc.d/rc.sysinit이나 비슷한 스크립트). uname -n과 동일한 명령어이고 내부 변수인 $HOSTNAME과 연관이 있습니다.
bash$ hostname localhost.localdomain bash$ echo $HOSTNAME localhost.localdomain |
호스트 머신에 대한 32비트 16진수 구분자를 에코해 줍니다.
bash$ hostid 7f0100 |
참고: 이 명령어는 특정 시스템에 대해 "유일한"(unique) 시리얼 숫자를 구해줍니다. 몇몇 상업용 제품의 등록 과정에서 이 숫자를 이용해 사용자 라이센스를 만들어 냅니다. 하지만 불행하게도 hostid는 오직 네트워크 주소를 두 바이트 단위로 뒤집어 16진수로 리턴해 줍니다.
네트워크에 물리지 않은 리눅스 머신의 전형적인 네트워크 주소는 /etc/hosts에서 알아낼 수 있습니다.
bash$ cat /etc/hosts 127.0.0.1 localhost.localdomain localhost공교롭게도 127.0.0.1을 두 바이트 단위로 뒤집으면 0.127.1.0이 되고 이를 16진수로 변환하면 007f0100이 되는데 이는 위에서 살펴본 hostid가 리턴하는 값과 정확히 일치합니다. 결국 동일한 hostid를 갖는 리눅스 머신이 수 백만 개가 존재하게 되는 것입니다.
사용자가 만들어낸 메세지를 시스템 로그(/var/log/messages)에 추가 시킵니다. 이 명령어는 일반 사용자도 쓸 수 있습니다.
logger Experiencing instability in network connection at 23:10, 05/21. # 자, 이제 'tail /var/log/messages' 라고 해 보세요. |
스크립트에 logger 명령어를 넣어서 디버깅 정보를 /var/log/messages에 쓸 수 있습니다.
logger -t $0 -i Logging at line "$LINENO". # "-t" 옵션은 logger 엔트리용 태그를 지정합니다. # "-i" 옵션은 프로세스 ID를 지정합니다. # tail /var/log/message # ... # Jul 7 20:48:58 localhost ./test.sh[1712]: Logging at line 3. |
이 유틸리티는 시스템 로그 파일들을 적당하게 로테이트 시키고, 압축하고, 지우고, 메일을 보내는 일들을 처리해 줍니다. 보통 crond은 logrotate를 가장 기본적인 하루 일과로 삼습니다.
/etc/logrotate.conf에 적당한 내용을 적어주면 시스템 전체 로그뿐만 아니라 개인용 로그 파일을 관리할 수 있습니다.
프로세스 통계(Process Statistics): 현재 실행중인 프로세스들을 사용자와 PID(프로세스 아이디)에 의해서 보여줌. 보통은 ax 옵션을 줘서 부르고, grep이나 sed로 파이프를 걸어서 특정 프로세스를 찾습니다(예 11-8와 예 28-1 참고).
bash$ ps ax | grep sendmail 295 ? S 0:00 sendmail: accepting connections on port 25 |
현재 실행중인 프로세스를 "나무"(tree) 형태로 보여 줍니다. -p 옵션을 주면 프로세스 이름뿐만 아니라 PID까지 보여 줍니다.
cpu를 집중적으로 사용하는 프로세스를 중심으로 최신 정보를 계속 보여줍니다. -b 옵션은 결과를 텍스트 모드로 보여주기 때문에 파싱을 하거나 스크립트에서 접근할 수가 있습니다.
bash$ top -b 8:30pm up 3 min, 3 users, load average: 0.49, 0.32, 0.13 45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 13.6% user, 7.3% system, 0.0% nice, 78.9% idle Mem: 78396K av, 65468K used, 12928K free, 0K shrd, 2352K buff Swap: 157208K av, 0K used, 157208K free 37244K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 848 bozo 17 0 996 996 800 R 5.6 1.2 0:00 top 1 root 8 0 512 512 444 S 0.0 0.6 0:04 init 2 root 9 0 0 0 0 SW 0.0 0.0 0:00 keventd ... |
백그라운드 작업의 우선순위를 바꿔줍니다. 우선순위는 19(제일 낮음)에서 -20(제일 높음)까지 인데, 오직 root만이 음수(높은) 우선순위를 줄 수 있습니다. 관련 명령어로는 renice, snice, skill이 있습니다.
사용자가 로그 아웃을 하더라고 명령어가 계속 돌게 해 줍니다. 명령어에 &를 붙여 실행하지 않으면 포그라운드로 실행이 될 것입니다. nohup을 스크립트에서 쓸 때는, 고아 프로세스나 좀비 프로세스가 생기지 않도록 wait과 같이 써야 합니다.
실행중인 작업의 프로세스 ID(pid)를 식별해 줍니다. kill이나 renice같은 작업 제어 명령어들은 프로세스 이름이 아니라 pid에 대해 동작하기 때문에 종종 pid로 구분할 필요가 생깁니다. pidof 명령어는 내부 변수인 $PPID와 거의 쌍을 이룹니다.
bash$ pidof xclock 880 |
예 13-4. pidof 로 프로세스를 죽이기
#!/bin/bash # kill-process.sh NOPROCESS=2 process=xxxyyyzzz # 존재하지 않는 프로세스를 가지고, # 그냥 데모용임... # ... 실제로 돌고 있는 어떤 프로세스도 죽이려고 하는게 아니니까. # # 하지만, 예를 들어 인터넷에서 로그오프하고 싶다면 #+ process=pppd #+ 됩니다. t=`pidof $process` # $process의 pid(프로세스 ID)를 찾고, # 'kill'은 프로그램 이름이 아니라 pid를 쓰기 때문에 if [ -z "$t" ] # 해당 프로세스가 없다면 'pidof'는 널을 리턴함. then echo "$process 는 현재 실행중이 아니므로 그냥 종료합니다." exit $NOPROCESS fi kill $t # 잘 죽지 않는 프로세스라면 'kill -9'라고 해야 할지도 모릅니다. # 죽지 않게 돼 있는 프로세스일수도 있기 때문에 # 다시 한 번 " t=`pidof $process` " 로 확인해 볼 필요가 있습니다. # 위 전체 스크립트는 # kill $(pidof -x process_name) # 이라고 할 수도 있겠으나 그러면 교육적이지는 않은것 같군요. exit 0 |
어떤 파일이나, 파일 집합, 디렉토리에 접근하고 있는 프로세스를 PID로 식별해 줍니다. -k 옵션을 쓰면 해당 프로세스를 죽일 수 있습니다. 이 명령어는 시스템 보안 차원에서 아주 흥미로운 구현인데 주로 스크립트에서 쓰여 시스템 서비스에 대해 허가 받지 않은 사용자의 접근을 막는 용도로 쓰입니다.
시스템 관리용 스케쥴러 프로그램으로서, 시스템 로그 파일을 정리하고 지운다거나 slocate 데이타 베이스를 업데이트 하는 등의 일을 해 줍니다. at의 루트 사용자 버전용 명령어입니다(물론, 각 사용자는 crontab 명령어를 써서 자신만의 crontab 파일을 가질수도 있습니다). 데몬으로 돌면서 /etc/crontab의 내용들을 스케쥴에 따라 실행시켜 줍니다.
init 명령어는 모든 프로세스의 부모 프로세스로서, 시스템 부팅 과정의 제일 마지막에 불리면서 /etc/inittab을 읽어서 시스템의 런레벨을 결정합니다. 오직 루트만이 별명인 telinit으로 부를 수 있습니다.
init를 가르키는 심볼릭링크로서, 시스템 런레벨을 바꿀 때 쓰는데 보통은 시스템 관리나 긴급하게 파일시스템을 수리해야 할 때 씁니다. 오직 루트만 이 명령어를 쓸 수 있습니다. 이 명령어는 아주 위험하기 때문에 쓰기 전에 이 명령어를 잘 이해하고 있어야 합니다!
현재와 바로 전의 런레벨을, 시스템이 정지 상태인지(런레벨 0), 단일 사용자 모드인지(1), 다중 사용자 모드인지(2나 3), X 윈도우 모드인지(5), 리부팅 중인지(6)등으로 보여 줍니다. 이 명령어는 /var/run/utmp 파일을 통해 정보를 얻어 옵니다.
보통 시스템 전원을 끄기 전에 시스템을 정지시키는 명령어들.
네트워크 인터페이스 설정및 튜닝 유틸리티. 이 명령어는 부팅시 인터페이스를 설정할 때나 리부팅때 인터페이스를 내리기 위해 쓰입니다.
# /etc/rc.d/init.d/network 의 일부분 # ... # 네트워킹이 가능한지 확인. [ ${NETWORKING} = "no" ] && exit 0 [ -x /sbin/ifconfig ] || exit 0 # ... for i in $interfaces ; do if ifconfig $i 2>/dev/null | grep -q "UP" >/dev/null 2>&1 ; then action "Shutting down interface $i: " ./ifdown $i boot fi # "grep"의 GNU 전용인 "-q" 옵션은 "quiet"를 뜻하고, 어떤 출력도 하지 않게 합니다. # 따라서 출력을 /dev/null 로 재지향 하는 것이 꼭 필요하지 않습니다. # ... echo "현재 동작중인 디바이스:" echo `/sbin/ifconfig | grep ^[a-z] | awk '{print $1}'` # ^^^^^ globbing 을 막기 위해 쿼우트 시켜야 합니다. # 다음도 역시 동작합니다. # echo $(/sbin/ifconfig | awk '/^[a-z]/ { print $1 })' # echo $(/sbin/ifconfig | sed -e 's/ .*//') # S.C.가 주석을 더 넣어 줬습니다. 고마워요. |
커널 라우팅 테이블 정보를 보거나 바꿀 수 있게 해 줍니다.
bash$ route Destination Gateway Genmask Flags MSS Window irtt Iface pm3-67.bozosisp * 255.255.255.255 UH 40 0 0 ppp0 127.0.0.0 * 255.0.0.0 U 40 0 0 lo default pm3-67.bozosisp 0.0.0.0 UG 40 0 0 ppp0 |
네트워크 설정을 체크해줌. 이 명령어는 /etc/rc?.d 디렉토리에 들어있고 부팅시 시작되는 네트워크 서비스들을 보여주고 관리해 줍니다.
원래는 IRIX에 있던 것을 레드햇 리눅스가 포팅한 것으로 다른 리눅스 배포판에서는 기본 설치에 속하지 않을 수도 있습니다.
bash$ chkconfig --list atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off rwhod 0:off 1:off 2:off 3:off 4:off 5:off 6:off ... |
네트워크 패킷 "스니퍼". 주어진 기준에 맞는 패킷 헤더의 덤프를 떠서 네트워크 트래픽을 분석하고 문제점을 해결할 수 있게 해 줍니다.
bozoville 와 caduceus 두 호스트간의 IP 패킷 트래픽을 덤프:
bash$ tcpdump ip host bozoville and caduceus |
당연히 tcpdump의 출력은 앞에서 논의했던 텍스트 처리 유틸리티들을 이용해서 파싱할 수가 있습니다.
파일시스템을 마운트해 줍니다. 보통은 플로피나 시디롬 같은 외부 디바이스에 대해서 쓰입니다. /etc/fstab에 가능한 파일시스템이나 파티션, 디바이스, 옵션등을 적어 놓으면 자동이나 수동으로 마운트를 편하게 할 수 있습니다. /etc/mtab 파일은 /proc 같은 가상 파일시스템도 포함해서 현재 마운트 되어 있는 파일 시스템을 보여 줍니다.
mount -a 는 /etc/fstab에 들어 있는 파일 시스템과 파티션중에 noauto 옵션이 있는 항목만 빼고 모두 마운트 해 줍니다. 부팅될 때, 모든 파티션이 마운트 되도록 /etc/rc.d 디렉토리에 들어 있는 시스템 구동 스크립트(rc.sysinit이나 비슷한 것)에서 이 명령어를 부릅니다.
mount -t iso9660 /dev/cdrom /mnt/cdrom # CDROM 마운트 mount /mnt/cdrom # /mnt/cdrom 이 /etc/fstab 에 들어 있을 경우 짧게 부르기 |
이 다재다능한 명령어는 보통 파일을 블럭 디바이스에 존재하는 파일 시스템처럼 마운트 할 수도 있습니다. 이런 능력은 루프백 디바이스(loopback device)라고 하는 파일을 이용해서 가능해 집니다. 이 루프백 디바이스를 적용한 예로서, ISO9660 이미지를 CDR로 굽기 전에 마운트해서 테스트 해보는 것이 있습니다. [3]
현재 마운트 되어 있는 파일 시스템을 언마운트 해 줍니다. 이미 마운트 되어 있는 플로피나 시디롬 디스크를 빼기 전에 꼭 umount를 해 줘야 합니다. 안 그러면 파일 시스템이 깨질 수도 있습니다.
umount /mnt/cdrom # 이제 이젝트 버튼을 눌러 디스크를 안전하게 뺄 수 있습니다. |
참고: automount 유틸리티가 적절하게 설치되어 있다면 플로피나 시디롬 디스크에 접근시나 제거시에 자동으로 마운트와 언마운트를 할 수 있습니다. 플로피나 시디롬 드라이브를 꼈다 뺐다 할 수 있는 랩탑에서는 문제를 일으킬 수도 있습니다.
버퍼에 들어 있는 최신 데이타를 하드 드라이브로 즉시 쓰게 합니다(버퍼와 드라이브를 동기화). 이 명령어가 꼭 필요한 것은 아니지만 시스템 관리자나 사용자에게 자신들이 변경한 데이타가 갑작스런 전원 이상에도 살아남을 수 있게 해 줍니다. 예전에는 sync; sync(아주 확실히 하기 위해서 두 번 내림)라고 해서 시스템을 리부팅하기 전의 유용한 예방책으로 쓰였습니다.
파일을 안전하게 지우거나(예 12-33) 천장의 전등이 깜빡이기 시작했을 때 버퍼를 즉시 플러쉬시키고 싶을 때가 있을지도 모릅니다.
루프백 디바이스를 설정해 줍니다.
스왑 파티션이나 스왑 파일을 만들어 줍니다. 이 명령어 다음에는 꼭 swapon으로 활성화를 시켜줘야 합니다.
스왑 파티션이나 스왑 파일을 활성화/비활성화 시켜 줍니다. 이 명령어는 보통 부팅시나 셧다운시에 효력을 갖습니다.
리눅스 ext2 파일시스템을 만들어 줍니다. 이 명령어는 루트로 실행 시켜야 합니다.
예 13-7. 새 하드 드라이브 추가하기
#!/bin/bash # 시스템에 두 번째 하드 드라이브 추가하기. # 소프트웨어 설정. 하드웨어가 이미 마운트돼 있다고 가정함. # 본 문서의 저자가 "Linux Gazett", http://www.linuxgazette.com, 38호에 # 쓴 기사에서 발췌. ROOT_UID=0 # 이 스크립트는 루트로 실행 시켜야 됩니다. E_NOTROOT=67 # root 가 아닌 경우의 종료 에러. if [ "$UID" -ne "$ROOT_UID" ] then echo "이 스크립트는 루트만 실행시킬 수 있습니다." exit $E_NOTROOT fi # 이 스크립트는 정말 주의해서 쓰기 바랍니다! # 만약 무언가가 잘못된다면 여러분의 파일 시스템을 홀라당 날려먹을 수 있습니다. NEWDISK=/dev/hdb # /dev/hdb 가 비어 있다고 가정함. 꼭 확인해 볼 것! MOUNTPOINT=/mnt/newdisk # 아니면 다른 마운트 포인트 지정. fdisk $NEWDISK mke2fs -cv $NEWDISK1 # 배드 블럭 확인및 자세한 출력. # 주의: /dev/hdb 가 *아니라* /dev/hdb1 입니다! mkdir $MOUNTPOINT chmod 777 $MOUNTPOINT # 새 드라이브는 모든 사용자가 접근할 수 있도록 함. # 자, 테스트를 해 보죠. # mount -t ext2 /dev/hdb1 /mnt/newdisk # 디렉토리를 만들어 보고 잘 된다면 umount 한 다음 하던 일을 계속하면 됩니다. # 마지막 단계: # 다음을 /etc/fstab 에 추가해 주세요. # /dev/hdb1 /mnt/newdisk ext2 defaults 1 1 exit 0 |
ext2 파일 시스템을 튜닝해 줍니다. 최대 마운트 숫자같은 파일 시스템 매개변수를 바꾸는데 쓰일 수 있습니다. 루트로 실행해야 됩니다.
주의 |
이 명령어는 굉장히 위험합니다. 부주의하게 쓴다면 여러분 파일 시스템을 박살낼 수도 있기 때문에 여러분 스스로 책임을 지고 써야 합니다. |
아주 자세한 파일 시스템 정보를 표준출력으로 덤프해 줍니다. 루트로 실행되야 합니다.
root# dumpe2fs /dev/hda7 | grep 'ount count' dumpe2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09 Mount count: 6 Maximum mount count: 20 |
[펌] 인터넷 보안 방화벽( Firewall) 시스템 (0) | 2004.07.02 |
---|---|
[펌] 웹 로그 통계 내기 - AWStats (0) | 2004.06.30 |
[펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) | 2004.06.30 |
[펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) | 2004.06.30 |
[펌] 서버 모니터링 툴의 강자, RRDtool 가이드 (0) | 2004.06.29 |
전체적으로 볼 때 MySQL은 그다지 관리할 것이 많지 않은 편이다. 일단 설치하고 나면 관리자가 할 일이 별로 없다. 그렇다고 해도 MySQL 관리자는 다음과 같은 임무를 맡고 있다.
위에 열거한 주제 중 몇 가지는 다른 자에서 다룬다(설치는 2장에서, 퍼포먼스 튜닝은 5장에서, 액세스 제어는 6장에서).
MySQL 서버 관리를 할 필요가 없는 사람이라도 이 장에 있는 내용을 알아두면 도움이 된다. 데이터베이스 관리에 대한 내용을 알고 있으면 데이터베이스 관리자에게 문의하기 전에 어떤 문제가 있는지 확인해 볼 수 있기 때문이다.
여러 가지 관리 작업을 처리하려면 MySQL의 관리자 액세스가 필요하다(액세스 권한과 MySQL 데이터베이스 관리자 설정에 관한 내용은 6장에서 자세히 다룬다). 작업에 따라 운영 체제의 관리자 권한(유닉스에서는 root, 윈도우 NT/2000/XP에서는 Administrator)이 필요할 수도 있다.
설정
우선 MySQL 서버 프로세스인 mysqld 및 mysql 명령행 유틸리티를 비롯한 여러 클라이언트 프로세스에 대한 설정을 해야 한다. MySQL 설정은 유닉스에서 흔히 사용하는 방법으로 이루어진다. 즉 명령행 옵션, 설정 파일 그리고 환경 변수를 이용하여 설정할 수 있다. 이러한 세 가지 방법을 통해 모든 설정 가능한 내역을 관리할 수 있다.
옵션을 정의하는 방법이 다양하기 때문에 위의 세 가지 옵션들이 서로 충돌할 때에는 다음과 같은 우선순위를 기준으로 삼는다.
예를 들어, 패스워드 옵션이 명령행, 설정 파일, 환경 변수에서 제각기 다르게 정의되어 있다면 MySQL 클라이언트 도구에서는 명령행에서 지정한 옵션을 사용한다.
MySQL 옵션을 다루는 방법 중에서는 설정 파일을 이용하는 방법이 가장 쉽고 많이 쓰인다. 설정 파일을 이용하면 모든 옵션을 파일 하나에 넣을 수 있기 때문에 명령을 실행시키거나 컴퓨터에 로그인할 때마다 옵션을 지정하지 않아도 된다.
파일 위치
유닉스 시스템에서는 MySQL 설정 파일을 다음과 같은 위치에서 순서대로 검색한다.
윈도우에는 전역 설정 파일이 추가로 있으며, 사용자별 개인 설정 파일은 없다.
만약 어떤 옵션이 여러 파일에서 서로 다르게 정의되었다면 가장 나중에 읽어들인 내용이 적용된다. 즉 C:\my.cnf 파일에 저장된 사용자 정의 옵션이 My.ini 파일에 있는 옵션보다 더 우선시된다. 이렇게 하면 데이터베이스 관리자는 클라이언트 도구의 기본값을 My.ini를 통해 설정하고 사용자는 필요에 따라 다른 옵션을 사용할 수 있다.
파일 내용
모든 설정 파일의 형식은 같다. 설정 파일의 예가 [예제 4-1]에 나와 있다. 설정 파일이 그다지 어렵진 않지만, 일단 이 파일을 꼼꼼하게 살펴보자:
[예제 4-1] MySQL 설정 파일 샘플 # MySQL 설정파일 예제 # # 클라이언트 옵션 [client] password = my_password port = 3306 socket = /var/lib/mysql/mysql.sock # mysqld 서버 옵션 [mysqld] port = 3306 socket = /var/lib/mysql/mysql.sock skip-locking set-variable = max_allowed_packet=1M
#으로 시작하는 맨 처음 세 줄은 주석이다. MySQL 설정 파일 형식에서는 #와 ; 기호로 주석을 표시할 수 있다. 샵(#)이나 세미콜론(;)이 나타나면 주석 기호 뒤에 나오는 그 줄의 나머지 부분은 모두 무시된다.
다음 줄에는 한 섹션이 시작하는 것을 나타내는 다음과 같은 코드가 있다:
[client]
삼바(samba)나 윈도우 INI 설정을 건드려본 경험이 있다면 위와 같은 형식이 그다지 낯설지 않을 것이다. 설정 파일은 몇 개의 섹션으로 나위고, 각 옵션은 그 섹션에만 적용된다. MySQL 설정 파일에는 client와 mysqld의 두 가지 섹션이 있다.
섹션을 표시하는 부분 다음 줄부터는 파일이 끝나기 전까지, 또는 다른 그룹이 시작되기 전까지 그 섹션에만 해당되는 옵션이 들어간다. client 섹션에는 클라이언트 도구에 필요한 세 가지 설정 내역이 들어있다. 첫 번째 옵션은 기본 패스워드를 지정하는 부분이다:
password = my_password
이 옵션은 --password=my_password 명령행 옵션과 같은 역할을 한다. 일반적으로 명령행 옵션에서 --option=value 형태로 지정하는 것은 MySQL 설정 파일에서 option=value 형태로 지정하는 것과 똑같다.
설정 파일에 패스워드를 넣어 두면 MySQL에 연결할 때마다 매번 패스워드를 입력할 필요가 없기 때문에 편리하다. 하지만 패스워드를 설정 파일이나 명령행에 직접 입력하는 것은 그다지 권장할 만한 방법이 아니다. 클라이언트 유틸리티에서 패스워드를 입력할 수 있는 프롬프트가 나오게 하는 것이 좋다. 설정 파일에 패스워드를 입력해 놓았을 때에는 다른 사람이 절대 그 파일을 열어볼 수 없도록 주의해야 한다.
패스워드 옵션 아래에는 있는 두 줄에서는 클라이언트 도구에서 서버에 연결할 때 사용할 포트 및 소켓 파일을 설정한다. 그 뒤에는 다음과 같은 행이 있어서 새로운 섹션이 시작된다:
[mysqld]
이 섹션에서는 MySQL 서버 프로세스를 설정하는 옵션이 들어간다. 여기에서는 클라이언트 섹션에서 사용하는 것과 비슷한 형태 외에 두 가지 새로운 옵션 설정 방식이 등장한다. 다음과 같은 옵션에서는 값을 입력할 필요가 없다:
skip-locking
위의 옵션은 MySQL 서버에서 시스템 잠금을 사용하지 않는다는 것을 의미하는 부울 옵션이다. 위의 옵션을 지정하지 않으면 시스템 잠금이 작동한다. 명령행에서는 --skip-locking 옵션을 사용하면 된다.
MySQL에서 옵션을 지정하는 또 다른 방법은 mysqld 변수를 직접 지정하는 방법이다:
set-variable = max_allowed_packet=1M
명령행에서는 --set-variable max_allowed_packet=1M라고 적으면 된다. 변수는 서버와 클라이언트의 런타임 환경을 제어하는 설정값이다.
서버 시작 및 종료
MySQL 서버는 서버 프로세스 형태로 동작하므로 컴퓨터를 켤 때마다 자동으로 시작해야 한다. 또한 컴퓨터를 종료할 때 서버도 종료시켜야 한다. MySQL 서버를 자동으로 시작하고 종료시키는 방법은 운영 체제에 따라 다르다.
mysqld 명령으로 명령행에서 직접 서버를 시작하게 만들 수도 있다. 하지만 어떤 운영 체제에서든지 MySQL을 시작할 때에은 safe_mysqld를 사용하는 것이 좋다. |
유닉스/리눅스
유닉스 및 리눅스와 같은 유닉스 계열 운영 체제(Mac OS X는 제외)에서 MySQL을 시작하고 끝내는 방법은 SVR4 시스템인지 아닌지에 따라 달라진다. SVR4 시스템에서는 mysql.server 스크립트를 사용하면 되고 다른 유닉스 시스템에서는 safe_mysqld를 사용하면 된다. 여기에서는 이러한 스크립트를 사용하는 대략적인 방법에 대해 설명하겠다(유닉스 시스템을 관리할 때 힘든 부분 중 하나가 바로 시스템별로 서비스를 시작하고 종료하는 방법이 조금씩 다르다는 점이다).
SVR4
SVR4 시스템에서 MySQL을 시작하고 종료할 때에는 mysql.server 스크립트를 사용한다. 이 스크립트는 보통 MySQL을 설치하고 나면 만들어지는 support.files라는 디렉토리(보통 /usr/local/mysql/support-files)에 저장된다. SVR4의 시작/종료 메커니즘은 시스템이 다른 런레벨(run level)에 들어갈 때 서비스를 시작하고, 종료하기 위한 스크립트(/etc 폴더 아래에 들어가는 몇 개의 폴더에 들어감)에 의해 운영된다.
리눅스 시스템에서 RPM 패키지로 설치했다면 mysql.server가 자동으로 설치된다. RPM 설치기에서 mysql.server 파일을 /etc/rc.d/init.d에 복사할 때 그 파일명을 mysql로 바꾼다. /etc/rc.d/init.d/mysql 파일이 있으면 MySQL이 자동으로 시작되고 종료될 것이다. |
레드헷 리눅스 시스템에서 mysql.server를 설치하는 방법은 다음과 같다:
$ cp mysql.server /etc/rc.d/init.d $ ln -s /etc/rc.d/init.d/mysql.server /etc/rc.d/rc3.d/S99mysql $ ln -s /etc/rc.d/init.d/mysql.server /etc/rc.d/rc0.d/S01mysql
첫 번째 줄에서는 mysql.server 스크립트를 초기화 스크립트가 들어가는 /etc/rc.d/init.d 디렉토리에 설치한다. 두 번째 명령에서는 시스템이 3번 런 레벨에 들어갈 때 리눅스에서 자동으로 스크립트를 실행시킬 수 있도록 링크를 만든다. 리눅스에서는 시스템이 3번 런 레벨로 들어가면 /etc/rc.d/rc3.d 디렉토리에 있는 스크립트를 실행시킨다. 3번 런 레벨은 보통 SVR4 시스템이 다중 사용자 모드로 들어간다는 것을 의미한다. 다중 사용자 모드의 런 레벨이 3번이 아니라면 그에 맞는 디렉토리에 링크를 설치해야 한다.
마지막 줄에서는 0번 런 레벨에 mysql.server 스크립트에 대한 링크를 만든다. 0번 런 레벨은 시스템을 종료시키는 런 레벨이다. 따라서 /etc/rc.d/rc0.d에 있는 스크립트는 시스템이 종료될 때 실행된다.
다른 유닉스 시스템
SVR4를 기반으로 하지 않는 유닉스 시스템에서는 safe_mysqld라는 스크립트로 MySQL을 시작한다. 이 스크립트는 MySQL 설치 디렉토리 밑에 있는 /bin 디렉토리(보통 /usr/local/mysql/bin)에서 찾을 수 있다.
safe_mysqld를 사용하고 싶다면 해당 유닉스 시스템이 시작할 때와 종료할 때 서비스를 시작하고 종료하는 방법을 알아야 한다. BSD 시스템 중에는 safe_mysqld를 호출할 수 있도록 /etc/rc.local이라는 파일을 수정해야 하는 것도 있다. 하지만 FreeBSD와 같이 최근에 나온 BSD 시스템에서는 rc.local 파일을 수정하면 안되는 경우도 있다. 예를 틀어, FreeBSD에서는 mysql.server와 같은 스크립트를 /usr/local/etc/rc.d 디렉토리에 저장하면 된다.
Mac OS X
Mac OS X에서는 유닉스 시스템에서 자동으로 서비스를 시작하는 새로운 방법을 도입하였다. 여기에서는 세 가지 서로 다른 시작 디렉토리를 사용한다.
./System/Library/StartupItems 디렉토리는 운영 체제 서비스를 위한 디레토리이고, $HOME/Library/StartupItems 디렉토리는 사용자 소유의 서비스를 위한 디렉토리이다. MySQL은 시스템이 부팅될 때 시작되어야 하는 일반 서비스 디렉토리인 /Library/StartupItems 디렉토리에서 시작해야 한다.
StartupItems 디렉토리에서는 각 서비스별로 디렉토리가 하나씩 있어야 하기 때문에 MySQL을 설치할 때에는 우선 /Library/StartupItems/MySQL 디렉토리를 만들어야 한다. 사실 디렉토리의 이름은 그다지 중요하지 않다. 어쨌든 그 디렉토리에는 다음과 같은 파일이 있어야 한다.
유닉스 스크립트는 MySQL을 시작할 때 safe_mysqld 명령어를 호출하기 위한 간단한 스크립트이다. 이 파일명은 디렉토리의 이름과 같아야 한다(여기에는 MySQL). 스크립트는 다음과 같이 만들면 된다:
#!/bin/sh ./etc/rc.common if ["${MYSQLSERVER:=-NO-}" = "-YES-"]; then cd /usr/local/mysql bin/mysqld_safe --user=mysql & fi
$MYSQLSERVER의 값을 확인하는 부분을 넣어 두면 MySQL을 사용하고 싶지 않을 때, StartupItems에서 MySQL 디렉토리를 지울 필요 없이 Mac OS X hostconfig 파일의 내용만 수정하면 된다. MySQL을 사용할 때에는 /etc/hostconfig 파일에 다음과 같은 내용을 추가하면 된다:
MYSQLSERVER=-YES-
MySQL을 사용하지 않을 때에는 위에 있는 -YES-를 -NO-로 바꾸면 된다.
스크립트 설치를 끝내고 나면 StartupParameters.plist 파일을 만들어야 한다:
{ Description = "MySQL Database Server"; Provides = ("MySQL"); Requires = ("Resolver"); OrderPreference = "None"; Message = { start = "Starting MySQL Server"; stop = "Stopping MySQL Server"; }; }
이 파일은 Mac OS X에 이 디렉토리에 있는 서비스에 대한 설명을 해 주고 다른 서비스에 대한 의존성을 알려주는 역할을 한다. 시스템을 재부팅하면 서비스 시작 메시지가 나올 때 "Starting MySQL Server"라는 메시지가 나오는 것을 볼 수 있다.
윈도우 NT/2000
윈도우 NT 시스템에서는 NT 서비스 형태로 설치된 모든 애플리케이션을 자동으로 시작하고 종료시킨다. 윈도우 시스템에서 MySQL을 서비스로 설치하는 방법은 2장에서 나와 있다.
로그
MySQL 서버에서는 다음과 같은 로그를 만들 수 있다.
mysql.server 또는 safe_mysqld를 이용하여 MySQL을 시작하면 에러 로그가 만들어진다. 원한다면 위에 있는 모든 로그를 기록할 수도 있고, 로그를 전혀 기록하지 않도록 할 수도 있다. 따로 실정해주지 않으면 로그 파일은 데이터 디렉토리에 저장된다.
에러 로그
에러 로그에는 safe_mysqld 스크립트에서 디다이렉트된 출력이 기록된다. 유닉스에서는 hostname.err(hostname 자리에는 호스트명이 들어감)이라는 파일로 저장된다. 윈도우에서는 mysql.err이라는 파일로 저장된다. 이 파일에는 서버가 죽어서 재시작한 경우를 포함하여 매번 서버가 시작할 때와 종료할 때 내용이 기록된다. 테이블의 치명적인 에러 또는 경고 메시지도 이 로그에 기록된다(나중에 확인해야 하거나 고칠 때에는 이 로그를 참조하면 된다).
이진 로그
이진 로그에는 데이터를 갱신하는 모든 SQL 명령어가 기록된다. MySQL에서는 데이터베이스에 있는 데이터를 실제로 바꾼 선언문만을 로그에 남긴다. 예를 들어, 삭제 명령을 내렸는데 전혀 삭제된 행이 없다면 로그에 아무런 기록도 남지 않는다. 도한 어떤 열에 원래 들어있던 것과 같은 값을 다시 대입하면 그 내용도 로그에 기록되지 않는다. 업데이트 내역은 실행된 순서대로 기록된다.
마지막으로 백업한 이후에 일어난 모든 업데이트 내역을 보관할 때에는 이진 로그가 좋다. 예를 들어, 데이터베이스를 매일 한 번씩 백업하는데 데이터베이스가 깨져버렸다면 다음과 같은 방법으로 마지막으로 완료된 트랜잭션까지의 데이터베이스 내용을 그래도 살려낼 수 있다.
이진 로그를 활성화시킬 때에는 --log-bin=file 옵션을 사용한다. 파일명을 지정해주지 않으면 hostname-bin이라는 파일에 로그가 저장된다. 상대 경로를 사용하면 데이터 디렉토리를 기준으로 한 상대 경로로 간주된다. 그리고 파일명에 숫사 인덱스를 붙이기 때문에 파일명은 filename.number와 같은 형태가 된다(예를 틀어, hostname-bin.2). 이 인덱스는 파일을 순환(rotate)시키기 위한 용도로 쓰이는데, 다음과 같은 경우에 파일이 순환된다.
또한 사용중인 모든 이진 로그 파일의 목록이 저장된 인덱스 파일도 생성된다. 따로 설정해주지 않으면 파일명은 hostname-bin.index가 된다. 이 인덱스의 이름과 위치는 --log-bin-index=file 옵션으로 바꿀 수 있다.
이진 로그의 내용을 볼 때에는 mysqlbinlog 유틸리티를 사용한다. 다음 예에서 이진 로그가 어떤 식으로 작동하는지 알아보자. 이 예에서는 odin이라는 호스트에서 MySQL을 시작했고 log-bin 옵션을 전체 설정 파일인 /etc/my.cnf 파일에서 설정했다고 가정하자. 이 경우에 데이터 디렉토리에 다음과 같은 파일이 만들어진다:
$ cd /usr/local/mysql/data $ ls -l . . -rw-rw---- 1 mysql mysql 73 Aug 5 17:06 odin-bin.001 -rw-rw---- 1 mysql mysql 15 Aug 5 17:06 odin-bin.index . .
odin-bin.index 파일의 내용은 다음과 같다:
$ cat odin-bin.index ./odin-bin.001 $
위와 같은 인덱스 내용으로부터 인덱스와 같은 디렉토리에 odin-bin.001이라는 이진 로그파일이 있다는 것을 알 수 있다. mysqlbinlog 유틸리티를 이용하면 로그를 읽을 수 있다:
$ mysqlbinlog odin-bin.001 # at 4 #010805 17:06:00 server id 1 Start: binlog v 1, server 3.23.40-log created 010805 17:06:00 $
클라이언트에서 데이터베이스를 갱신할 때마다 이진 로그의 내용은 점점 불어난다. 예를 들어, mysql 명령 프롬프트에서 다음과 같은 명령을 내리는 경우를 생각해 보자:
$ mysql mysql> USE test; mysql> INSERT INTO test (object_id, object_title) VALUES (1, 'test'); Query OK, 1 row affected (0.02 sec) mysql> QUIT; Bye $
위와 같이 하고 나면 이진 로그의 내용이 다음과 같이 바뀐다:
$ mysqlbinlog odin-bin.001 # at 4 #010805 17:06:00 server id 1 Start: binlog v 1, server 3.23.40-log created 010805 17:06:00 # at 73 #010805 17:39:38 server id 1 Query thread_id=2 exec_time=0 error_code=0 USE test; SET TIMESTAMP=997058378; INSERT INTO test (object_id, object_title) VALUES (1, 'test'); $
즉 SQL 구문으로 데이터베이스를 갱신하면 이진 로그도 갱신된다. 로그를 밀어내고(flush) 새로운 이진 로그를 시작할 때에는 다음과 같이 하면 된다:
$ mysqladmin -u root -ppassword flush-logs
이렇게 하면 모든 새로운 갱신 내용이 odin-bin.002라는 파일에 저장된다. 또한 odin-bin.index 파일에도 odin-bin.002 파일이 추가되었음이 기록된다.
이진 로그에 있는 명령을 다시 실행시킬 때에는 mysqlbinlog의 결과를 파이프를 통해 mysql 클라이언트 도구로 보내면 된다:
$ mysqlbinlog odin-bin.001 | mysql
MySQL에서는 이진 로그를 제어하기 위한 몇 가지 옵션을 제공한다. --binlog-do-db=dbname 옵션을 지정하면 특정 데이터베이스를 갱신했을 때에만 로그를 기록한다. 특정 데이터베이스에 대해서 이진 로그를 기록하지 않을 경우에는 --binlog-ignore-db=dbname 옵션을 사용하면 된다.
느린 질의 로그
느린 질의 로그에는 long_query_time이라는 시스템 변수에 주어진 시간보다 더 오랜 시간이 걸린 모든 명령이 기록된다. 이 로그는 문제가 있는 질의를 찾아서 데이터베이스나 애플리케이션에서 튜닝이 필요한 부분을 밝혀낼 때 많은 도움이 된다.
느린 질의 로그를 사용하고 싶다면 --log-slow-queries=filename 옵션을 사용하면 된다. 파일 이름을 지정하지 않으면 자동으로 hostname-slow.log라는 파일에 저장되고, 디렉토리 이름을 지정하지 않으면 데이터 디렉토리에 저장된다. long_query_time 변수를 설정하고 싶다면 --set-variable long_query_time=time 옵션을 사용하면 된다(이때 time 자리에 초 단위로 시간을 지정하면 된다).
로그 순환
로그를 사용할 때에는 로그 파일이 너무 커지지 않도록 적당히 관리해애 한다. 잘못하면 파일 시스템에서 처리할 수 없을 만큼 로그 파일이 커질 수도 있기 때문이다.
하지만 여기에서 다루는 내용은 에러 로그에는 적용되지 않는다. 에러 로그는 safe_mysqld 스크립트에서 만들기 때문에 MySQL 서버에선 제어할 수 없고, flush-logs 명령어로 밀어낼 수도 없기 때문이다. 게다가 safe_mysqld에서는 매번 새로 시작할 때 새로운 로그를 만들지 않고 같은 로그에 내용을 덧붙인다. 에러 로그를 제대로 제대로 관리하려면 MySQL 서버의 시작 및 종료 스크립트를 수정해야 한다.
레드헷 리눅스를 사용한다면 mysql-log-rotate를 이용하여 로그를 순환시킬 수 있다. 이 프로그램은 MySQL을 설치했을 때 생기는 support-files 디렉토리에 들어 있다. 이 프로그램은 logrotate 유틸리티를 이용하여 자동으로 에러 로그를 순환시켜준다. 레드헷 리눅스에서 mysql-log-rotate를 설치할 때에는 그 파일을 /etc/logrotate.d 디렉토리에 복사하기만 하면 된다. 이 스크립트를 편집하려면 다른 로그도 순환시킬 수 있다. 기본적으로 이 스크립트에서는 질의 로그만 순환시킨다. logrotate에 대한 자센한 내용은 man 페이지나 레드헷 문서에서 찾을 수 있다.
리눅스에서 MySQL을 RPM 패키지로 설치하면 mysql-log-rotata가 자동으로 설치된다. RPM 설치기에서는 mysql-log-rotata를 /etc/logrotate.d에 복사할 대 그 이름을 mysql로 바꾼다. /etc/logrotate.d/mysql 파일이 있다면 로그 순환용 프로그램이 설치되어 있다고 보면된다.
레드헷 기반이 아닌 시스템에서는 로그 순환용 스크립트를 직접 만들어야 되는데, 사용하는 로그의 종류와 로그 저장 위치에 따라 스크립트의 내용이 달라진다. 하지만 로그파일을 복사한 다음 mysqladmin flush-logs 명령으로 로그를 다시 초기화하는 작업을 처리한다는 점은 같다.
백업
관리자가 해야 할 일 중 가장 중요한 것이 바로 백업 계획을 잡는 것이다. 특히 시스템이 다운되었을 때 데이터를 최대한 원래대로 복구해내는 것이 중요하다. 그리고 실수로 테이블을 지우거나 데이터베이스를 손상시킨 경우에도 백업해 둔 데이터가 있다면 문제를 쉽게 해결할 수 있다.
하지만 각 사이트마다 차이점이 있기 때문에 백업 문제에 있어서 어떤 방법이 딱 맞다고 할 수는 없다. 자신이 어떤 식으로 설치했는지, 어떤 기능이 필요한지에 따라 방법이 달라진다. 이 절에서는 백업을 할 때 지켜야 하는 일반적인 규칙과 백업 방법 등에 대해 설명할 것이다. 이 절에 나와 있는 내용을 바탕으로 자신의 상황에 맞는 적당한 백업 방식을 만들면 한다.
일반적으로 백업을 할 때 다음과 같은 점을 고려해야 한다.
이제 백업할 때 쓸 수 있는 두 가지 MySQL 유틸리티에 대해 알아보자.
mysqldump
mysqldump는 데이터베이스를 덤프해주는 MySQL 유틸리티이다. 이 프로그램에서는 기본적으로는 그 데이터베이스를 다시 만들 때 필요한 모든 명령어(CREATE TABLE, INSERT 등)가 들어 있는 SQL스크립트를 만든다. 이렇게 하면 mysqlhotcopy로 직접 복사하는 경우에 비해 다른 하드웨어나 운영 체제에서 같은 데이터베이스를 새로 만들기에 좋은(즉 이식성이 좋은) ASCII 형식으로 출력된다는 점이다. 그리고 출력 결과가 SQL 스크립트이므로 원하는 테이블만 골라서 복구할 수도 있다.
mysqldump로 데이터베이스를 백업할 때에는 -opt 옵션을 사용하는 것이 좋다. 이 옵션을 사용하면 -quick, --add-drop-table, --add-locks, --extended-insert, --lock-tables 옵션이 모두 선택되며 데이터베이스를 가장 빠르게 덤프할 수 있다. --lock-tables 옵션은 데이터베이스를 사용할 수 없다.
실제 명령은 다음과 같은 식으로 입력하면 된다:
$ mysqldump --opt test > /usr/backups/testdb
이렇게 하면 test 데이터베이스가 /usr/backups/testdb라는 파일로 덤프된다. 이진 로그를 사용한다면 --flush-logs 옵션을 사용하여 백업할 때 이진 로그를 새로 시작하도록 하는 것이 좋다:
$ mysqldump --flush-logs --opt test > /usr/backups/testdb
mysqldump에서는 백업할 때 사용할 수 있는 몇 가지 다른 옵션도 제공한다. mysqldump에서 사용할 수 있는 모든 옵션의 목록을 보고 싶다면 mysqldump --help라는 명령을 사용하면 된다.
mysqlhotcopy
mysqlhotcopy는 LOCK TABLES, FLUSH TABLES, 유닉스 cp 명령어 등을 조합하여 데이터베이스를 빠르게 백업하는 펄 스크립트이다. 이 스크립트에서는 데이터베이스 파일을 그대로 다른 곳으로 복사한다. 파일을 복사하기 때문에 mysqldump에 비해 훨씬 더 빠르지만 원래 이식 가능한 형태로 만들어지는 MyISAM 테이블을 제외하면 다른 하드웨어 또는 운영 체제에서 사용하기가 힘들다. 또한 mysqldump는 외부에서도 실행시킬 수 있지만, mysqlhotcopy는 데이터베이스와 같은 호스트에서만 실행시킬 수 있다.
mysqlhotcopy를 실행시킬 때에는 다음과 같은 명령을 사용한다:
$ mysqlhotcopy test /usr/backups
이렇게 하면 /usr/backups 디렉토리에 test 데이터베이스에 있는 모든 데이터 파일이 복사된다.
이진 로그를 사용한다면 --flushlog 옵션을 사용하면 백업을 마치고 나서 이진 로그를 새로 시작하는 것이 좋다.
복구
디스크에 하드웨어적인 문제가 있는 경우, 데이터 파일이 망가진 경우, 실수로 테이블을 지워버린 경우와 같이 데이터를 복구해야 하는 상황은 정말 다양한다. 이 절에서는 복구 절차에 관한 전반적인 내용을 다뤄보기로 한다.
일반적인 데이터베이스를 복구할 때에는 백업 파일과 이진 로그, 이렇게 두 가지가 필요하다. 복구 절차는 크게 다음과 같이 나눌 수 있다.
이진 로그 기능을 사용하지 않았다면 마지막으로 백업한 부분까지만 복구할 수 있다.
mysqldump 복구
여기에서는 앞에서 덤프한 test라는 데이터베이스를 북구한다고 가정하겠다.
다음과 같은 명령을 실행하면 데이터베이스를 다시 볼러올 수 있다:
$ cat test.dump | mysql
이 명령을 실행시키면 mysqldump에서 만들어낸 SQL 명령을 모수 실행시키게 되므로 마지막으로 데이터베이스를 백업할 시점의 상태 그대로 돌아갈 수 있다.
시스템을 마지막으로 백업할 상태로 돌로놓고 나면 이진 로그를 이용해서 마지막 백업 이후에 처리된 트랜잭션을 다시 실행시키면 된다. 로그에 여러 개의 데이터베이스에 대한 내용이 들어 있는데 그 중 하나만 복구하고 싶다면 --one-database 옵션을 사용해서 다른 데이터베이스에 적용되는 SQL 명령을 걸러낼 수 있다. 또한 이진 로그 중에서 마지막 백업 이후에 기록된 부분만 다시 실행시켜야 한다. 각 이진 로그 파일에 대해 다음과 같은 명령을 입력하자:
$ mysqlbinlog host-bin.xxx | mysql --one-database=testdb
경우에 따라 mysqlbinlog 프로그램에서 출력된 결과를 조금 수정해야 할 수도 있따. 예를 들어, DROP TABLE 명령을 잘못 내려서 지워진 테이블을 복구한다면 mysqlbinlog에서 출력된 내용 중 DROP TABLE 선언문 부분을 지워야 한다. 그렇게 하지 않으면 열심히 복구한 테이블이 다시 삭제된다. 따라서 이런 경우에는 mysqlbinlog에서 출력된 내용을 텍스트 파일에 저장해서 편집하고, 그 텍스트 파일을 이용하여 데이터베이스를 복구해야 한다.
mysqlhotcopy 복구
mysqlhotcopy 백업 데이터로부터 복구할 때에는 서버가 멈춰 있는 상태에서 데이터베이스 파일을 백업 디렉토리에서 mysql 데이터 디렉토리로 복사하면 된다. 데이터베이스를 /var/backup/test에 백업했다고 가정하고, MySQL 데이터 디렉토리가 /usr/local/mysql/data 라면 다음과 같은 명령을 실행시켜서 마지막에 백업한 시점으로 데이터베이스를 되돌릴 수 있다:
$ cp -R /var/backup/test /usr/lcoal/mysql/data
이제 mysql 서버를 다시 시작시키고 앞에서 설명한 것처럼 이진 로그를 적용시키면 시스템을 완전히 복구할 수 있다.
테이블 관리 및 복구
데이터 파일에 대한 쓰기 작업이 제대로 처리되지 않았을 때 데이터베이스 파일이 망가질 수도 있다. 전원이 나가거나 MySQL 서버를 정상적으로 종료시키지 않으면 이런 일이 일어날 수 있다.
MySQL에서는 myisamchk/ismchk와 mysqlcheck라는 두 가지 방법으로 테이블 에러를 알아내고 수리할 수 있다. 웬만하면 정기적으로 테이블에 문제가 있는지 검사하는 것이 좋다. 데이터베이스에 문제가 있다는 것을 일찍 발견할수록 테이블을 성공적으로 복구할 수 있는 가능성이 높아지게 마련이다.
mysqlcheck는 MySQL 3.23.38부터 새로 등장한 프로그램이다. myisamchk/isamchk와 mysqlcheck의 가장 큰 차이점은 mysqlcheck에서는 서버가 돌아가고 있을 때에도 테이블을 검사하거나 수리할 수 있다는 점이다.
myisamchk와 isamchk는 서로 상당히 유사하다. 이 둘의 기능은 같지만 myisamchk는 MyISAM 테이블에서 isamchk는 ISAM 테이블서 사용한다. mysqlcheck는 MyISAM 테이블에서만 사용할 수 있다.
테이블 검사
테이블에 어떤 문제가 있는 것 같다면 우선 테이블 검사용 유틸리티를 이용하여 테이블을 검사해야 한다. 데이터 파일의 확장자를 보면 테이블의 종류를 알 수 있다. 파일 확장자가 .MYI라면 MyISAM 테이블이고 .ISM이면 ISAM 테이블이다. 따라서 .MYI 파일에 대해서는 myismchk와 mysqlcheck를, .ISM 파일에 대해서는 isamchk를 사용하면 된다.
table1(ISAM 테이블)과 table2(MyISAM 테이블)라는 두 개의 테이블이 있는 test라는 테이터베이스가 있다고 가정하자. 우선 적절한 유틸리티로 테이블을 검사해야 한다. myisamchk와 isamchk를 사용할 때에는 파일을 읽는 도중에 서버에서 파일에 쓰기 작업을 하는 것을 방지하기 위해 MySQL 서버를 종료시켜야 한다:
$ myisamchk table2.MYI Data records: 0 Deleted blocks: 0 - check file-size - check key delete-chain - check record delete-chain - check index reference $ isamchek table1.ISM Checking ISAM file: table1.ISM Data record: 0 Deleted blocks: 0 - check file-size - check delete-chain - check index reference $ mysqlcheck test table2 test.table2 OK
위와 같은 결과가 나오면 두 테이블 모두 에러가 없음을 알 수 있다.
간단한 에러를 찾아낼 때에는 위와 같은 기본적인 검사만으로도 충분하다. 에러는 없지만 테이블이 손상된 것 같다면 myisamchek/isamchk의 --extend-check 옵션이나 mysqlcheck의 --extend 옵션으로 확장 검사를 할 수 있다. 확장 검사를 하면 시간은 조금 오래 걸리지만 매우 자세히 검사할 수 있다. 확장 검사에서도 아무로 에러가 없다면 테이블에 문제가 없음을 알 수 있다.
테이블 복구
검사 결과 테이블에 에러가 있다면 그 에러를 고쳐야 한다.
myisamchk나 isamchk를 사용하는 경우에는 테이블을 복구할 때 MySQL 서버를 종료해야 한다. 그리고 만약에 대비해서 테이블을 복구하기 전에 데이터 파일을 백업해 두는 것이 좋다.
우선 --recover 옵션을 주고, myisamchk/isamchk를 실행해 보자:
$ isamchk --recover table1.ISM - recovering ISAM-table 'table1.ISM' Data records: 3 $ myisamchk --recover table2.MYI - recovering (with keycache) MyISAM-table 'table2.MYI' Data records: 2
위와 같이 해도 문제가 해결되지 않는다면 느리긴 하지만 --recover로는 수정할 수 없는 에러도 고칠 수 있는 --safe-recover 옵션을 사용해 보자:
$ isamchk --safe-recover table1.ISM - recovering ISAM-table 'table1.ISM' Data records: 3 $ myisamchk --safe-recover table2.MYI - recovering (with keycache) MyISAM-table 'table2.MYI' Data records: 2
mysqlcheck에서느 복구 옵션이 --repair밖에 없다:
$mysqlcheck -repair test table2 test.table2 OK
이렇게 해도 안 된다면 백업 자료와 이진 로그를 이용해서 테이블을 복구하는 수밖에 없다. 자세한 내용은 "백업" 절과 "복구" 절에 나와 있다.
테이블 정기 검사
테이터베이스 파일에 대해서 정기적으로 테이블 검사를 해 주는 것이 좋다. isamchk/myisamchk/mysqlcheck 명령을 처리하는 스크립트를 만들어서 cron과 같은 스케쥴링 소프트웨어에서 정기적으로 실행하도록 만들면 된다.
또한 시스템이 부팅될 때 테이블을 검사할 수 있도록 시스템 부팅 절차를 조금 고치는 것도 괜찮은 생각이다. 이렇게 하면 특히 시스템이 다운된 후에 재부팅할 때 여려 모로 도움이 된다.
한빛미디어 "MySQL 시스템 관리와 프로그래밍"
[MySQL] Got error 28 from storage engine (0) | 2008.03.03 |
---|---|
[MySQL] mysqld_multi 사용법, 데몬 두 개 운영하기 (0) | 2006.11.03 |
mysql 관리 툴 EMS (0) | 2006.09.30 |
[Mysql] GRANT로 사용자 추가하기 (0) | 2006.08.28 |
replication 사용하기.. version - 4.0.17 (0) | 2004.07.06 |
[펌] 웹 로그 통계 내기 - AWStats (0) | 2004.06.30 |
---|---|
[펌] 고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 (0) | 2004.06.30 |
[펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) | 2004.06.30 |
[펌] 서버 모니터링 툴의 강자, RRDtool 가이드 (0) | 2004.06.29 |
[펌] 웹 로그분석의 절대강자는? (0) | 2004.06.28 |
출처: KLDP
[강좌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기
글쓴날 : 2000년 2월 22일(화)
글쓴이 : 문태준
(http://www.taejun.pe.kr, taejun@taejun.pe.kr, taejun@hitel.net)
참고자료
man syslogd.conf
man sysklogd
man logrotate
20만통의 전자메일과 sendmail(마소 99년 5월)중 로그 파일 관리부분
기타 리눅스 및 유닉스 시스템 관리 관련 서적
0. 들어가며
시스템에는 사용자 로그인, 메일등 모든 시스템 활동에 대한 로그를 기록
하고 이를 가지고 시스템의 문제에 대해서 분석할 수 있다.
시스템의 로그가 어떤 식으로 기록되고 어떤 의미를 가지고 있는지,
이를 어떻게 활용해야할지 시스템 관리자라면 반드시 숙지하고 있어야
할 것이다.
소규모로 서버를 운영하는 경우 로그파일에 그다지 신경을 쓰는 일이 없다.
그렇지만 제공하는 서비스가 많아지고 규모가 커질 경우 예상치 못한 곳에
서 문제가 생기는 일이 많다. 그중 하나가 엄청나게 증가하는 로그파일문제
이다.
예를 들어보자. 하루에 10만통의 전자메일을 처리하는 경우를 생각해보자.
sendmail은 전자메일을 전송하면서 그 결과 메시지른 syslogd를 이용
/var/log/maillog에 저장한다. (이는 설정에 따라 다를 수 있다) 또한
여기에 pop3를 사용해 메일을 가져간 기록과 메일을 전송한 기록까지
저장되어야한다.
정상적으로 전자메일이 전송되는 경우 기록되는 메시지는 560 바이트정도
이다. 그렇지만 전송시 에러가 나는 경우에는 그 에러 횟수에 따라 에러
메시지가 추가된다. 평균 하나의 전자메일이 1KB 정도의 로그를 기록한다
고 해보자.
하루에 10만개의 메일을 전송한다면 하룻동안 로그의 크기만
100M 이고 일주일이면 700MB이다.
여기에 메일계정이 1000명이고 각 사용자가 5분마다 pop3로 메일을 확인
한다고 했을 경우를 추가해야한다. 한번에 약 0.2KB의 로그가 쌓이면
시간당 12번(5분에 한번씩 확인하는 경우), 하루 8시간 근무시 96번이고
96*0.2KB = 192kb이다. 1000명이므로 192MB가 되고 일주일이면 일요일을
제외하더라도 1.15G정도가 된다.
한 사람당 메일용량을 10M씩 할당하면 전자메일을 저장할 용량만으로
10G가 필요하고 로그를 위해 2G 이상이 필요하다. 여기서 그냥 2G로
끝나는 것이 아니라 rotate 값이 4라면 8G가 된다. 가히 끔찍한 상황이
예상되지 않는가?
여기서만 끝나는 것이 아니다. syslogd는 maillog를 열어놓고 계속 로그
를 기록하는데 로그파일이 1M이상 넘어가면 하나의 메시지를 처리하기
위해 시스템 자원을 10% 이상 사용한다고 하며 10M가 넘으면 40% 이상,
100M가 넘으면 80% 이상의 시스템 자원을 사용한다고 한다.
(물론 이는자신의 시스템 상황을 끊임없이 모니터링해서 자신에 맞추어야 할 것이
다) 결국 서비스를 제공하는데 자원을 사용해야하는데 엄청나게 커진
로그파일때문에 시스템의 자원이 없어져서 나중에는 전자메일 전송이
아니라 로그 기록에 모든 cpu 시간을 사용해야한다.
하드 디스크를 빈번하게 사용하는 작업이 많으면 시스템의 성능은 급격하게 떨어진다.
이제 웹서버로그 기록을 살펴보자. 이용자가 접속할 때마다 기록되는
access_log는 한번 접속당 약 85Byte가 증가한다. 하루 10만번 접속
하면 8.5M이다. 일주일이면 59.5M이다. 한달이면 255M이다. 서비스하
는 규모가 더 크다면 로그파이을 액세스하고 갱신하는데는 더 많은
시스템 자원을 사용할 것이다.
서론을 이렇게 장황하게 이야기한것은 관리자가 로그 기록에 신경을
쓰지 않는다면 대규모 서비스를 제공하면서 얼마나 큰 문제가 생길수
있는지를 알려주고자 하기 위함이다. 필자의 개인 홈페이지에서야
그런 문제가 생기지는 않겠지만....
로그 기록을 어떤 식으로 설정할 것인가? 정책에 관한 것은 관리자가
해야 할 몫이라 생각하며 여기에서는 로그 파일의 설정 및 로테이션
에 대해서 설명을 한다. 필자가 책을 그다지 뒤져보지 않아서 그런지
는 모르겠는데 유닉스 서버 관리 서적에도 이에 대해서는 그리 자세히
나와있지 않아서 이번 기회를 이용해 정리해보고자 한다.
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 0:00 [mdrecoveryd]
root 285 0.0 0.5 1232 180 ? S 14:07 0:00 syslogd -m 0
root 296 0.0 0.0 1464 0 ? SW 14:07 0: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 이라고 하면 그에 대한 모든 로그 메시지를 제외하라는 뜻입니다.
모든 facility 나 priority 를 지정하려면 * 를 쓰면 되며
여러개를 지정하려면 , 를 사용하면 됩니다.
그런데 여기서 반드시 알아두야할것이 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
# 모든 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
# 부트 메시지 기록
보통 위의 내용이 일반적인 배포판 구성이다.
아마 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 \
'태준이가 이상한 곳에서 로그인했어요... 오옷 이런~~'
# 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이 제일 처음 생성되고
순환간격마마 예전 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 samba squid 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 에서 메일서버의
로그만 따로 처리를 해보겠다.
# 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의 보안을 위한 보안 패키지도 있습니다.
http://www.core-sdi.com/english/freesoft.htm
secure system logging tool 입니다.
그런데 지원하는 것을 보면 슬랙웨어이군요.
컴파일하여 설치하는 것이니깐 무난히 설치될 것이라 예상되네요.
막상 퍼왔지만.. 읽어 보니 .. 당체 감이 안오는 군여..^.^;
언젠가는 이내용을 이해할수 잇을 정도의 내공을 쌓겟져..머...헤헤..
[펌] 고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 (0) | 2004.06.30 |
---|---|
[펌] 시스템 최적화 - 로그파일 분석 및 효율적으로 관리하기 (0) | 2004.06.30 |
[펌] 서버 모니터링 툴의 강자, RRDtool 가이드 (0) | 2004.06.29 |
[펌] 웹 로그분석의 절대강자는? (0) | 2004.06.28 |
[펌] 표준 보안 퍼미션 설정 (0) | 2004.06.25 |