메일서버등록제(SPF) 인증기능적용안내서 (CentOS - qmail) OS Mail Server SPF 적용모듈 (C 언어기반) 작성기준 CentOS 5.4 32bit qmail 1.03 qmail-spf-rc5 patch 2016 년 6 월
목 차 I. 개요 1 1. SPF( 메일서버등록제) 란? 1 2. SPF 를이용한이메일인증절차 1 II. qmail, SPF 인증기능모듈설치 2 1. sendmail 제거 2 2. gcc 설치 3 3. ucspi-tcp 설치 4 4. daemontools 설치 6 5. qmail 설치및 SPF 패치 8 III. SPF 적용여부확인및차단 15 1. SPF 판별을위한판정값설정 15 2. 차단확인 16
I. 개요 1. SPF( 메일서버등록제) 란? 메일서버등록제 (SPF: Sender Policy Framework) 는메일서버정보를사전에 DNS 에공개등록함으로써수신자로하여금이메일에표시된발송자정보가 실제메일서버의정보와일치하는지를확인할수있도록하는인증기술이다. 대다수스팸발송자가자신의신원을감추기위하여발송자주소나전송경로를 허위로표기하거나변경하는경우가많다는데착안되었다. SPF를 DNS에설정하는방법은 http://www.kisarbl.or.kr > White Domain 등록작성도우미메뉴를참고한다. > SPF SPF를이용하여스팸메일을차단하기위해서는메일서버에 적용되어있어야한다. SPF 인증기능이 CentOS 환경에서기본적으로설치된메일서버에는 SPF 인증기능이적용되어 있지않으므로 SPF 모듈설치및패치를해야한다. 본안내서는메일수신 서버에 SPF 인증기능을쉽게적용하는방법을소개한다. 2. SPF 를이용한이메일인증절차 발신자 : 자신의메일서버정보와정책을나타내는 SPF 레코드를해당 DNS에등록 수신자 : 이메일수신시발송자의 DNS에등록된 SPF 레코드를확인하여 해당이메일에표시된발송IP와대조하고그결과값에따라수신여부를결정 ( 메일서버나스팸차단솔루션에 SPF 인증기능이설치되어있어야함) [ 그림 1] SPF 인증흐름도 - 1 -
II. qmail, SPF 인증기능모듈설치 본안내서는운영체제및메일서버를처음구축하는것을기준으로작성하였다. 설치과정에서사용하는모든명령어는 root 권한으로실행해야한다. 1. sendmail 제거 CentOS에는 sendmail 이기본적으로설치되어있다. qmail을설치하면 tcp/25 번 포트충돌이발생하므로제거하도록한다. 아래는 telnet 명령어를이용하여 tcp/25번포트에접속하여메일전송 프로그램(MTA: Mail Transfer Agent) 이동작하고있는상태를확인하는 것으로써 sendmail 이동작하고있음을알수있다. [root@spf ~]# telnet 0 25 ( 메일서버 25 번포트접속) Connected to 0 (0.0.0.0). Escape character is '^]'. 220 spf.kisa.or.kr ESMTP Sendmail 8.13.8/8.13.8; Thu, 1 Jul 2010 21:20:22 +0900 quit ( 접속종료) 221 2.0.0 spf.kisa.or.kr closing connection Connection closed by foreign host. 아래와같이패키지관리도구인 rpm 을이용하여기존에설치된 sendmail 을삭제한다. [root@spf ~]# rpm -e sendmail --nodeps (sendmail 이설치되어있을경우제거) --nodeps 는패키지의의존성을무시하고해당패키지를삭제하는옵션이다. - 2 -
2. gcc 설치 2.1 gcc 설치여부확인 qmail 의기본패키지에는 SPF 인증기능이포함되어있지않으므로 SPF 라이브러리를통합하여 qmail 을구성해야한다. qmail 설치시소스코드를 컴파일해서설치해야하기때문에아래와같이 gcc 설치여부를확인한다. [root@spf ~]# gcc --version gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2.2 설치 gcc가설치되어있지않다면 이용하여설치한다. 아래와같이패키지설치/ 삭제도구인 yum을 [root@spf ~]# yum install -y gcc Loading mirror speeds from cached hostfile * addons: mirror.khlug.org * base: mirror.khlug.org Running Transaction Installing : gcc Installed: 1/1 gcc.i386 0:4.1.2-48.el5-3 -
3. ucspi-tcp 설치 qmail 은단독데몬프로세스로동작하지않기때문에 데몬형태의포트서비스프로그램을필요로한다. ucpsi-tcp 와같은네트워크 ucpsi-tcp 는유닉스계열클라이언트 / 서버프로그램으로서 tcpserver 와 tcpclient 프로그램을 생성한다. tcpserver 는동시접속제한및프로세스와메모리를보호하는역할을하게된다. 3.1 다운로드및압축해제 아래와같이 wget 명령어를이용하여 ucspi-tcp-0.88 패키지를다운로드한후 압축을해제한다. [root@spf ~]# wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz Resolving cr.yp.to... 131.193.36.21 Connecting to cr.yp.to 131.193.36.21 :80... connected. HTTP request sent, awaiting response... 200 OK Length: 53019 (52K) [application/x-gzip] Saving to: `ucspi-tcp-0.88.tar.gz' ucspi-tcp-0.88.tar.gz' saved [53019/53019] [root@spf ~]# tar xzf ucspi-tcp-0.88.tar.gz 압축해제후소스패키지를설치하면 라이브러리등이설치된다. /usr/local 디렉토리에실행파일및 - 4 -
3.2 컴파일및설치 설치된 glibc 버전이 2.3.1 이상이면컴파일과정에서에러가발생하므로 패키지에포함된 error.h 의파일에 #include <errno.h> 를추가한다. [root@spf ~]# cd ucspi-tcp-0.88 [root@spf ucspi-tcp-0.88]# vi error.h #include <errno.h> #ifndef ERROR_H #define ERROR_H :wq! 주의 ) #include <errno.h> 항목이추가가되지않았을경우 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section.tbss mismatches non-tls reference in tcpserver.o 과같은에러가발생한다. 아래와같이 make, make setup check 를입력하여설치를완료한다. [root@spf ucspi-tcp-0.88]# make ( cat warn-auto.sh; \ echo 'main="$1"; shift'; \ echo exec "`head -1 conf-ld`" \ '-o "$main" "$main".o ${1+"$@"}' \... ( 중략)./compile auto_home.c./load install hier.o auto_home.o unix.a byte.a./compile instcheck.c./load instcheck hier.o auto_home.o unix.a byte.a [root@spf ucspi-tcp-0.88]# make setup check./install./instcheck /usr/local/bin 디렉토리에프로그램이설치된다. - 5 -
4. daemontools 설치 daemontools는 Unix 서비스를감시하는프로그램으로서네트워크포트데몬으로동작하는서비스가죽거나반응이없으면해당데몬을자동으로재시작하는기능을제공하는도구이다. 4.1 설치디렉토리생성 daemontools 를설치하기위해서아래와같이 /package 디렉토리를 생성하고권한을부여한다. [root@spf ~]# mkdir /package [root@spf ~]# chmod 1775 /package/ [root@spf ~]# cd /package/ 주의) daemontools 는임의의네트워크데몬을감시할수있는프로그램이므로, 보안을위해서디렉토리에 t 퍼미션(sticky bit) 을부여해야한다. 4.2 다운로드및압축해제 아래와같이 daemontools-0.76 을다운로드한후압축을해제한다. [root@spf /package]# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz http://cr.yp.to/daemontools/daemontools-0.76.tar.gz Saving to: `daemontools-0.76.tar.gz' daemontools-0.76.tar.gz' saved [36975/36975] [root@spf /package]# tar xzf daemontools/daemontools-0.76.tar.gz - 6 -
4.3 컴파일및설치 설치된 glibc 버전이 2.3.1 이상이면컴파일과정에서에러가발생하므로 패키지에포함된 error.h 의파일에 #include <errno.h> 를추가한다. [root@spf package]# cd admin/daemontools-0.76/src/ [root@spf src]# vi error.h #include <errno.h> #ifndef ERROR_H #define ERROR_H :wq! 아래와같이디렉토리이동후설치스크립트를실행한다. [root@spf admin]# cd /package/admin/daemontools-0.76/ [root@spf daemontools-0.76]# package/install Linking./src/* into./compile... Creating /service... Adding svscanboot to inittab... init should start svscan now. - 7 -
5. qmail 설치및 SPF 패치 5.1 다운로드 qmail 원본소스를아래와같이 wget 명령어를이용하여다운로드한다. 칵테일, knetqmail 등의사용자패치는미적용하였다. [root@spf ~]# wget http://cr.yp.to/software/qmail-1.03.tar.gz http://cr.yp.to/software/qmail-1.03.tar.gz Resolving cr.yp.to... 131.193.36.21 Connecting to cr.yp.to 131.193.36.21 :80... connected. HTTP request sent, awaiting response... 200 OK Saving to: `qmail-1.03.tar.gz' qmail-1.03.tar.gz' saved [220668/220668] 5.2 qmail-spf 패치파일다운로드 아래와같이 wget 명령어를이용하여 qmail-spf-rc5 패치파일을다운로드한다. [root@spf ~]# wget http://www.saout.de/misc/spf/qmail-spf-rc5.patch http://www.saout.de/misc/spf/qmail-spf-rc5.patch Resolving www.saout.de... 78.46.99.52, 2001:6f8:13b1:3::2:1 Saving to: `qmail-spf-rc5.patch' qmail-spf-rc5.patch' saved [63582/63582] - 8 -
5.3 qmail-spf 패치 아래와같이 qmail patch 명령어를실행한다. 소스파일을압축해제한후소스디렉토리로이동하여 patch 는원본소스와수정된소스를비교(diff) 해서패치파일을적용하는스크립트이다. [root@spf ~]# tar xzf qmail-1.03.tar.gz [root@spf ~]# cd qmail-1.03 [root@spf qmail-1.03]# patch -p1 <../qmail-spf-rc5.patch patching file byte_cspn.c patching file byte.h patching file byte_rcspn.c patching file TARGETS patching file tcp-env.c 주의) patch 옵션과디렉토리가다른경우에는패치과정에서오류가발생한다. 5.4 qmail 디렉토리및계정/ 그룹생성 qmail 을컴파일하기전에아래와같이사용자계정과그룹을생성한다. [root@spf ~]# mkdir /var/qmail [root@spf ~]# groupadd nofiles [root@spf ~]# useradd -g nofiles -d /var/qmail/alias alias [root@spf ~]# useradd -g nofiles -d /var/qmail qmaild [root@spf ~]# useradd -g nofiles -d /var/qmail qmaill [root@spf ~]# useradd -g nofiles -d /var/qmail qmailp [root@spf ~]# groupadd qmail [root@spf ~]# useradd -g qmail -d /var/qmail qmailq [root@spf ~]# useradd -g qmail -d /var/qmail qmailr [root@spf ~]# useradd -g qmail -d /var/qmail qmails 주의) useradd 과정에서 useradd: 경고: 홈디렉토리가이미존재합니다. skel 디렉토리에서파일을복사하지않습니다 라고출력되는부분은무시한다. - 9 -
5.5 컴파일및설치 설치된 glibc 버전이 2.3.1 이상이면컴파일과정에서에러가발생하므로 패키지에포함된 error.h 의파일에 #include <errno.h> 를추가한다. [root@spf ~]# cd qmail-1.03 [root@spf qmail-1.03]# vi error.h #include <errno.h> #ifndef ERROR_H #define ERROR_H :wq! 아래와같이 make, make setup check,./config-fast 도메인명 을 입력하여 qmail 을설치한다. 도메인명은 FQDN(Fully Qualified Domain Name 의약자) 을입력한다. [root@spf qmail-1.03]# make ( cat warn-auto.sh; \ echo CC=\'`head -1 conf-cc`\'; \ now.o dns.o datetime.a stralloc.a alloc.a str.a substdio.a \ case.a error.a fs.a `cat dns.lib` `cat socket.lib` [root@spf qmail-1.03]# make setup check [root@spf qmail-1.03]#./config-fast mail.testdomain.com /var/qmail 디렉토리에실행/ 설정파일들이설치된다. - 10 -
5.6 구동스크립트디렉토리생성 qmail 구동스크립트를작성하기위하여아래와같이디렉토리를생성한후 t 퍼미션(sticky bit) 을부여한다. [root@spf qmail-1.03]# mkdir -p /var/qmail/supervise/qmail-send/log [root@spf qmail-1.03]# mkdir -p /var/qmail/supervise/qmail-smtpd/log [root@spf qmail-1.03]# chmod +t /var/qmail/supervise/qmail-send [root@spf qmail-1.03]# chmod +t /var/qmail/supervise/qmail-smtpd 5.7 구동스크립트작성 각 qmail 구동스크립트의작성방법과의미는다음과같다. o /var/qmail/rc : qmail의기본구동스크립트 [root@spf qmail]# cd /var/qmail/ [root@spf qmail]# vi rc #!/bin/sh exec env - PATH="/var/qmail/bin:$PATH" qmail-start./maildir/ [root@spf qmail]# chmod 755 rc o /var/qmail/supervise/qmail-send/run : 메일발송을담당하는스크립트 [root@spf qmail]# cd /var/qmail/supervise/qmail-send/ [root@spf qmail-send]# vi run #!/bin/sh exec /var/qmail/rc [root@spf qmail-send]# chmod 755 run - 11 -
o /var/qmail/supervise/qmail-send/log/run : 메일발송시로그를기록하는스크립트 [root@spf qmail]# cd /var/qmail/supervise/qmail-send/log/ [root@spf log]# vi run #!/bin/sh exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail [root@spf log]# chmod 755 run o /var/qmail/supervise/qmail-smtpd/run : 메일수신을위한서비스를실행하는스크립트 [root@spf qmail]# cd /var/qmail/supervise/qmail-smtp/ [root@spf qmail-smtp]# vi run #!/bin/sh Q_UID=`id -u qmaild` Q_GID=`id -g qmaild` exec /usr/local/bin/softlimit -m 2000000 \ /usr/local/bin/tcpserver -vhrl 0 -x /etc/tcp.smtp.cdb \ -u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1 [root@spf qmail-smtp]# chmod 755 run o /var/qmail/supervise/qmail-smtpd/log/run : 메일수신시로그를기록하는스크립트 [root@spf qmail]# cd /var/qmail/supervise/qmail-smtp/log [root@spf log]# vi run #!/bin/sh exec /usr/local/bin/setuidgid qmaill \ /usr/local/bin/multilog t /var/log/qmail/smtpd [root@spf log]# chmod 755 run - 12 -
5.8 로그디렉토리생성 로그를기록하기위해서아래와같이디렉토리를생성하고접근권한을부여한다. [root@spf qmail]# mkdir -p /var/log/qmail/smtpd [root@spf qmail]# chown -R qmaill /var/log/qmail [root@spf qmail]# ln -s /var/qmail/supervise/qmail-send \ /var/qmail/supervise/qmail-smtpd /service 5.9 반송메일수신계정생성 반송메일수신을위해서 root, postmaster 계정으로수신되는메일을 관리자계정으로포워딩을할수있도록아래와같이설정을한다. 예시의주소 admin@example.com 계정대신에실제메일서버관리자계정을입력한다. [root@spf qmail]# echo admin@example.com > /var/qmail/alias/.qmail-root [root@spf qmail]# echo admin@example.com > /var/qmail/alias/.qmail-postmaster 5.10 릴레이허용을위한 IP 설정 아래와같이 localhost(127.0.0.1) 와메일서버 IP의릴레이를허용한다. tcprules 명령어를이용하여 DB 화한파일을생성한다. [root@spf qmail]# vi /etc/tcp.smtp 127.0.0.1:allow,RELAYCLIENT="" 192.168.1.1:allow,RELAYCLIENT="" [root@spf qmail]# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp - 13 -
5.11 서비스구동스크립트다운로드 아래와같이 wget 명령어를이용하여 qmail 서비스구동스크립트를 다운로드한후스크립트의이름을변경하고실행권한을부여한다. [root@spf qmail]# cd /etc/init.d [root@spf init.d]# wget http://lifewithqmail.org/qmailctl-script-dt70 http://lifewithqmail.org/qmailctl-script-dt70 `qmailctl-script-dt70' saved [3053/3053] [root@spf init.d]# mv qmailctl-script-dt70 qmail [root@spf init.d]# chmod 755 qmail 5.12 qmail 시작 아래와같이 qmail 구동스크립트를실행한후 tcp/25 번포트에접속하여 정상적으로 qmail 이실행되고있는지확인한다. [root@spf ~]# /etc/init.d/qmail start Starting qmail [root@spf ~]# telnet 0 25 Escape character is '^]'. 220 kisarbl.or.kr ESMTP quit ( 접속종료) (qmail 실행) (25 번포트접속) - 14 -
III. SPF 1. SPF 적용여부확인및차단 판별을위한판정값설정 qmail 에적용되는차단레벨을설정하기위해서 /var/qmail/control spfbehavior 파일에서레벨을지정할수있다. 디렉토리의 아래는 SPF fail 시메일수신을거부(reject) 하는값인 3 을적용한예시이다. [root@spf qmail]# cd /var/qmail/contorl [root@spf control]# vi spfbehavior 3 SPF 판정값은 0~6 까지지정할수있으며각각의의미는아래와같다. 상위판정값은하위판정값을포함한다. 즉, 판정값 6 은하위 0~5 판정값을 포함한다. 판정값 의미 0 SPF 확인하지않음, SPF-Received 헤더추가하지않음 1 SPF-Recevied 헤더만추가, 메일거부기능사용하지않음 2 DNS 서버의다운으로인해조회가되지않는경우 (451 SPF lookup failure 과같이응답을하면서거부) 3 fail 판정시거부(reject) 4 Soft-fail 판정시거부(reject) 5 neutral 판정시거부(reject) 6 pass 이외의모든상태거부(reject) 주의) 값을변경한이후에는 qmail 을재시작한다. Temperr - 15 -
2. 차단확인 메일서버에 SPF 적용이완료되었으면, 아래와같이 telnet 명령어를 이용하여 SPF 인증기능이적용된메일서버로접속해본다. 메일발송 IP와 SPF 레코드의 IP가일치하지않으면메일수신주소를입력하는 단계에서 SPF 인증이실패하여메일전송이차단되는것을확인할수있다. 550 See http://spf.pobox.com/why.html?sender=kisa%40kisarbl.or.kr&ip=9.8.7.6 &receiver=0 (#5.7.1) 와같은오류코드가나타나며표시되는 URL에서 상세내용을확인할수있다. [root@ ~]# Trying 1.2.3.4... telnet 메일서버IP 25 ( 공인 IP 만가능하며, 127.0.0.1 은확인불가) Connected to your (1.2.3.4). 220 mail.yourdomian.com ESMTP Escape character is '^]'. ehlo test.com 250 kisarbl.or.kr mail from: test@kisarbl.or.kr 250 ok rcpt to: test@yourdomain.com ( 메일발신주소) ( 메일수신주소) 550 See http://spf.pobox.com/why.html?sender=kisa%40kisarbl.or.kr&ip=9.8.7.6 &receiver=0 (#5.7.1) quit ( 접속종료) ( 차단되었음을확인할수있음) - 16 -
2.1 reject 사유페이지확인 http://spf.pobox.com/why.html?sender=kisa%40kisarbl.or.kr&ip=x.x.x.x&receiver=0 페이지에서거부 (reject) 사유와해결방법을확인할수있다. [ 그림 2] SPF fail 시차단확인페이지 - 17 -