티스토리 뷰
qmail relay, 암호 인증, STARTTLS #
이 글은 qmail의 기본적인 릴레이 설정과 인증후 릴레이 허용 방법, STARTTLS 사용 방법등에 대해서 간단히 썼습니다. 조금이나마 도움이 되기를 바라며, 수정할 사항이 있다면 연락 주시기 바랍니다 (질문은 게시판으로...) -- 임은재 2004-04-15 23:01:58
1.1 tcpserver #
qmail-smtpd 서버는 tcpserver에 의해 구동되도록 설정하는 것을 기본으로 합니다(아마 대부분 이렇게 하시겠지만). 대부분 다음과 비슷하게 생겼을 겁니다.#!/bin/sh
Q_UID=$(id -u qmaild)
Q_GID=$(id -g qmaild)
exec /usr/local/bin/tcpserver -vRHl0 -x /etc/tcp.smtp.cdb \
-u $Q_UID -g $Q_GID 0 25 \
/var/qmail/bin/qmail-smtpd 2>&1
1.1.1 tcp.smtp #
이제 /etc/tcp.smtp를 만들어 봅시다. 메일 서버의 ip 주소는 192.168.1.1 이라고 가정하고, 192.168.1.100의 릴레이를 열어주고, 192.168.2.XXX ip 대역의 릴레이도 열어준다고 가정하면 다음과 같이 될 것입니다.127.0.0.1:allow,RELAYCLIENT=""첫번째와 두번째줄은 메일 서버 내부의 릴레이를 열어 준 것입니다. 릴레이를 전혀 허용하지 않으려면 첫번째와 두번째 룰만 있으면 됩니다. 192.168.1.100:allow,RELAYCLIENT="" 를 예를 들어 설명하면 tcpserver는 해당 ip (192.168.1.100)로 부터의 접속을 허용하고 (:allow) 해당 ip에서 접속이 있을 경우 RELAYCLIENT 환경 변수를 설정한 후 qmail-smtpd 를 실행하게 되므로 릴레이가 허용되는 원리 입니다.
192.168.1.1:allow,RELAYCLIENT=""
192.168.1.100:allow,RELAYCLIENT=""
192.168.2.:allow,RELAYCLIENT=""
:allow
마지막 줄의 :allow 는 다른 ip에서의 접속을 허용만 하고 RELAYCLIENT 환경 변수는 설정하지 않습니다. 즉, 릴레이는 허용하지 않습니다. (사실 기본값이 allow이므로 이 값은 없어도 마찬가지 입니다).
tcp.smtp를 수정한 후에는 tcpserver가 사용할 수 있는 cdb 형식으로 바꿔주기 위해 다음과 같이 합니다 (이 과정을 빼먹으면 아무런 효과가 없으며 qmail 자체를 재시작 할 필요는 없습니다).
$ tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp메일 서버를 운영하다 보면 특정 주소로 부터의 메일을 막아 버려야 하는 경우(예를 들어 스팸 메일)가 생기는데 이런 경우에는 다음과 같은 룰을 tcp.smtp에 추가해 준 후 cdb파일로 만들어 줍니다.
예를 들어 66.115.47.XXX 대역으로 부터 오는 모든 메일과 216.240.138.237로 부터 오는 메일을 완전히 막으려면:
66.115.47.:deny다시 말씀 드리지만 이것은 메일의 주소와 상관없이 해당 주소로 부터의 SMTP 접속을 아예 거부하는 것입니다.
216.240.138.237:deny
1.1.2 rcpthosts #
/var/qmail/control/rcpthosts 를 수정할 차례인데 여기에는 간단하게 이 서버가 메일을 받아 들일 도메인만 적어 줍니다. 즉, 이 서버의 도메인이 foobar.com 이라면 내용은 foobar.com 만 있으면 됩니다. 다중 도메인을 사용하는 경우에는 차례대로 적어 주면 되겠죠?. (vpopmail를 사용하는 경우에는 자동으로 추가/수정 됩니다).이제 부터 qmail-smtpd 는 위에서 설정한 tcp.smtp에서 릴레이를 열어주지 않은 경우, rcpthosts에 적혀 있지 않은 도메인으로 메일을 보내려 하면 "553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)" 메세지와 함께 릴레이를 거부 할 것입니다.
1.2 AUTH 릴레이 #
대부분의 경우에는 지금까지의 설정만으로 충분 할 것입니다. 하지만, 유동 IP 사용자들에게 릴레이를 열어 줘야 하는 메일 서버의 경우에는 인증후 릴레이 방식을 사용하는 것이 좋습니다. 이 방법은 qmail 소스를 패치해야 합니다. 즉, qmail-smtpd가 암호 인증후에 릴레이를 열어 주도록 만들어 줘야 합니다.또는 netqmail 패키지에 Bill Shupp의 TLS + SMTP Auth patch를 적용해서 사용할 수 있습니다.
이 경우 qmail-smtpd의 run 파일에 qmail-smtpd 다음에 도메인명을 써주지 않아야 합니다.
인증 방법은 여러가지로 유연하게 적용할 수 있는데 다음중 하나이거나 여러 가지 인증 소스를 동시에 사용할 수도 있습니다.이 경우 qmail-smtpd의 run 파일에 qmail-smtpd 다음에 도메인명을 써주지 않아야 합니다.
- 시스템 계정 (/etc/passwd)
- cmd5checkpw (/etc/poppasswd)
- checkpassword + mysql (유저 데이터를 db에 저장)
- vchkpw (vpopmail pop 유저 데이터를 사용, db또는 vpasswd)
* 먼저 cmd5checkpw를 설치합시다.
$ tar xzf cmd5checkpw-0.22.tar.gz* qmail을 패치/설치 합니다 (기존에 qmail 데몬이 실행되고 있다면 미리 중지 시키세요). 칵테일 패치를 사용 한다면,
$ cd cmd5checkpw-0.22
$ make ; make install
$ touch /etc/poppasswd
$ useradd -M checkpw
$ chown checkpw /bin/cmd5checkpw
$ chmod a+s /bin/cmd5checkpw
$ chown checkpw /etc/poppasswd
$ chmod 400 /etc/poppasswd
$ tar xzf qmail-1.03.tar.gz
$ tar xzf qmail-ej-cocktail-XX.tar.gz
$ cd qmail-1.03
$ patch -p1 < ../qmail-ej-cocktail-XX/qmail-ej-cocktail-XX.patch
$ make
$ make setup check
smtp-auth 패치만 한다면,
foobar.com은 여러분의 도메인명으로 바꿔야 되겠죠? (cmd5checkpw와 true의 경로가 맞는지 확인하세요.)
패치된 qmail-smtpd에는 "checkprogram subprogram" 의 형식을 사용할 수 있는데 여기서는 "/bin/cmd5checkpw /bin/true"를 사용했습니다. cmd5checkpw 는 암호 파일을 /etc/poppasswd 를 사용하며, 내용은 다음과 같은 요령으로 추가 해 줍니다.
$ tar xzf qmail-1.03.tar.gz정상적으로 패치가 되었다면, 후에 qmail이 구동되었을때 다음과 같이 EHLO 응답 메세지를 확인해 볼 수 있습니다.
$ tar xzf qmail-smtpd-auth-0.30.tar.gz
$ cd qmail-smtpd-auth-0.30
$ cp README.auth base64.c base64.h ../qmail-1.03
$ patch -d ../qmail-1.03 < auth.patch
$ cd ../qmail-1.03
$ make
$ make setup check
$ telnet localhost 25자, 이제 우리는 패치된 qmail-smtpd가 생겼습니다. "인증후 릴레이 열어주기"가 가능하도록 하려면 qmail-smtpd 구동 스크립트를 수정해 줘야 합니다.
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 foobar.org ESMTP
ehlo localhost <-- 이 부분은 제가 입력한 것입니다.
250-foobar.org
250-PIPELINING
250-AUTH LOGIN CRAM-MD5 PLAIN <-- 이 부분이 나오면 정상입니다.
250 8BITMIME
#!/bin/sh
Q_UID=$(id -u qmaild)
Q_GID=$(id -g qmaild)
exec /usr/local/bin/softlimit -m 7340032 \
/usr/local/bin/tcpserver -vRHl0 -x/etc/tcp.smtp.cdb \
-u $Q_UID -g $Q_GID 0 25 \
/var/qmail/bin/qmail-smtpd foobar.com \
/bin/cmd5checkpw /bin/true 2>&1
패치된 qmail-smtpd에는 "checkprogram subprogram" 의 형식을 사용할 수 있는데 여기서는 "/bin/cmd5checkpw /bin/true"를 사용했습니다. cmd5checkpw 는 암호 파일을 /etc/poppasswd 를 사용하며, 내용은 다음과 같은 요령으로 추가 해 줍니다.
username:password이제 클라이언트들은 인증후에 이 서버를 사용해서 메일을 보낼 수 있습니다 (항상 테스트/로그 확인 하는 것을 잊지마세요).
checkpassword를 사용해서 계정 유저의 /etc/passwd를 사용하는 방법도 있지만 이것은 별로 권장하지 않습니다. 암호가 알려지는 경우 서버로 로그인까지 가능케 되버리니까요. 되도록 cmd5checkpw 와 /etc/poppasswd 만을 사용하도록 하고 계정 사용자 인경우 로그인 암호와는 다른 암호를 사용하도록 하는 것이 보안상 좋습니다 (POP, SMTP, LOGIN 암호를 모두 동일하게 설정하는 실수를 하지 마세요).
mysql 패치된 checkpassword를 사용하는 방법도 있습니다. 참고: checkpassword + sql.
vpopmail에는 로밍 서비스라는 것이 있어서 POP 인증후에 smtp 릴레이를 열어주도록 하는 기능이 있습니다만, 이것을 사용하지 않고 이 패치와 vpopmail의 암호 확인 프로그램인 vchkpw를 사용하면 vpopmail에서 생성해준 사용자와 암호를 그대로 사용할 수 있습니다. 다음은 vchkpw를 인증 프로그램으로 사용하도록 한 qmail-smtpd 구동 스크립트 예입니다:
경고: smtp-auth 패치는 설정이 잘못되면 open relay가 되버리는 불상사가 발생할 수 있으니 반드시 여러가지로 테스트 후에 사용하시기 바랍니다. !! 메일 서버의 릴레이 상태를 확인하는 방법을 모른다면 다음 페이지를 참고하세요.
#!/bin/sh
QMAILDUID=$(id -u vpopmail)
NOFILESGID=$(id -g vpopmail)
exec /usr/local/bin/softlimit -m 7340032 \
/usr/local/bin/tcpserver -H -R -l 0 \
-x /etc/tcp.smtp.cdb \
-u "$QMAILDUID" -g "$NOFILESGID" 0 25 \
/var/qmail/bin/qmail-smtpd foobar.com \
/home/vpopmail/bin/vchkpw /bin/true 2>&1
1.3 STARTTLS #
STARTTLS는 SSL을 사용해서 SMTP 프로토콜 연결을 암호화 하는 것입니다. 역시 qmail에서 STARTTLS 지원을 가능하게 하는 패치가 나와 있습니다. (이 패치는 칵테일 패치에 이미 포함되어 있습니다).TLS 패치는 openssl-0.9.6 이상을 필요로 합니다. 패치후에 qmail을 재 컴파일/설치 한 후에 제대로 링크가 되었는지 확인해 봅니다.
$ ldd /var/qmail/bin/qmail-smtpd위 결과 처럼 ssl 라이브러리가 표시되어야 합니다. 사용할 인증서를 만들어 줘야 하는데, 패치된 qmail 소스 디렉토리에서 make cert 하거나 다음과 같이 직접 만들어 줍니다 (다음 예에서는 1년짜리 인증서를 만들어 보았습니다). 인증서 생성시 기입해야 것들은 정확하게 입력하고 특히 Common Name은 정확히 메일 서버의 FQDN명을 사용하는 것이 좋습니다.
libssl.so.0.9.6 => /usr/lib/libssl.so.0.9.6 (0x4001b000)
libcrypto.so.0.9.6 => /usr/lib/libcrypto.so.0.9.6 (0x4004a000)
libc.so.6 => /lib/libc.so.6 (0x40111000)
libdl.so.2 => /lib/libdl.so.2 (0x4024f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ openssl req -new -x509 -nodes -out /var/qmail/control/servercert.pem \이렇게 패치된 qmail서버는 25번 포트로 SSL 접속과 일반적인 smtp 접속을 모두 허용합니다.
-keyout /var/qmail/control/servercert.pem -days 365
$ chmod 640 /var/qmail/control/servercert.pem
$ chown qmaild.qmail /var/qmail/control/servercert.pem
$ ln -s /var/qmail/control/servercert.pem /var/qmail/control/clientcert.pem
** vpopmail 쓰시는 분들은 qmaild.qmail 대신 vpopmail.vchkpw 로 해주셔야 퍼미션 에러가 나지 않습니다. - tester
STARTTLS, AUTH 패치가 제대로 되었는지 먼저 telnet으로 확인해 보면:
$ telnet localhost 25테스트는 STARTTLS 패치한 다른 qmail서버, sendmail (v8.11.6), ssmtp, 윈도우에서는 OE 로 메일을 보내 보았는데 auth, ssl이 잘 동작합니다. 실제로 ssl 연결이 제대로 이루어져 프로토콜이 암호화 되는지는 tcpdump나 sniffit 같은 툴을 사용해서 직접 패킷을 확인해 보거나, 도착된 메일의 헤더를 확인해 보면 됩니다 ("Received xxx with DES-CBC3-SHA encrypted SMTP;").
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 foobar.org ESMTP
ehlo localhost <-- 이 부분은 제가 입력한 것입니다.
250-foobar.org
250-PIPELINING
250-STARTTLS
250-AUTH LOGIN CRAM-MD5 PLAIN
250 8BITMIME
'리눅스(유닉스) > Mail' 카테고리의 다른 글
Sendmail SMTP Auth 설정하기 (0) | 2008.06.22 |
---|---|
Multi-RBL Lookup(스팸메일 블로킹 다중 확인) (0) | 2008.06.22 |
procmailrc 이용 메일 자동응답 보내기 (0) | 2008.06.22 |
SMTP STARTTLS in sendmail (0) | 2008.06.22 |
Using SMTP AUTH and STARTTLS with sendmail (0) | 2008.06.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크