DRAC이란?
DRAC은 Dynamic Relay Authorization Control 약어로 sendmail을 위한 릴레이
허용맵을 동적으로 갱신하는 데몬이다. 선의의 사용자가 SMTP 서버에 접근할 수
있도록 만들면서도 스패머 접근은 차단하는 특징이 있다.
원리는 단순하다. 사용자가 POP3나 IMAP으로 접근할 때 사용자 IP를 맵에 동적으로
할당해놓고 향후 SMTP 서비스 요청이 들어올 때 이 IP가 직전 인증받은 IP인지
확인하는 과정을 밟는다.
DRAC은 노트북을 들고 이리저리 옮겨다니는(roaming) 사용자에게 절대적으로 필요한
서비스다. POP으로 인증받은 직후 30분이 릴레이를 허용하는 임계 시각이지만
계속해서 갱신이 가능하다. POP 서버는 편지를 체크하기 위해 주기적으로 이러한
갱신 과정을 자동으로 밟으므로 실전에서 불편을 느끼지 않고 사용하기에 특별한
문제는 없다.
만일 반영구적으로 특정 IP 주소에 대한 릴레이를 허용하려면 효율을 높이기 위해
sendmail에서 제공하는 릴레이 허용 기법을 사용하자.
자 그러면 이제 본격적인 DRAC 탐험에 들어가자.
DRAC 설치 방법
DRAC 설치를 위해 다음 절차를 따른다.
DRAC 패키지 구하기
DRAC 최신 버전은 1.11이며
압축된 tarball 파일로
존재한다. RPM을 가져올 경우에는 sendmail에서 사용하는 버클리 DB 라이브러리
버전과 동일한지 반드시 체크해야 한다(힌트: ldd 명령). tarball을 가져올 경우
DRAC 크기는 얼마되지 않지만 부가적으로 필요한 라이브러리가 존재하므로 컴파일
전에 다음 사항을 체크한다.
- 버클리 DB: 버전은 1.85 이상이면 되지만, 반드시 sendmail이
사용하는 버전과 일치해야 한다. 그렇지 않으면 일대 재앙이... 가장 최신
버전은 3.2.9이다.
버클리 DB 설치법은 Sendmail
& POP3 Pages에 있는 sendmail 설치 가이드를 참조하자.
- sendmail MTA: 버전은 8.9.x 이상이면 되지만, 되도록 최신 버전을 사용하기
바란다. 되도록이면 8.11.x 계열을 설치하자. sendmail 설치법은
Sendmail & POP3 Pages를
참조하기 바란다.
- qpopper: qpopper는 3.0.x 버전부터 DRAC을 지원하고 있다. 따라서 3.0 이전
버전을 사용하는 분들은 이번 기회에 판올림하자. qpopper 설치법은 마찬가지로
Sendmail & POP3 Pages를
참조하기 바란다. 지극히 당연한 이야기겠지만, DRAC 설치 후에 qpopper를
컴파일한다.
- portmap: 눈치 빠른 사람이라면 알겠지만 DRAC은 RPC를 사용해서 POP과 IMAP
서버와 통신한다. 따라서 반드시 portmap을 돌린다.
리눅스라면 chkconfig 명령으로 portmap이 제대로 동작하고 있는지 확인하기
바란다. 일반 유닉스 사용자라면 ps 명령으로 portmap 프로세스가 떠 있는지
살펴본다. 이렇게 클라이언트 서버로 움직이므로 DRAC 서버와 POP 서버가
같은 호스트에 있을 필요는 없다. 하지만 POP 서버와는 달리 DRAC 서버는 반드시
sendmail이 동작하는 호스트에 있어야 한다. 그 이유는 맵 파일 생성 때문이다. RPC를
지원하는 대부분 운영체제는 portmap을 기본으로 장착하고 있기에 시동 유무만
따져주기 바란다.
DRAC 컴파일
DRAC는 sendmail과 qpopper와 비교하여 아주 작은 패키지이므로 configure 스크립트가
없다. 이 말은 필요한 환경 설정을 모두 자신이 해야 한다는(DIY, Do It Yourself)
사실을 의미한다. 절망적인가? 하지만 다행히도 컴파일을 위한 설정이 크게
어렵지않다.
drac.tar.Z를 푼 다음에 Makefile을 수정해보자. drac.tar.Z를 풀면 별도 디렉토리를
만들지 않고 현재 디렉토리에 모든 파일을 풀어버리므로 drac이라는 디렉토리를
만든 다음 여기에 풀면 깨끗한 디렉토리 구조를 유지할 수 있다.
Makefile을 열어서 몇몇 마크로를 수정한다. 리눅스라면 다음과 같이
고치면 문제 없을 것이다. 버클리 DB 설치 위치에 따라 CFLAGS와 LDLIBS 항목을
적절히 수정하기 바란다. 다른 운영체제를 사용한다면 DRAC 패키지 아래 INSTALL
파일을 참고하여 각자 환경에 맞게 설정한다.
INSTALL = install
EBIN = /usr/local/sbin
MAN = /usr/local/man/man
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C
CC = gcc
RANLIB = :
CFLAGS = $(DEFS) -g -I/usr/local/BerkeleyDB/include
LDLIBS = -L/usr/local/BerkeleyDB/lib -ldb
TSTLIBS = -L. -ldrac
RPCGENFLAGS = -C -I
MANLIB = 3
MANADM = 8
이제 전형적인 make, make install 과정을 밟는다. 메뉴얼이 필요하면
make install-man 과정을 밟기 바란다.
DRAC 환경 설정
DRAC 설치까지 끝났다면 각자 상황에 맞게 몇가지 환경 설정 작업을 수행한다.
DRAC과 직접 관련이 없더라도 보안을 위해 필요한 작업도 있으므로 상황을
잘 판단하여 적용하기 바란다.
POP서버와 DRAC 서버가 떨어져있을 경우 /etc/mail/dracd.allow 파일을 만들고
이 파일에 /var/yp/securenets 파일과 유사한 형식으로 허용 IP 범위를
지정한다. 예는 다음과 같다.
255.255.255.252 192.168.16.0
255.255.255.255 192.168.16.8
255.255.255.255 127.0.0.1
192.168.16.0에서 8번까지 허용한다. localhost인 127.0.0.1을 추가한 사실에
주목하기 바란다. dracd와는 달리 portmap은 /etc/hosts.allow를 사용하고 있으므로,
이를 사용해서 접근을 열어줄 IP 주소를 제어할 수도 있다(여러분이 사용하고 있는
운영체제는 hosts.allow 기능을 제공하지 않을 수도 있다).
portmap: 192.168.16.0/255.255.255.16
DRAC을 지원하도록 qpopper를 컴파일했다면, 설치 후 xinetd.d 아래 pop3나
inetd.conf를 열어서 qpopper 인수에 -D DRAC_host_ip 를 추가한다.
-D 옵션 기본값은 localhost이므로 DRAC과 POP 서버가 같은 기계에 있다면
추가할 필요가 없다. 대부분 같은 기계에 존재할 가능성이 높으므로 그냥 넘어가도
무방하다.
DRAC 시동
드디어 DRAC를 시동할 시점이 왔다. 먼저 portmap이 떠 있지 않으면 portmap을
띄운다. 다음으로 DRAC을 시동할 스크립트를 적절한 위치에 가져다 놓는다.
운영체제마다 부팅 절차가 다르므로 메뉴얼을 참고한다. 리눅스라면
drac 패키지 디렉토리에 있는 dracd-setup.linux를
/etc/rc.d/init.d/dracd라는 이름으로 복사한다. 그리고 실행 단계 3에서
수행할 수 있도록 ln -s /etc/rc.d/init.d/dracd /etc/rc.d/rc3.d/S99dracd 명령을
내린다.
주의: 여기서 dracd-setup.linux에 PATH가 걸려있지 않으므로
/etc/rc.d/init.d/dracd 파일 첫부분에
PATH=/usr/local/sbin:/sbin:/bin:/usr/bin:/usr/sbin를 추가하기 바란다.
준비가 끝났으면 시스템 관리자 권한으로 /etc/rc.d/rc3.d/S99dracd 명령을
실행한다. OK가 나오는가?
DRAC 테스트
이제 DRAC과 관련한 환경을 제대로 잡았다면 DRAC 테스트에 들어가자.
DRAC 자체 테스트
이상의 과정을 마쳤다면 DRAC 데몬이 제대로 동작하는지 확인하는 과정을 밟는다.
가장 먼저 /etc/mail/dracd.db 파일이 생겼는지 확인한다.
만일 이 파일이 생기지 않았다면 dracd가 떠 있는지(중간에 죽지는 않았는지)
살펴야 한다.
POP3 연동 테스트
DRAC이 동작한다는 사실을 확인했다. 그렇다면 이번에는 POP3 연동 테스트를 할
차례이다. 다음과 같은 방법으로 테스트하자.
[root@mail /etc/mail]# telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK QPOP (version 4.0.3) at mail.my.net starting.
user foo
+OK Password required for foo.
pass bar
+OK foo has 0 visible messages (0 hidden) in 0 octets.
quit
+OK Pop server at mail.my.net signing off.
여기서 변경해야 할 내역은 user foo, pass bar, quit 세 행이다. foo 대신 여러분
계정을 bar 대신 foo 계정 암호를 입력해야 한다. 이상의 과정을 밟았다면
/etc/mail/dracd.db 파일 날짜를 확인해서 qpopper 데몬에 접속한 시각과
일치하는지 비교한다. 시각과 일치하면 다음과 같은 grep 명령으로 지역
호스트(127.0.0.1)가 잡히는지 살펴본다.
[root@mail /etc/mail]# grep 127.0.0.1 dracd.db
Binary file dracd.db matches
여기까지 무사히 따라왔다면 DRAC 설치가 성공리에 끝났다고 볼 수 있다. 하지만,
여전히 큰 산이 하나 남아있다.
DRAC을 위한 sendmail 설정
이제 DRAC 설치에서 가장 까다로운 강적을 상대로 한판 승부를 벌여야 한다.
바로 DRAC과 연동하기 위한 sendmail 설정이다. sendmail.cf 악명은 익히 알려져
있다. 이 파일을 변경하기 위한 여러가지 방법이 존재하지만 여기서는 수동으로
고치는 방법을 소개하겠다.
먼저 sendmail.cf를 백업받자. sendmail.cf 위치는 /etc/, /etc/mail/을
살펴보기 바란다.
sendmail.cf를 열어서 local info: 아래 적당한 위치에 다음 행을 넣는다.
# dynamic relay authorization control map
Kdrac btree /etc/mail/dracd
그리고 SLocal_check_rcpt 바로 아래에 다음 행을 추가한다. 중간 여백은 반드시
탭으로 교체해야 한다. 이 사실을 망각하는 순간 블랙홀에 빠질지도 모른다.
# allow recent POP/IMAP mail clients to relay
R$* $: $&{client_addr}
R$+ $: $(drac $1 $: ? $)
R? $@ ?
R$+ $@ $#OK
통합 테스트
험난한 과정을 거쳐 여기까지 왔다면 시간을 제법 많이 소비했을 것이다. 커피잔이
여기저기 엎어져 있고, 먹다 남은 피자 조각도 컴퓨터 책상 주위에 흩어져 있을지도
모르겠다. 이제 통합 테스트 과정만 넘기면 푹 쉴 수 있다. 조금만 더 힘내자.
통합 테스트에 앞서 sendmail 데몬을 다시 띄우자. killall 명령이 없으면 ps
명령으로 프로세스 ID를 확인한 다음 kill 명령을 사용하기 바란다.
[root@mail /etc/mail]# killall sendmail
[root@mail /etc/mail]# sendmail -q30m -bd
이제 relay를 허용하지 않은 호스트 하나를 설정해서 이 곳에서 telnet으로
DRAC+sendmail+qpopper가 동작하는 호스트로 전자편지 요청을 시도해본다.
- relay를 허용하지 않은 호스트에서 smtp 요청을 시도한다. "Relaying denied"라는
문구가 나와야 한다.
% telnet mail.my.net 25
Trying 192.168.1.1...
Connected to mail.my.net.
Escape character is '^]'.
220 mail.my.net ESMTP Sendmail 8.11.0/8.11.0; Tue, 21 Nov 2000 10:56:01 -0600
helo blah
250 mail.my.net Hello bofh [192.168.1.2], pleased to meet you
mail from: bgates@microsoft.com
250 2.1.0 bgates@microsoft.com... Sender ok
rcpt to: president@whitehouse.gov
550 5.7.1 president@whitehouse.gov... Relaying denied
quit
221 2.0.0 mail.my.net closing connection
- 이제 POP3 요청으로 DRAC 맵을 만든다.
# telnet mail.my.net 110
Trying 192.168.1.1...
Connected to mail.my.net.
Escape character is '^]'.
+OK QPOP (version 4.0.3) at mail.my.net starting.
user foo
+OK Password required for foo.
pass bar
+OK foo has 0 visible messages (0 hidden) in 0 octets.
quit
+OK Pop server at mail.my.net signing off.
- 다시 한번 smtp 요청을 시도해본다. 앞서 시도와는 달리 릴레이를 허용함을
확인할 수 있다.
[root@bofh /root]# telnet mail.my.net 25
Trying 192.168.1.1...
Connected to mail.my.net.
Escape character is '^]'.
220 mail.my.net ESMTP Sendmail 8.11.0/8.11.0; Tue, 21 Nov 2000 10:56:01 -0600
helo blah
250 mail.my.net Hello bofh [192.168.1.2], pleased to meet you
mail from: bgates@microsoft.com
250 2.1.0 bgates@microsoft.com... Sender ok
rcpt to: president@whitehouse.gov
250 2.1.5 president@whitehouse.gov... Recipient ok
quit
221 2.0.0 mail.my.net closing connection
여기까지 무사히 왔다면 정말 축하한다. 이상으로 상황 종료이다.
Trouble Shooting
독자 여러분이 질문하는 내용에 따라 추후 내용을 보강하기로 약속한다. 일단
문제가 생기면 다음 사항을 먼저 검토해보기 바란다.
각종 데몬이 모두 제대로 떠 있는가?
DRAC, qpopper, sendmail이 제대로 동작하고 있는지 확인하기 바란다. ps 명령으로
DRAC과 sendmail을 확인할 수 있으며, telnet 명령으로 qpopper와 sendmail 동작을
확인할 수 있다.
정말 제대로 DRAC 맵이 만들어 졌는가?
DRAC, qpopper, sendmail이 모두 동작하고 있다. 그렇다고 DRAC 맵이 제대로
동작하고 있다는 보장은 하지 못한다. 그렇다면 어떻게 검사할까? 다음 방법을
한번 생각해보기 바란다.
[root@bofh /root]# /usr/lib/sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /map drac 192.168.1.2
map_lookup: drac (192.168.1.2) returns 963532780 (0)
여기서 no match가 나오면 해당 맵이 없다는 결론을 내릴 수 있다. qpopper에서
맵을 잘못 만드는지 sendmail이 맵을 잘못 읽는지 확인 작업에 나서기 바란다.
버클리 DB 2.x 계열을 사용한다면 db_dump 명령을 사용하면 DRAC 맵을 직접 읽을
수 있다. 다음과 같이 명령을 내려보자.
[root@bofh /root]# db_dump -p /etc/mail/dracd.db
여기서 맵을 제대로 출력하면 sendmail 쪽에 문제가 있다는 이야기이다. 그렇지
않다면 qpopper를 의심해야 한다.
DRAC이 제대로 동작하는가?
qpopper가 제대로 동작하는지 그렇지 않은지를 시험하는 비용보다 DRAC이 제대로
동작하는지 그렇지 않은지를 시험하는 비용이 훨씬 싸다. 다음과 같은 명령을
한번 내려보자.
[root@bofh /root]# ./testing localhost 192.168.1.2
testing 프로그램은 DRAC 패키지를 컴파일한 디렉토리에서 찾을 수 있다.
상기 명령을 내린 직후 맵을 한번 검사해보기 바란다. 맵에 192.168.1.2가 없으면,
DRAC에 문제가 생겼다고 확신할 수 있다.
qpopper가 제대로 동작하는가?
컴파일 잘못등으로 인해 qpopper가 제대로 동작하지 않을 수 있다. 로그 파일등을
뒤져서(힌트: 로그 단계를 올리면 보다 세부적인 정보를 얻을 수 있다) 무엇이
문제인지 파악에 나서기 바란다.
sendmail이 제대로 동작하는가?
참으로 어려운 문제이다. 참고 URL에 제시한 "Debugging check_* in sendmail 8.8/8.9"를
참조하여 해결에 나서기 바란다.
참고 URL
이 글을 적는데 참고한 URL은 다음과 같다.
기타
- 이 문서의 저작권과 라이선스 방식은
삼바 설치 및 활용 가이드에 준한다.
- 의문 사항이 생길 경우 전자편지를 사용하여 질문하면 feedback을 받을
수 있을 것이다.
|