· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Postfix-SASL-HOWTO

Postfix + SASL HOWTO

신종훈 luna12s (at) pulix.org

v0.1, 2004/01/18


1. 서문

IBM Public License를 따르고, Wietse Venema가 개발한 오픈소스 MTA(Mail Transfer Agent) 프로젝트인 Postfix를 소개하고, SMTP Authentication(이하 Auth)을 이용하여 메일 서비스를 가능하게 하는 간단한 HOW-TO를 제공합니다.

1.1. 문서의 저작권

Copyright (C) 2003 신종훈

이 문서는 GNU Free Documentation License 버전 1.2 혹은 이에 준하는 저작권의 규정에 따르며, 저작권에 대한 본 사항이 명시되는 한 어떠한 정보 매체에 의한 본문의 전재나 발췌도 무상으로 허용됩니다. 또한 위키의 특성상, KLDPWiki 내에서 위 라이센스를 위반하지 않는 수준에서 자유롭게 수정이 가능합니다.

1.2. 책임의 한계

본 저자는 문서의 내용이 야기할 수 있는 어떠한 결과에 대해서도 책임을 지지 않습니다. 본 문서에서 내포하고 있는 정보들 및 예제들은 여러분이 알아서 활용하십시오. 비록 최선을 다했으나 이 문서는 틀린 점이나 오류가 있을 수도 있습니다. 만약 여러분이 틀린 점을 발견했다면 수정 또는 메일로 알려주시길 바랍니다.

1.3. 감사의 글

이 문서를 작성하는데 도움을 주신 많은 분들에게 감사드립니다.

  • 앞으로 이 문서를 발전시키는데 도움을 주실 모든 분들께 감사드립니다.
  • [http]Mandrake Secure, Postfix-SASL HOWTO 에서 관련 사항을 참고하였습니다.
  • Postfix 소스내의 SASL 문서를 참조하였습니다.
  • [http]http://www.securitysage.com 의 Postfix Anti-Spam / Anti-UCE 가이드를 참조하였습니다.

1.4. 피드백

이 문서에 대한 발전적인 제안이나 수정사항, 문제점 등에 대한 피드백 및 수정은 언제든지 환영합니다. KLDPWiki 이외의 곳에서 해당 문서의 수정사항을 발견하거나 반영하고 싶으시다면, luna12s (at) pulix.org 로 보내주십시오.

2. Postfix 소개

예전의 IBM Secure Mailer였던, Vmailer MTA(Mail Transfer Agent)의 현재 명칭이다. 1998년 이후 Postfix로 명칭이 바뀌고,오픈소스 소프트웨어로 전향하였다. Qmail과 함께 Sendmail의 대안으로 사용되고 있다. Postfix는 가볍고 빠르며, Sendmail에서 이전(Migration)시 예전 사용자들이 큰 이질감을 느끼지 않는다는 강점이 있다. SASL(Simple Authentication and Security Layer, rfc2222)을 이용한 SMTP 인증을 지원하기 때문에, 복잡한 릴레이 설정을 하지 않고도 구축한 메일 서버가 Spam Relaying에 이용될 가능성을 낮출 수 있다.

HP-UX, AIX, GNU/Linux, SunOS, IRIX, NeXTSTEP, BSD계열, Mac OS X(Darwin)까지 *NIX 계열에서 두루두루 설치 및 운영이 가능하다. 메일 필터링을 위해 펄 호환 정규 표현식을 사용할 경우 PCRE(Perl Compatible Regular Expression library)를 필요로하고, SMTP Auth를 사용할 경우 SASL Library와 SSL Library를 추가로 요구한다.

3. Postfix 설치

3.1. 준비 작업 (For SMTP Auth)

3.1.1. SASL 설치

SMTP Auth를 이용하기 위해서는, Cyrus-SASL 라이브러리가 필요하다. Cyrus-SASL의 정보와 다운로드는 아래의 사이트에서 구할 수 있다:

About Project Cyrus-SASL : [http]http://asg.web.cmu.edu/sasl/ Project Cyrus Downloads : [http]http://asg.web.cmu.edu/cyrus/download/

SASL에는 SASL v1과 SASL v2가 있다. Cyrus-SASL 프로젝트의 사이트에서는 두가지를 다 구할 수 있는데, v1의 경우 버전 1.5.28을 기점으로, 특별한 보안버그가 없다면 버전 업은 이루어지지 않을 것이다. v2는 2.x 혹은 그 이후 버전을 받으면 된다.

이들 SASL을 설치함으로, 다음과 같은 패스워드 인증 체계를 얻게 된다.

  1. PAM(Pluggable Authentication Module)
    PAM은 이미 inet daemon, xinet daemon 에서 사용되고 있는 인증 모듈이다. SASL이 이것을 이용하게 하는 것으로, Postfix에서 SMTP Auth를 가능하게 해준다. 기본적으로 Plaintext(평문) 로그인만이 가능하며, LDAP(경량 디렉토리 억세스 프로토콜: Lightweight Directory Access Protocol)이나 RADIUS 등의 다른 데이터 저장/억세스 시스템을 병용할 수 있는 장점이 있다. (LDAP의 경우 대규모의 사용자를 관리하는 패스워드 DB로 이용가능하기 때문에, 대규모 사용자를 관리시 상당한 이점을 얻게 된다.) 하지만 소수의 로컬 사용자를 인증하기 위해서 PAM을 이용하기에는 부적절한것이, /etc/shadow 파일의 퍼미션(Permission)을 644(즉, rw-rr)로 변경해 줘야 하는데, 이는 보안상의 치명적인 결함으로 직결 되기 때문이다. 그런 이유로, 비교적 소수의 로컬 사용자를 인증하는 데는 pwcheck나 saslauthd, sasldb를 이용하는 쪽이 좋다.
  2. shadow
    /etc/shadow를 이용하여 인증하게 해준다. 이것 역시 shadow 파일의 퍼미션을 644로 해줘야 하기 때문에, 권장하지 않는 방법이다.
  3. sasldb
    SASL의 독자적인 DB를 이용하여 암호를 저장한다. 이 db 파일은 기본적으로 /etc/sasldb에 위치하며(v2의 경우 /etc/sasldb2), 이것을 이용하면 평문(Plaintext) 암호 전송 뿐만 아니라, Digest-MD5, CRAM-MD5와 같은 해시 암호 전송까지 가능하다는 장점이 있다. 사용자는 saslpasswd 프로그램을 이용하여 추가가 가능하고, DB 파일의 초기화를 위해 최소한 1명의 사용자가 확보되어 있어야 한다. 이 DB 파일은 Postfix 사용자가 볼 수 있지만, 기본적으로 암호화된 파일이고, 실제 내용을 열람하는 sasldblistusers 프로그램은 슈퍼유저만이 실행하게 되어 있다
  4. pwcheck
    pwcheck의 경우, shadow를 이용한다는 점에서 2번 항목과 같지만 pwcheck 데몬이 루트의 권한으로 작동하기 때문에, 인증을 요구 할 경우 shadow의 퍼미션을 변경할 필요없이 shadow 파일을 억세스 할 수 있다는 장점이 있다. 시스템 부팅시에 pwcheck 데몬을 띄워주기위해 init 스크립트에 추가해주는 것이 좋다. 리눅스의 경우, /etc/rc.d/rc.local 파일의 맨 마지막 줄에 /usr/sbin/pwcheck 라고 넣어주면 된다. (경로는 SASL의 설치 옵션 및 시스템에 따라서 달라질 수 있다)
    • Cyrus-SASL 기본 Configure시에는 포함되지 않는다. 대부분의 1.5.x대의 Cyrus-SASL RPM 패키지에서도 포함되지 않음을 확인했다. 소스 컴파일시 옵션을 주거나, pwcheck가 포함된 RPM을 구하는 수 밖에 없다. 자세한 사항은 SASL 설치 부분을 참고.
    • Postfix의 경우, pwcheck 데몬이 들어있는 디렉토리에 읽기+쓰기(Read+Write) 그룹(Group) 퍼미션이 주어져야 한다. 퍼미션이 없을 경우, 인증실패의 요인이 될 수 있음에 주의.
  5. saslauthd
    saslauthd 는 pwcheck와 비슷한 역할을 하지만 훨씬 나은 신축성을 제공한다. 여기서 말하는 신축성에는 PAM 과 같은 인증 시스템을 병용할 수 있다는 점이다. (Cyrus-SASL 2.x 에서는 LDAP와 MySQL을 이용할 수 있다. 이는 대규모 사용자 관리에 도움을 줄 수 있다) 이것 역시 기본 소스 Configure 시에는 포함되지 않으며, 포함되어 있는 RPM 패키지는 드물다. 자세한 사항은 SASL 설치 부분을 참고.

3.1.1.1. SASL v1(Cyrus-SASL 1.x) 설치
SASL 라이브러리의 경우, 다른 보통의 GNU Software와 마찬가지로 Automake와 Autoconf를 이용한 configure - make - make install 구조를 가지고 있다.

위에서 말한 모든 인증 시스템을 사용가능하게 하고 싶다면, 다음과 같이 컴파일 하면 된다.
 $ ./configure --prefix=/usr --with-saslauthd=/sbin --with-pwcheck=/sbin --enable-login 
  • --enable-login 옵션은, MS Internet Explorer 5 버전에서의 비 표준 SASL LOGIN 인증을 위해 추가해주는 옵션이다.
  • Kerberos v4 인증 체계를 사용하지 않는다면, --disable-krb4 를 추가해준다.
  • 익명(Anonymous) 로그인을 허용하지 않는다면, --disable-anon 을 추가.
  • sasldb 이용시, /etc/sasldb 파일의 위치를 바꾸고 싶다면 --with-dbpath=PATH 옵션을 추가하면 된다.


Configure가 끝나면, 컴파일과 설치를 해주면 끝난다.
 $ make
 $ make install 

3.1.1.2. SASL v2(Cyrus-SASL 2.x) 설치
기본적으로 v1과 같은 옵션을 사용가능 하다. 여기에서는 v2에서 추가된 몇가지를 소개한다:

  • MS Internet Explorer, IIS에서 사용되는 NTLM 인증이 가능해졌다. configure 에서 --enable-ntlm 을 추가하면 된다.
  • saslauthd에서 LDAP와 MySQL을 같이 이용할 수 있게 되었다. --with-ldap=LDAP_Directory, --with-mysql=MySQL_PATH 옵션 추가.
  • OpenSSL을 지원한다. --with-openssl=PATH 옵션을 추가하면 된다.


역시 Configure가 끝나면, 컴파일과 설치를 해주면 된다.

3.2. Postfix 빌드 과정

3.2.1. 기본 컴파일 방법

기본적으로 Postfix를 컴파일 하는데는 GCC를 사용한다. 만약 다른 C 컴파일러를 사용하는 플랫폼을 사용한다면, 다음과 같이 컴파일러를 지정할 수 있다.

% make makefiles CC=/opt/SUNWspro/bin/cc    (솔라리스 C Compiler의 경우)
% make
  • 몇몇 경우, 이렇게 지정할 경우 컴파일 최적화가 되지 않는 경우가 있다.

그 밖에도 default 설정과 다른 구조로 Postfix를 설치하고 싶다면, 다음과 같이 설치 설정을 바꿀 수 있다:
  • 처음 설치 과정에서 설치할 위치를 각각 물어보기 때문에 여기서 굳이 설정할 필요는 없다. 다만, 여러 컴퓨터에 Postfix를 한꺼번에 설치하고자 할때, 기본 경로 설정을 따르지 않는 경우에 한해서 사용하면 편리할 것이다.
% make makefiles CCARGS='--DDEF_CONFIG_DIR="/some/where"'
% make

DEF_CONFIG_DIR 대신 들어갈 수 있는 매크로 명들은 다음과 같다:
매크로 이름지정하는 것들기본 값
DEF_COMMAND_DIR명령어(command)가 설치될 곳/usr/sbin
DEF_CONFIG_DIR설정 파일이 설치될 곳/etc/postfix
DEF_DAEMON_DIR데몬이 설치될 곳/usr/libexec/postfix
DEF_MAILQ_PATHmailq 프로그램이 설치될 곳/usr/sbin/mailq
DEF_MANPAGE_DIRman 페이지가 설치될 곳/usr/local/man
DEF_NEWALIAS_PATHnewaliases 가 설치될 곳/usr/bin/newaliases
DEF_README_DIRreadme 파일이 설치될 곳no (설치 하지 않음)
DEF_SAMPLE_DIR설정 샘플이 설치될 곳/etc/postfix
DEF_SENDMAIL_PATHsendmail 이 설치될 곳/usr/sbin/sendmail

만약 Postfix를 대 용량 메일서버로 동작시키게 할 경우(한번에 1000통 이상의 메일 전송을 처리 할 경우), FD_SETSIZE(파일 기술자(File Descriptor)사이즈)를 재설정 해줘야 한다. CCARGS 옵션을 사용하여, 고칠 수 있다:
% make makefiles CCARGS=-DFD_SETSIZE=2048

기타 GCC Optimization Flag를 추가하고 싶다면, OPT 옵션을 사용, 고치면 된다:
% make makefiles OPT="-O2 -march=i686 -mcpu=i686 -ffast-math"

펄의 정규 표현식을 메일 필터링에 이용하고 싶을 경우, PCRE를 설치해놓고, Postfix 빌드시 다음의 CCARGS 옵션을 줘야 한다. (여기에는 PCRE를 /usr에 설치했을 경우를 예로 들었다. 직접 설치할 경우 보통 /usr/local에 설치된다.)
% make -f Makefile.init makefiles \
        "CCARGS=-DHAS_PCRE -I/usr/include" \
        "AUXLIBS=-L/usr/lib -lpcre"

컴파일을 위해서는 다음과 같이 make 를 해주면 된다.
  • SMTP 인증을 사용하고 싶은 경우 make를 하기전에 아래 SMTP 인증을 위한 컴파일 설정을 참고.
% make

  • 만약 다른 곳에서 한번 빌드를 거친 Postfix를 다른 아키텍쳐의 머신에서 컴파일하고자 한다면, 시스템 의존성(Dependancy) 등을 제거하기 위해 컴파일한 오브젝트 파일과 바이너리 파일을 소거해줘야 한다. 다음의 make 명령을 사용하면 해결 할 수 있다:
 % make tidy

3.2.2. SMTP 인증을 위한 컴파일 설정

Postfix가 SASL 라이브러리를 이용할 수 있도록 다음과 같이 Makefile 설정을 수정해준다. (다른 Makefile 설정이 있다면, CCARGS 에 같이 추가해주면 된다) 다음의 설정은 SASL을 /usr/local 에 설치한것을 기준으로 한다.

SASLv1을 위한 컴파일 설정:
  $ make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include" \
    AUXLIBS="-L/usr/local/lib -lsasl"

SASLv2를 위한 컴파일 설정:
  $ make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl" \
    AUXLIBS="-L/usr/local/lib -lsasl2"

  • SASL 라이브러리를 /usr 에 설치했을 경우, /usr/local 부분을 모두 /usr 로 변경해야 한다
  • 런타임(Runtime) 라이브러리 설정은(-R/usr/local/lib), Solaris 2.x에서 ld.so가 SASL 공유 라이브러리를 못 찾을 경우 추가 해줘야 한다. 다른 OS에서 컴파일 할 경우, 런타임 라이브러리 설정은 예외로 한다.

새로운 설정을 쓰게 되면, 이제 make를 하여 컴파일을 하면 된다.

3.2.3. 빌드 과정에서의 문제 해결

  • 만약 이렇게 Postfix를 빌드하는데, "make: don't know how to ..." 와 같은 에러 메시지가 나올 경우에는, makefiles를 만들어 줘야 한다. Postfix의 최상위(Top-level) 디렉토리에서 다음의 명령을 쳐주자:
 % make -f Makefile.init makefiles


3.3. 설치 과정

무사히 컴파일을 완료 하면, 직접 설치를 해줘야 한다.

{{|
주의: Sendmail로 부터의 이전(Migration)시, 메일 큐(Queue)에 쌓여있던 메시지들을 보내주기 위해, 그리고 이전 후 문제 발생시 임시로 사용할 수 있도록 Postfix를 설치하기 전에 Sendmail을 보존해 줄 필요가 있다. 슈퍼유저 권한에서, 다음과 같이 이름을 변경해주자:
 # mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
 # mv /usr/bin/newaliases /usr/bin/newaliases.OFF
 # mv /usr/bin/mailq /usr/bin/mailq.OFF
 # chmod 755 /usr/sbin/sendmail.OFF /usr/bin/newaliases.OFF /usr/bin/mailq.OFF
|}}

먼저, postfix를 위한 계정이 필요하다:
# useradd -M -s /bin/false postfix

그 다음, /etc/passwd를 열어, postfix의 셸이 /bin/false(로그인을 못하는 셸이면 어떤것이던 관계없다)인지 확인하자. 가능하면, 관리의 기준을 맞추기 위해 postfix 계정의 uid와 gid를 500번 이하로 해주는 것이 좋다.

이제 postdrop 그룹을 하나 생성한다:
# groupadd -g 54321 postdrop
  • 이 그룹에 다른 유저들이 포함되어서는 안된다는 것에 주의.

/etc/group 를 열어, postdrop 그룹이 잘 생성되었는지 확인 해주자.

이제 Debug Symbol이 제거된 Postfix를 사용하기 위해, 설치 이전에 다음과 같이 해주자:
% strip bin/* libexec/*

모든 것이 다 끝나면 이제 설치를 해 준다. 최초설치와 업그레이드 설치로 나누어 설치 가능하다:
 # make install   (최초 설치용. Interactive한 설치)
 or
 # make upgrade   (Postfix 업그레이드용. Non-Interactive)

  • Upgrade (Non-Interactive) 설치는 예전의 /etc/postfix/main.cf를 요구한다. 이 파일이 없으면, Interactive한 설치로 대체된다. Interactive 설치에서, 데몬/프로그램 설치 디렉토리를 다르게 지정할 경우에도, 설정 파일들 만은 /etc/postfix/ 에 설치하도록 하여, 차후 업그레이드를 손쉽게 하도록 하는 것이 좋을것이다.

  • LINUX의 syslogd는 기본적으로 synchronous writes 를 사용하는데, 이로 인해 syslogd 데몬이 Postfix보다 시스템 자원을 더 많이 사용하는 경우가 발생할 수 있다. 이를 해결하려면, /etc/syslogd.conf의 mail 로그 파일 설정 부분에 "-" 문자를 추가해 준 후, syslogd를 재시작 하면 된다 :
 mail.*                                -/var/log/maillog

3.3.1. Interactive 설치

# make install 을 하여 최초 설치를 시작하게 되면, 사용자에게 prefix를 묻게 된다. 상황에 적절하게 넣어줘도 되고, 신경쓰고 싶지 않다면 그냥 엔터를 쳐주게 되면 기본적으로 설치되게 된다.

처음 질문은 설치할 곳의 루트를 묻는것이다. RPM과 같은 패키징 소프트웨어를 위한 것이므로, 그냥 엔터를 쳐주면 된다.
 install_root: [/]

다음에는 스크래치(Scratches)파일을 담을 임시 디렉토리의 위치를 물어본다. 반드시 쓰기 퍼미션(Write Permission)이 그 디렉토리에 있어야 한다. /tmp 로 정해주자.
 tempdir: [/foobar/postfix-VERSION] /tmp

다음은 설정을 저장할 디렉토리를 정해준다. 그냥 엔터를 쳐주는 쪽이 가장 무난하다.
 config_directory: [/etc/postfix]

그 다음은 postfix 데몬을 설치할 디렉토리를 물어본다. 기본은 /usr/libexec/postfix 이며, 이 위치는 다른 유저의 Command Path(명령어 경로)에 포함되어서는 안된다는 것에 주의.
 daemon_directory: [/usr/libexec/postfix]

다음은 postfix 관리 프로그램을 설치할 디렉토리를 지정한다. 기본은 /usr/sbin 이며, 관리자(슈퍼유저)의 명령어 경로에 포함되어 있어야 한다.
 command_directory: [/usr/sbin]

그 다음, 메일의 큐(Queue)를 저장할 곳을 지정한다. 기본은 /var/spool/postfix 이며, sendmail을 대체하고자 할때는, /var/spool/mqueue 로 지정해도 된다. 여기서는, /var/spool/mqueue에 지정한다.
 queue_directory: [/var/spool/postfix] /var/spool/mqueue

다음은 postfix의 sendmail 명령어를 수행할 프로그램을 설치할 곳을 "전체 경로명(Full Pathname: 디렉토리를 포함, 파일명까지 기록해주는것)"으로 기입하여야 한다. 기존의 sendmail에서의 이전(Migration)이라면 /usr/sbin/sendmail 로 해준다.
 sendmail_path: [/usr/sbin/sendmail]

그 다음은 postfix의 newaliases 명령어를 어디에 설치할것인지 결정한다. 역시 전체 경로명을 입력하여야 하고, sendmail에서의 이전이라면 /usr/bin/newaliases 로 해주면 된다.
 newaliases_path: [/usr/bin/newaliases]

다음은 mailq 명령어를 어디에 설치할 것인지 결정한다. 위와 동일하다.
 mailq_path: [/usr/bin/mailq]

그 다음, postfix의 큐(Queue)의 소유권자(Owner)를 결정해줘야 한다. 앞에서 유저를 생성한 대로, postfix로 해주면 된다.
 mail_owner: [postfix]

다음은 Mail Submission과 Queue Management 명령을 수행할 사용자 그룹을 선택한다. 여기서 정해주는 그룹은 postfix 및 기타의 그 어떤 ID와도 연결되어서는 안된다는 것에 주의.
 setgid_group: [postdrop]

이제 맨(man)페이지의 위치를 결정한다. 기본값으로 /usr/local/man 이며, sendmail에서 이전시 /usr/share/man 으로 지정해줘도 된다. 여기서는, /usr/share/man 으로 지정한다.
 manpage_directory: [/usr/local/man] /usr/share/man

그 다음은 postfix의 설정 예제를 넣을 곳을 결정한다. 위의 설정 저장 위치와 동일하게 해주면 OK.
 sample_directory: [/etc/postfix]

다음은 README를 설치할 디렉토리. 기본값은 no 이며, no라고 지정시 설치하지 않는다.
 readme_directory: [no]

모든 질의가 끝나면 이제 각 파일들을 앞에서 지정한 prefix에 설치하게 된다.

모든 설치가 끝나면, /etc/aliases 파일을 체크하여 메일 alias 설정을 확인하고, newaliases 명령을 실행하여 db 파일을 생성하면 대략적인 설치과정이 끝난다.

4. Postfix 구동 및 설정

4.1. SMTP(Port 25)만 사용

송신 전용으로 사용하는데에는, 더 이상 별 다른 세팅 없이 사용 할 수 있다.

셸에서 다음을 쳐주면 OK.

# postfix start

4.2. SMTP / POP3 (Port 25/110) 사용

송수신을 모두 가능하게 하기 위해서는, 일단 MX 레코드가 설정되어 있는 도메인을 소유하는것이 가장 중요하다.

일단, /etc/postfix/main.cf 에서,
 myhostname = linux.org
 mydomain = linux.org
가 있는 항목을 찾아 위의 예 처럼 도메인 / 호스트 네임 설정을 해준다. Virtual Hosting 옵션은 다른곳에서 설정하므로, 여기서 다른 도메인 네임까지 같이 기록하는 수고는 하지 않길 바란다.

아래에, 최종 도착지(수신지)를 세팅하는 항목이 있다. 다음과 같이, mydomain, myhostname에 속하는 것을 받도록 설정한다. 이는 서버가 Open Relay가 가능하게 하는 것을 막는다. (기본 설정으로도 Postfix는 Relay를 거부한다)
mydestination = $mydomain, $myhostname 

4.2.1. 가상 도메인 및 Aliases 설정

Virtual Domain을 사용하기 위해서는, main.cf에서 virtual alias mapping file을 사용한다고 알려줘야 한다.

/etc/postfix/main.cf 설정
# For Virtual Alias domain setting

virtual_alias_maps = hash:/etc/postfix/virtual
virtual_alias_domains = $virtual_alias_maps

/etc/postfix/virtual 파일 설정 - 이 파일에서는 실제 Virtual Domain 설정이 들어간다.
# Virtual Domain 설정. 다음과 같이, 도메인 네임을 써주고 뒤에 anything을 써주면 된다.
domainname.org          anything
domain.co.kr            anything
domain.com              anything
domain2.org             anything
domain3.ac.kr           anything

# 계정별 Virtual Aliasing. 외부에서 받을 메일 주소와, 실 계정 수신자의 ID를 대응시켜주면 된다.
# 여기는 메일주소       여기는 계정ID
linux@domain.com        linux
sarang@domain2.org      sarang
user3@domain.co.kr      user3
sample@domain.org       sample

/etc/postfix/virtual 작성이 끝나면, 다음의 명령을 통해 해시 테이블인 /etc/postfix/virtual.db 를 생성한다. 여기서 시간이 꽤 많이 걸리기 때문에, 30초~1분에 달하는 인내심을 요구한다.
# postmap /etc/postfix/virtual

4.3. SMTP Auth 설정

4.3.1. pwcheck를 사용할 경우

pwcheck를 이용하여 SMTP 인증을 할 경우, pwcheck 데몬을 항상 띄워줘야 한다. chkconfig 등 데몬 관리자를 사용하거나 rc.local 파일을 수정하여, 부팅시 항상 띄우도록 한다.

/usr/lib/sasl/smtpd.conf 예제 (SASLv2의 경우 /usr/lib/sasl2/smtpd.conf, 또는 /usr/local/lib/sasl2/smtpd.conf)
pwcheck_method: pwcheck

이렇게 하면 smtpd가 SASL pwcheck를 사용하게 된다. Postfix를 재 시작하기전에, pwcheck가 띄워져 있는지 확인하자.

4.3.2. saslauthd를 사용할 경우

pwcheck 대신 saslauthd를 쓰면 더욱 편리하다. saslauthd 는 Cyrus-SASL 1.5.x, 2.x 버전 모두에 있으며, RPM으로 설치한 사람은 saslauthd 패키지를 추가로 설치해야 할 것이다. smtpd.conf에, pwcheck 대신
pwcheck_method: saslauthd
라고 하면 된다. 역시 saslauthd 를 미리 띄워야 하는데, 다음과 같이 서비스 할 수 있다.
$ saslauthd -a shadow 
이는 shadow 파일을 이용한 것인데, 이 밖에도 PAM, sasldb 등을 사용할 수 있다. 자세한건 man saslauthd 를 참고.

main.cf 파일 설정 예제
# 여기서 부터는 SMTP 인증 세팅
smtpd_sasl_auth_enable = yes

# 익명 접속 불가
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname

# MS Internet Explorer 5 버전의 비 표준 SASL 인증 호환
broken_sasl_auth_clients = yes

# smtpd_recipient_restrictions 에서 check_relay_domains 항목
# 2.0 초기버전 이후 deprecated 되었음. 대신 reject_unauth_destination 사용
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

# root 쪽에 기록 메일을 보낼 항목
notify_classes = delay, policy, protocol, resource, software 

4.4. Header 및 Body 검사로 스팸 및 바이러스 메일 걸러내기

대부분의 스팸메일은 발송자의 이름을 랜덤하게 생성하거나, 없는 사용자의 이름을 사용한다. 게다가 없는 호스트네임/도메인네임을 붙여서 발송하는 경우도 상당히 많이 있다. 그리고 대부분의 정상적인 메일 서버는 발송시 HELO나 EHLO에서 호스트네임/도메인네임을 붙인다. 이 3가지를 체크하면 상당히 많은 숫자의 스팸을 효과적으로 차단할 수 있다. 어차피 개인 SMTP 서버로 메일을 보내는 사람은 극히 드물다.

main.cf 설정 부분 예제.
# For SPAM Control - HELO, Domain 체크
# vrfy 명령어로 사용자 ID를 긁어내는 봇 방지
disable_vrfy_command = yes

# 접속후 HELO, EHLO 명령을 사용하는지 체크하려면 주석을 제거한다.
# smtpd_helo_required = yes

# HELO나 EHLO시에 잘못된 hostname syntax를 쓰는 커넥션은 발송을 금지한다. 좀 더 엄격하게 체크를 한다면,
# reject_unknown_hostname (A 레코드나 MX 레코드가 존재하는 도메인을 가지고 있는지 체크)
# 혹은 reject_non_fqdn_hostname (입력한 도메인이 FQDN을 만족하는지 체크) 옵션을 추가하면 된다. (콤마(,)로 구분)
smtpd_helo_restrictions = reject_invalid_hostname

# A 레코드나 MX 레코드가 없는 도메인에서 발송된 경우 reject 시킴.
# 더 자세한 세팅은 http://www.postfix.org/uce.html#smtpd_sender_restrictions 를 참조.
smtpd_sender_restrictions = reject_unknown_sender_domain

# Reject시 Reject 코드를 지정한다. 450은 Try Again Later 를 뜻하는 것.
access_map_reject_code = 550
unknown_client_reject_code = 450
unknown_hostname_reject_code = 450
unknown_address_reject_code = 450

# For SPAM/Junk Mail Control - Header Check 설정. regexp는 Regular Expression, 즉 정규표현식이다.
# regexp 대신, pcre를 사용할수도 있다.
# pcre를 사용시
# header_checks = pcre:/etc/postfix/header_checks
header_checks = regexp:/etc/postfix/header_checks

# MIME 헤더 체크. 첨부파일등을 체크할 필터로 사용한다.
mime_header_checks = regexp:/etc/postfix/mime_header_checks

# Body Check를 사용할 경우 주석을 풀 것
# body_checks = regexp:/etc/postfix/body_checks 

위와 같이 설정을 하고 나면, 이제 필터링을 할 요소들을 추가하고, 관리해야 한다. header_checks, mime_header_checks, body_checks 이 세개의 파일은 다음과 같은 공통적인 필터 구조를 가지고 있다.
/정규표현식/   액션 [메시지] 
즉, 정규표현식을 만족하는 메일이 있을 경우 그 메일을 어떻게 처리하는 가는 액션에서 결정해주는 것이다. 메시지는 일부 액션에서 옵션 처럼 사용할 수 있다. 액션은 아래의 표로 정리해놓았다.

액션종류행동
REJECT가장 일반적인 액션이다. 수신메일은 막혀서 서버로 들어올 수 없게 되고, 송신자의 MTA에게 거부/반송메시지를 전달한다. 액션의 뒤에 메시지를 추가해놓으면, 메일로그와 반송메시지 본문에 그 메시지가 추가로 들어가게 된다. 필터링할 규칙이 많을 때, 이 메시지는 어느 필터가 오동작하였을때 어느 필터인지 손쉽게 구별할 수 있는 단서로 쓰일 수도 있다.
IGNOREIGNORE는 해당 필터에 메일이 걸리게 되면, 그 필터에 걸린 헤더를 삭제하고 정상적인 메일로 처리하게 된다.
WARN대개 새로운 메일 필터를 도입할때 유용하게 사용할 수 있다. REJECT할때 처럼 액션의 뒤에 메시지를 기록해놓으면, 로그와 헤더에 그 메시지가 추가로 남게된다. 이것으로 새로운 필터를 적용할때, 그 필터의 적정동작여부를 판단하는 기회가 된다.
HOLD해당 메일을 홀드 큐(Queue)에 보관한다. 큐에 쌓인 메일은 관리자가 지우거나 수신자에게 발송을 할 수 있다.
DISCARD메일을 정상적으로 처리한 것 처럼 나타내고, 내부적으로는 그 메일을 버리게 된다. 이는 메일 사용자, 송신자 모두 해당 메일이 어떻게 되는지 알리고 싶지 않거나, 알리는 것이 필요없을때 사용한다.
FILTERFILTER는 Postfix 본체 이외의 처리기로 메일을 보내고 싶을 때 사용한다.

/etc/postfix/header_checks 설정 예제
# 어차피 REJECT 되면 다양한 방법으로 더 많이 보내는 부류가 있으므로 조용히 버림(DISCARD).
# REJECT도 가능하다.
/^Subject:.*\[광고\]/           DISCARD
/^Subject:.*\(광고\)/           DISCARD
/^Subject: \[광고\]/            DISCARD
/^Subject: \(광고\)/            DISCARD
/^Subject: \(성인광고\)/         DISCARD
/^Subject: \[성인광고\]/         DISCARD
/^Subject: \[성인\]/            DISCARD
/^Subject: Make Money Fast/    DISCARD
/^To: friend@public.com/       DISCARD
/^From: .*@test.com/         DISCARD

# 아래는 MIME Encoded 된 제목을 검출. (광고), [광고] 로 시작하는 것들을 버림
/^Subject: =\?euc-kr\?q\?\(=B1=A4=B0=ED\)*/ DISCARD
/^Subject: =\?euc-kr\?q?\[=B1=A4=B0=ED\]*/ DISCARD
/^Subject: =\?ks_c_5601-1987\?B\?KLGksO0p*/ DISCARD
/^Subject: =\?ks_c_5601-1987\?B\?W7GksO1d*/ DISCARD

# 특수한 스팸 형태를 위한 필터. 공백이 8자 이상되는 제목이 들어간 경우
/^Subject: .*        /          REJECT
# 스패머는 클라이언트의 리스트 최 상단에 편지를 올리기 위해 날짜를 옛날로 조작하는 경우가 있다.
/^Date: .* 200[0-2]/            REJECT
/^Date: .* 19[0-9][0-9]/        REJECT
# free 라는 글자 사이에 특수한 문자가 있을 경우 제거
/^Subject: .*f[ _\.\*\-]+r[ _\.\*\-]+e[ _\.\*\-]+e/ REJECT 

/etc/postfix/mime_header_checks 의 예제. mime_header_checks는 MIME으로 첨부된 파일이 있을 경우 확장자를 검사하여 필터링 하게 해준다. 화면상 어쩔 수 없이 확장자 부분을 다음 줄로 내렸는데, 각 /name 으로 시작하는 항목은 원래 모두 한줄로 이루어져있다.
/name=[^>]*\.(ade|adp|asd|bas|bat|chm|cmd|com|cpl|crt|dbx|dll|exe|hlp|hta|inf|ins|isp
|js|lnk|ocx|msi|pif|reg|scf|scr|swf|uue|vb|vbe|vbs|vbx|vxd|wsh)/ REJECT 본 편지는 위험파일 첨부로 거부됩니다.

위에서 소개된 부분은 Postfix에서 기본으로 탑재되어 있는 기능을 활용한 예제인데, 좀 더 강력한 스팸 및 바이러스 필터링을 원한다면 [http]Spam Assassin의 사용을 권장한다.

4.5. Postfix를 구성하는 명령어들

본 명령어의 원문은 [http]http://www.postfix.org/commands.html 를 참조한다.

  • postfix 명령은 Postfix 메일 시스템 운영의 컨트롤을 맡는다: 메일 시스템을 시작/정지하는 기능과 약간의 관리 기능을 가지고 있고, 슈퍼유저만이 이를 사용할 수 있다.
  • postalias 명령어는 Postfix의 alias 데이터 베이스를 관리한다: 이 프로그램은 sendmail에서 사용되었던 newaliases 명령의 뒤에서 작동하게 된다.
  • postcat 명령어는 Postfix의 Queue 파일의 내용을 보여준다: 제한적이고 기초적인 유틸리티이기 때문에, 이후 Queue 파일을 수정할 수 있는 것들에 의해 대체될 수 있다.
  • postconf 명렁어는 Postfix의 설정파일 중 하나인 main.cf 파일의 파라메터를 보여준다: 각 파라미터의 현재 값과, 기본 값, 혹은 기본 값 이외로 설정되어 있는 설정들을 보여줄 수 있다. 이것 역시 제한적이며 기초적인 툴이기 때문에, 이후 main.cf를 직접 수정하는 프로그램 등에 의해서 대체/폐기될 수 있다.
  • postdrop 명령어는 mail을 부치는(posting) 역할로, sendmail 명령어에 의해 작동되며 maildrop Queue 디렉토리에 메일을 옮긴다.
  • postkick 명령어는 셸 스크립트에서 몇몇 내부 통신 채널(Postfix Anatomy 참조)을 만들어 준다.
  • postlock 명령어는, Postfix 호환 메일함을 locking 해준다. 이 명령어는 메일함 관리 스크립트 등에서 사용할 수 있다.
  • postlog 명령어는 셸 스크립트를 위한 Postfix 호환 로그를 생성한다.
  • postmap 명령어는 canonical, virtual 등과 같은 look-up 테이블을 생성/관리한다. 이 명령어는, UNIX에서 사용되는 makemap 명령어의 사촌 쯤 된다.
  • postqueue 명령어는 메일 큐의 리스트를 보여주거나, 혹은 메일 큐를 비워(Flushing)준다.
  • postsuper 명령어는 Postfix 큐를 관리한다. 오래된 임시파일을 삭제하고, Queue 디렉토리의 깊이(depth)를 해싱한 후 적절한 디렉토리에 queue 파일을 옮겨 놓는다. 이 명령어는 메일 시스템이 시작할때 작동된다.

4.6. 그 밖의 팁

4.6.1. SSL Wrapper인 stunnel을 사용하여 안전한 SMTP/POP3 서버 구축하기

SMTP를 쓸때, 보내지는 내용과 기타 정보를 보호하고 싶다면 SSL Wrapper를 사용하는것을 권장한다.

이러한 SSL Wrapper에는 SSLWRAP과 stunnel이 존재하는데, 본 서에서는 stunnel을 사용하여 Secure SMTP/POP3/IMAP(Port 465/995/993)를 구축하는것에 대해 언급하고자 한다.

stunnel Homepage : [http]http://www.stunnel.org

위의 홈페이지에서, stunnel 최신버전을 받아서 설치하도록 한다. 아래의 예제에는 stunnel 4.0.4를 사용했다.

Kerberos-5 devel 패키지(대개 krb5-devel)가 있음에도 불구하고 make 중에 Kerberos 관련 헤더를 찾지 못한다는 메시지가 나오면 configure 하기 전에 CPPFLAGS 환경변수로, Kerberos 헤더가 있는 위치를 지정해주도록 한다.
# export CPPFLAGS=-I/usr/kerberos/include

make의 최종 단계에서, stunnel.pem (기본 SSL 인증서)를 생성하려고 한다. 이들 인증서는 나중 stunnel 설정에서 변경할 수 있으므로 적절하게 이름을 지어서 채워주자.

설치가 모두 끝나면, $PREFIX/etc/stunnel/stunnel.conf-sample을 stunnel.conf로 복사한 후, 자기 입맛에 맞추어 설정을 시작한다. (conf 파일의 위치는, stunnel 실행시 지정이 가능하므로, 임의로 지정해 줄 수도 있다.)

아래는 설정파일의 일부분이다. 표시되지 않은 아랫 부분은 Wrapping 할 포트 번호를 매핑해주는 부분인데, 이는 입맛에 따라 설정하면 된다.
# 인증서의 위치.
cert = /usr/etc/stunnel/stunnel.pem
# chroot를 걸게 되는데, 이때 해당 디렉토리가 존재하지 않으면 아래의 setuid, setgid 에 맞춰 디렉토리를 생성하도록 한다.
chroot = /var/run/stunnel/
# PID is created inside chroot jail : 위의 chroot 설정에서 정해준 경로가 "/"임을 주의. 쉽게 말해 고칠 필요가 없다
pid = /stunnel.pid
setuid = nobody
setgid = nobody 

# Eudora 사용자가 거의 없겠지만, 혹시나 있을 경우 주석을 풀어준다.
# options = DONT_INSERT_EMPTY_FRAGMENTS 

이제 모든 설정이 끝나면 stunnel을 실행해주면 된다. rc 파일이나, 혹은 chkconfig 파일을 생성해서 init에 등록하면 재부팅 이후에도 자동으로 실행이 될 것이다. 당연히, 안전한 버전의 OpenSSL을 필요로 한다.

에러메시지가 /var/log/messages에 저장되기 때문에 불편하다. 데몬이 떠있는지 확인은 필수가 될 것이다.

메일 클라이언트(Outlook series, Mozilla Thunderbird, ...)에서는, SSL을 사용한다에 체크하고 사용하면 된다.

4.6.2. Debian 에서는?

Debian 유저를 위한 몇가지 유의할 점.

addgroup sasl
apt-get install postfix-tls qpopper sasl-bin libsasl-modules-plain libsasl2 libsasl-gssapi-mit libsasl-digestmd5-des sasl2-bin libsasl2-modules

일단 이정도로 설치하시고, 차이점 이라면 디렉토리 명이 조금 틀린 것과 init 스크립의 문제점이 있다는 것 정도입니다.

http://hanselan.de/postfix/pwcheck 이곳의 init 스크립을 받아서 쓰시길 바랍니다. (큰 차이는 없고..몇 줄 삭제되었을 뿐입니다)

mkdir -p /var/spool/postfix/var/run/pwcheck
chown postfix.root /var/spool/postfix/var/run/pwcheck/
chmod 700 /var/spool/postfix/var/run/pwcheck/
ln -s /var/spool/postfix/var/run/pwcheck /var/run/pwcheck
echo 'pwcheck_method: pwcheck' >> /etc/postfix/sasl/smtpd.conf
디렉토리를 위의 형식대로 세팅해서 사용하시면 정도로 하시면 됩니다. 좀 더 자세한 내용은 http://www.google.com 에서 "smtp auth debian" 정도로 검색해 보시길 바랍니다.





sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2004-01-22 09:27:31
Processing time 0.0334 sec