2008. 9. 18.

qmail에 DomainKeys 적용

이번 강좌는 발신지변조 방지 기술중 하나인 DomainKeys 시스템에 대해 다뤄보도록 하겠습니다.
도메인키 시스템은 Yahoo에서 주도하여 개발된 새로운 인증 방법으로써 최근엔 쥐메일 등과 같은
업체에서도 시범적 적용을 하고 있는 기술 입니다.
이 기술은 발신지 메일서버의 비밀키로 사인(Sign)되어온 메일의 도메인 정보를 가지고
수신지에서 발신지의 공개키(public key)를 이용하여 발신지 서버에 인증을 한뒤
메일의 정상유무를 확인하는 방법으로 최근 유행하는 피싱(phising) 또는 발신지 변조메일 등을
원천적으로 차단할 수 있습니다.
이는 기존 AOL의 SPF 기술보다 한단계 진보한 기술이라 볼 수 있습니다.

만약 이 기술에 대해서 자세한 문헌을 보고 싶다면 아래 URL을 참조하시기 바랍니다.
※ http://domainkeys.sf.net/ , http://antispam.yahoo.com/domainkeys

1. libdomainkeys 다운로드 (최신버전: http://sourceforge.net/projects/domainkeys/)
libdomainkeys는 gmail.com 의 운영자인 Russell Nelson 씨가 만든 라이브러리로써,
쉽고 빠르게 적용할 수 있다는 장점이 있습니다.
[root@localhost]# wget http://nchc.dl.sourceforge.net/sourceforge/domainkeys/libdomainkeys-0.68.tar.gz
[root@localhost]# tar xfz libdomainkeys-0.68.tar.gz
[root@localhost]# cd libdomainkeys-0.68
[root@localhost]# make


2. qmail-dk 패치 적용
[root@localhost]# wget http://www.qmail.org/qmail-1.03-dk-0.54.patch
[root@localhost]# tar xfz qmail-1.03.tar.gz
[root@localhost]# cd qmail-1.03
[root@localhost]# patch -p1 < ../qmail-1.03-dk-0.54.patch

※ 만약 smtp relay allow 방식이 qmail + vpopmail를 사용하는 방법이 아니라
  qmail + smtp-auth 방식을 사용하시는 분들은 위 패치를 하신뒤 아래 패치도
  같이 해주셔야 되며, vpopmail을 이용하시는 분들은 3번 섹션으로 넘기시면 됩니다.
[root@localhost]# wget http://jeremy.kister.net/code/qmail-dk-0.54-auth.patch
[root@localhost]# cd qmail-1.03
[root@localhost]# patch -p1 < ../qmail-dk-0.54-auth.patch


3. qmail-dk 바이너리 파일의 생성 및 설치
이제 DomainKeys 시스템에서 사용될 바이너리 파일을 생성하도록 하겠습니다.
하지만 컴파일 하기에 앞서 주의하셔야 될 사항이 있습니다.
바로 큐메일소스 디렉토리의 위치 입니다.
위에서 적용한 qmail-dk 패치의 내용중에는 qmail-dk.c 라는 원시코드가 생성이 되는 부분이 있는데
이 원시코드에서 libdomainkeys의 헤더를 자신의 상위 디렉토리에 찾도록 코딩되어 있습니다.
따라서 큐메일소스 디렉토리는 반드시 libdomainkeys 디렉토리 내에 존재해야 됩니다.
[root@localhost]# mv qmail-1.03 libdomainkeys-0.68/
[root@localhost]# cd libdomainkeys-0.68/qmail-1.03
[root@localhost]# make qmail-dk
[root@localhost]# cp qmail-dk /var/qmail/bin/
[root@localhost]# chown root.qmail /var/qmail/bin/qmail-dk
[root@localhost]# cp qmail-dk.8 /var/qmail/man/man8/


4. RSA DomainKeys 생성
이곳에서 생선된 RSA Key가 실제 메일헤더에 적용되어 발송될 인증키 입니다.
[root@localhost]# mkdir -p /etc/domainkeys/foobar.com/
[root@localhost]# cd /etc/domainkeys/foobar.com/
[root@localhost]# openssl genrsa -out rsa.private 768
[root@localhost]# openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
[root@localhost]# mv rsa.private default
[root@localhost]# chown -R qmaild .
[root@localhost]# chmod 600 default


5. public Domainkey 추출
DomainKeys를 적용하려면 DNS의 Zone 파일에 TXT 레코드와 공용키를 추가시켜야 됩니다.
따라서 TXT 레코드에서 사용할 공용키(public key)를 추출하도록 합니다.
[root@localhost]# grep -v ^- rsa.public | perl -e 'while(<>){chop;$l.=$_;}print "t=y; p=$l;\n";'


6. Zone 파일에 TXT 레코드 추가
위에서 말했듯이 도메인키 시스템을 적용하려면 존 파일에 TXT 레코드가 필요 합니다.
따라서 기존 존파일에 아래의 내용을 추가시켜 줍니다.
_domainkey   IN   TXT   "t=y; o=-;"
default._domainkey   IN   TXT   "public DomainKey"

※ 위의 내용만으로는 어디에 적용하실지 혼동하시는 분이 계실까봐 샘플을 보여드립니다.
[root@localhost]# cat /var/named/zone-foobar.com
$TTL 86400
@       IN   SOA   ns.foobar.com. root.foobar.com. (
                2007010100 ; Serial
                 10800   ; Refresh (3 hours, 10800)
                 3600    ; Retry (1 hours, 3600)
                 1209600  ; Expire (2 weeks, 1209600)
                 86400   ; Minimum (1 days, 86400)
                 )
;
; Default Setting (NS, MX, A)
        IN   NS   ns.foobar.com.
        IN   MX 10  mail.foobar.com.
        IN   A    192.168.0.1
;
; DomainKeys Setting (TXT)
_domainkey   IN   TXT   "t=y; o=-;"
default._domainkey   IN   TXT   "t=y; p=MHwwDQYJKoZIhvcNAQ...."
;
; Name servers (registered at InterNIC)
ns       IN   A    192.168.0.1
;
; Hosts Here - This is comments
www      IN   A    192.168.0.1



7. qmail-queue 파일의 교체
이제 큐메일에서 메일을 발송할 때 domainkey를 메일헤더에 추가하여 발송하도록
위에서 설치했던 qmail-dk를 사용하도록 큐메일 파일을 교체해주어야 합니다.
[root@localhost]# ln /var/qmail/bin/qmail-queue /var/qmail/bin/qmail-queue.orig
[root@localhost]# ln /var/qmail/bin/qmail-dk /var/qmail/bin/qmail-queue.new
[root@localhost]# mv /var/qmail/bin/qmail-queue.new /var/qmail/bin/qmail-queue


8. tcp.smtp 수정
처음 패치를 했을때와 마찬가지로 이 부분도 smtp-auth 사용자와 vpopmail 사용자는
각각 다른 내용으로 tcp.smtp에 추가를 해주어야 됩니다.
1. smtp-auth 사용자
[root@localhost]# vi /etc/tcp.smtp
:allow,DKVERIFY="DEGIJKfh",QMAILQUEUE="bin/qmail-dk"
[root@localhost]# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

2. vpopmail 사용자
[root@localhost]# vi /home/vpopmail/etc/tcp.smtp
127.0.0.1:allow,RELAYCLIENT="",DKSIGN="/etc/domainkeys/foobar.com/default",QMAILQUE
UE="bin/qmail-dk"
192.168.0.1:allow,RELAYCLIENT="",DKSIGN="/etc/domainkeys/foobar.com/default",QMAILQU
EUE="bin/qmail-dk"
:allow,DKVERIFY="DEGIJKfh",QMAILQUEUE="bin/qmail-dk"
[root@localhost]# /home/vpopmail/bin/clearopensmtp


이제 DomainKeys를 사용할 준비가 모두 끝났습니다.
실제로 yahoo와 gmail로 메일을 발송해보시기 바랍니다.

9. DomainKeys 적용확인
야후에서는 도메인키 인증이 되면 메일을 읽었을 때 "발신:" 부분에 아래와 같은 메시지가 남습니다.
야후! 도메인키는, 이 메세지가 다음 도메인으로 부터 보내진것을 입증합니다 : foobar.com.

구글에서는 메일을 읽은뒤, 오른쪽에 보시면 "추가옵션" 이라는 부분이 있습니다.
클릭하시면 보낸사람 오른쪽으로 "서명한 사람: foobar.com" 이라는 메시지가 붙습니다.
혹은 제목 아래의 옵션들중 "원본 보기"를 클릭하시면 메일헤더를 보실 수 있는데
아래와 같은 메일헤더가 추가되어 있으면 성공적으로 도메인키가 적용이 된것 입니다.
DomainKey-Status: good (test mode)
Received: (qmail 23592 invoked from network); 13 Jan 2007 21:21:12 +0900
Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
s=default; d=foobar.com;
b=oIozmfhoDF+L3+hhO0ncfSh4FdLBp3yiyBkvIJ27FqNRzsXZrRe6Q03XjwN0h10uUZrjphyX...


10. 다수 도메인 사용
만약 도메인키를 적용할 도메인이 많다면 아래와 같이 소프트링크를 걸어주셔야 됩니다.
이것은 수신측 메일서버에서 메일을 받은 경우, 송신 메일서버로 dkverify 쿼리를 요청하는데
송신 메일서버의 qmail-dk가 default키를 /etc/domainkeys/도메인/default 에서 찾기 때문입니다.
[root@localhost]# ln -s /etc/domainkeys/foobar.com /etc/domainkeys/foobar2.com

※ 필자의 경우 qmail-dk.c 자체를 수정해서 사용하고 있습니다.
만약 위의 방법 말고 더 좋은 방법을 찾은 분은 리플 남겨주시기 바랍니다.

댓글 없음: