커피닉스, 시스템 엔지니어의 쉼터
  스팸필터링을 위한 SPF 설정과 운영 작성일 : 2006/07/27 19:15
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 25225
     
    제  목 : 스팸필터링을 위한 SPF 설정과 운영
    작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2006.4.27(목)
    정리일 : 2006.5.30(화)
    수정일 : 2006.12.9(토) whitelist IP 목록 추가

    스팸방지기술인 SPF(Sender Policy Framework)가 무엇인지는 '메일주소 변조는 no, SPF기술에 대해'
    (2005.8.3, 글 좋은진호) http://coffeenix.net/board_view.php?bd_code=1123 을 읽어보기 바란다.

    SPF를 이용하기 위해서는 1) 메일주소를 속였는지 판단할 수 있는 정보를 제공하는 송신측과 2) 판단정보에
    따라 스팸을 필터링하는 수신측 등 2가지 부분으로 나눠 생각해볼 수 있다.

    첫째, 송신측에서는 지정한 IP에서 메일을 보내는 경우는 메일주소를 속이지 않고 정상적으로 발송한 것으로
    판단하도록 DNS의 SPF 레코드(SPF record) 설정을 통해 정보를 제공한다.
    둘째, 수신측에서는 From 메일주소에서 도메인, IP를 알아낸 후 송신측이 제공한 SPF 레코드 정보와 대조를
    해서 일치하면 정상메일, 그렇지 않으면 메일주소를 위변조한 것으로 판단하고 필터링을 한다.

    hanmail.net, naver.com, empas.com(empal.com), paran.com, nate.com, dreamwiz.net(dreamwiz.com) 등의
    포털사이트와 gmail.com, hotmail.com(msn.com) 등의 메일서비스 등에서 이미 SPF 레코드 설정이 되어 있다.
    이것은 가짜 ID@hanmail.net 메일주소를 갖고 실제 hanmail서버를 통해 보내지지 않은 메일에 대해서는 수신
    측의 SPF 필터링 설정을 통해 쉽게 걸러낼 수 있다는 것을 의미한다. 상당수의 스팸 메일이 대형 포털에서
    보낸 것처럼 주소를 속이기 때문에 큰 효과가 있을 것이다. 뒤에서 자세히 살펴보겠지만 hanmail.net의 경우
    는 211.43.197.0/24에서 메일을 발송하면 정상적인 것으로 판단하라고 설정되어 있다.

    이글은 수신측의 sendmail에서 spfmilter를 이용해서 스팸필터링하는 방법을 설명한다.

    1. libspf2 설치

    spfmilter는 SPF library인 libspf2를 사용한다. libspf2 라이브러리는 sendmail이나 postfix 등의 메일
    서버에서 SPF 레코드를 검사하고 인증된 IP, 도메인을 통해서 메일이 보내진 것인지 확인하는 라이브러리
    이다.
    http://www.libspf2.org/ 에 다운받을 수 있으며 RPM 패키지도 제공을 한다.

     
    # cd libspf2-1.x.y
    # ./configure
    # make
    # make install
     


    [ RPM 패키지 ]
     
    libspf2-1.0.4-10.i386.rpm
    libspf2-devel-1.0.4-10.i386.rpm
     


    2. spfmilter 설치

    http://www.acme.com/software/spfmilter/ 에서 C언어로된 spfmilter 소스를 내려받아 설치한다.

     
    # cd spfmilter-x.y
    # ./configure
    # make
    # make install
     


    spfmilter를 부팅시 자동실행하기 위한 Gentoo, Redhat 배포판과 FreeBSD용 rc 스크립트를 제공한다.
    레드햇 배포판의 경우를 설명하면

    - 소스내 rc_scripts/redhat_sysconfig 를 /etc/sysconfig/spfmilter 로 복사한다.
    - rc_scripts/redhat 은 /etc/rc.d/init.d/spfmilter 로 복사한다.
      init.d/spfmilter 파일에서 spfmilter 경로를 수정한다.
      (기본 제공 스크립트에는 /usr/sbin/spfmilter로 되어 있으나 configure 시 옵션없이 실행했다면
       /usr/local/sbin/ 아래에 install될 것이다.)

    이제 spfmilter 실행하는 spfmilt ID를 생성하고 socket 파일이 위치할 디렉토리를 생성한다.

     
    # useradd -M spfmilt -s /sbin/nologin
    # mkdir /var/run/spfmilter
    # chown spfmilt:spfmilt /var/run/spfmilter
     


    3. sendmail.cf 설정과 spfmilter 운영

    sendmail MilterAPI를 통해서 spfmilter을 사용하도록 설정해보자.

    /etc/mail/sendmail.mc에

     
    INPUT_MAIL_FILTER(`spfmilter',`S=unix:/var/run/spfmilter.sock, T=S:8m;R:8m')
     


    을 저장한 후에 다음명령을 실행한다.

     
    # m4 sendmail.mc > sendmail.cf
     


    또는 sendmail.cf 에 직접 다음 줄을 넣어줘도 된다. 기존에 이미 ClamAV나 SpamAssassin 과 같은 다른
    Filter를 사용중이라면 O InputMailFilters=clamav, spfmilter 처럼 기존 설정에 콤마(,)로 구분해서 추가
    하면 된다.

     
    O InputMailFilters=spfmilter

    O Milter.macros.connect=j, _, {daemon_name}, {if_name}, {if_addr}
    O Milter.macros.helo={tls_version}, {cipher}, {cipher_bits}, {cert_subject}, {cert_issuer}
    O Milter.macros.envfrom=i, {auth_type}, {auth_authen}, {auth_ssf}, {auth_author}, {mail_mailer}, {mail_host}, {mail_addr}
    O Milter.macros.envrcpt={rcpt_mailer}, {rcpt_host}, {rcpt_addr}

    Xspfmilter, S=unix:/var/run/spfmilter/spfmilter.sock, T=S:8m;R:8m
     


    SPF 레코드 검사없이 허용할 IP들은 /etc/mail/spfmilter-whitelist 에 적어주면 된다.
    서버의 IP목록이나 사무실의 IP 목록 등을 적어주면 될 것이다.

     
    127.0.0.1
    192.168.123.0/24
    211.123.123.0/24
     


    수신된 메일 중 정상 메일인데, 스팸으로 처리되는 경우가 있다. 대표적인 예가 jobkorea다. 구직자가
    입사 희망 업체를 선택하고 구직신청할 때 구인업체에 메일이 발송되는데, From 주소가 jobkorea 메일주소
    가 아닌 구직자의 메일주소를 사용한다. 구직자는 주로 @hanmail.net, @naver.com, @gmail.com 등의 메일
    주소를 사용하고, jobkorea 메일 서버 IP에서 저 메일주소를 From으로 하여 발송하니 메일주소를 위조한
    것으로 판단하여 필터링하게 되는 것이다. 이외 incruit.com, kr.ibm.com 등도 그런 경우가 있었다.

    [ 정상메일이 필터링되는 과정 예 ]
     1) jobkorea메일서버 (From주소 ...@hanmail.net) -> 2) 구인업체 메일서버로 발송 ->
    3) 메일서버에 SPF로 필터링 중 -> 4) @hanmail.net 주소를 다른 서버에서 보냈네? ->
    5) 메일주소 위조로 판단하여 필터링
     


    따라서 jobkorea 서버 IP를 포함한 다음 목록을 spfmilter-whitelist에 추가해주면 정상메일이 필터링되는
    경우를 막을 수 있다. (경험에 의해 하나씩 추가한 것이다. 이외도 발생하게 되면 추가해주면 된다.)

     60.196.0.63
    61.100.189.146
    61.106.4.130
    61.250.87.0/25
    66.35.192.195
    203.233.124.109
    203.236.1.106
    203.236.20.93
    203.236.33.195
    203.238.135.241
    210.99.210.56
    211.174.185.16
    211.196.150.53
    211.218.146.2
    211.234.104.184
    211.234.104.185
    211.239.121.203
    218.145.47.199
    220.85.13.6
    222.106.59.246
     


    이제 설정은 다 되었으니 spfmilter를 실행하자. spfmilter같이 MilterAPI를 통해 운영되는 프로그램은
    sendmail보다 먼저 실행이 되어야 한다. 여기에는 언급하지 않은 clamav, antivir Milter 같은 안티바이러스
    툴도 마찬가지다. 이미 sendmail이 동작중이면 재실행해주면 된다. 검사 결과에 따라 Received-SPF: 메일
    헤더가 붙게 된다. rc 스크립트로 spfmilter 실행하지 않고 수동으로 실행하는 예는 다음과 같다.

     
    # ./spfmilter --user spfmilt --whitelist /etc/mail/spfmilter-whitelist unix:/var/run/spfmilter/spfmilter.sock
     


    만약 정상메일인데, spfmilter가 softfail(또는 fail. 이 상태에 대해서는 뒤에서 설명한다.)로 판단했다면
    /etc/mail/spfmilter_whitelist에 발송지 IP를 추가해주고 spfmilter 재실행해주면 된다. 물론 sendmail도
    재실행해야 한다.

    4. 주요 사이트의 SPF 레코드의 설정 확인

    SPF 레코드 설정이 되어있는지 확인하는 방법은 DNS lookup툴인 dig 명령을 이용해서 확인할 수 있다.
    hanmail.net 의 SPF 레코드 설정을 확인한 예이다. 네임서버의 TXT레코드에 설정되어 있는 것이 확인됐다.

     
    $ dig hanmail.net txt
    ... 생략 ...
    ;; ANSWER SECTION:
    hanmail.net.            18315   IN      TXT     "v=spf1 ip4:211.43.197.0/24 ptr ~all"

    ;; AUTHORITY SECTION:
    hanmail.net.            18315   IN      NS      ns4.daum.net.
    hanmail.net.            18315   IN      NS      ns5.daum.net.
    hanmail.net.            18315   IN      NS      ns.daum.net.
    hanmail.net.            18315   IN      NS      ns2.daum.net.
    hanmail.net.            18315   IN      NS      ns3.daum.net.
    ... 생략 ...
     


    아래 목록은 필터링된 메일로그를 토대로 해당주소를 dig 명령으로 확인해서 작성한 것이다.
    각 설정의 의미는 'SPF 기술에 대해 (글 좋은진호)' http://coffeenix.net/board_view.php?bd_code=1123
    를 읽어보기 바란다.

    1) hanmail.net(daum.net)
        v=spf1 ip4:211.43.197.0/24 ptr ~all

    2) naver.com
        v=spf1 ip4:220.95.234.208 ip4:61.74.70.0/23 ip4:222.122.16.0/24
        ip4:220.73.156.0/24  ip4:211.218.150.0/24 ip4:211.218.151.0/24
        ip4:211.218.152.0/24 ip4:218.145.30.0/24 ~all

    3) empas.com(empal.com)
        v=spf1 ip4:220.95.223.0/24 ip4:220.90.209.0/24 ip4:220.90.208.0/24 ptr -all

    4) paran.com
        v=spf1 ip4:211.41.82.0/24 a mx ptr ~all

    5) nate.com
        v=spf1 ip4:203.226.253.0/24 ip4:203.226.255.0/24 ~all

    6) dreamwiz.net(dreamwiz.com)
        v=spf1 ip4:211.39.128.0/24 ip4:211.39.129.0/24 ip4:222.122.42.0/25 ~all

    7) gmail.com
        v=spf1 redirect=_spf.google.com

    8) hotmail.com(msn.com)
        v=spf1 include:spf-a.hotmail.com include:spf-b.hotmail.com
        include:spf-c.hotmail.com include:spf-d.hotmail.com ~all

    9) hanmir.com
        v=spf1 ip4:211.41.82.0/24 a mx ptr ~all

    10) chol.com
        v=spf1 ip4:203.252.1.0/24 ip4:203.252.3.0/24 ip4:164.124.191.0/24 ip4:210.120.128.23 ~all

    11) korea.com
        v=spf1 mx ip4:211.49.224.0/24 ip4:211.109.1.0/24 ip4:211.49.227.32 ip4:211.49.227.33 ~all

    12) freechal.com
        v=spf1 a:mail101.freechal.com a:mail102.freechal.com a:mail103.freechal.com
        a:mail104.freechal.com a:mail105.freechal.com a:mail106.freechal.com mx:mx01.freechal.com ~all

    13) sayclub.com(sayclub.co.kr)
        v=spf1 ip4:211.234.215.240/32 ip4:211.233.85.225/32 ~all

    14) lycos.co.kr
        v=spf1 ip4:203.226.253.0/24 ip4:203.226.255.0/24 ~all

    15) nownuri.net
        v=spf1 a:mail.nownuri.net a:nowmail01.nownuri.net a:lion4.nownuri.net ~all

    16) nhncorp.com
        v=spf1 ip4:220.95.234.208 ip4:220.73.156.0/24 ip4:211.218.150.0/24
        ip4:220.73.146.0/24  ip4:220.73.158.0/24 ip4:220.73.159.0/24
        ip4:220.95.235.0/24  ip4:220.95.234.0/24 ip4:220.95.236.0/24
        ip4:211.218.152.0/24 ip4:218.145.30.0/24 ~all

    17) hankooki.com
        v=spf1 ip4:211.40.221.201 ip4:211.40.221.202 ip4:211.40.221.203
        ip4:211.40.221.198 ip4:211.40.221.250 ip4:211.233.68.69 ip4:211.40.221.200 ptr
        a:mailling.hankooki.com a:smtp.hankooki.com mx:211.40.221.200 ~all

    18) hani.co.kr
        v=spf1 mx a:mail2.hani.co.kr a:news.hani.co.kr mx:mail2.hani.co.kr
        mx:news.hani.co.kr ~all

    19) interpark.com
        v=spf1 ip4:218.144.89.0/24 ip4:211.233.74.0/24 ~all

    20) auction.co.kr
        v=spf1 ip4:211.233.17.0/24 ip4:211.115.78.0/24 ip4:222.231.5.55
        ip4:210.182.155.153 ip4:210.182.155.154 ip4:210.182.155.155 ~all

    21) jobkorea.co.kr
        v=spf1 ip4:61.250.87.0/24 a mx  -all

    22) hostway.co.kr
        v=spf1 ip4:66.232.144.48 ip4:66.232.139.0/24 ip4:211.239.150.30 ip4:211.115.223.215 ~all

    23) microsoft.com
        v=spf1 mx include:_spf-a.microsoft.com include:_spf-b.microsoft.com
        include:_spf-c.microsoft.com ~all

    24) aol.com
        spf2.0/pra ip4:152.163.225.0/24 ip4:205.188.139.0/24 ip4:205.188.144.0/24 ip4:205.188.156.0/23
        ip4:205.188.159.0/24 ip4:64.12.136.0/23 ip4:64.12.138.0/24 ptr:mx.aol.com ?all

        v=spf1 ip4:152.163.225.0/24 ip4:205.188.139.0/24 ip4:205.188.144.0/24 ip4:205.188.156.0/23
        ip4:205.188.159.0/24 ip4:64.12.136.0/23 ip4:64.12.138.0/24 ptr:mx.aol.com ?all

    25) paypal.com
        spf2.0/pra mx include:s._sid.ebay.com include:m._sid.ebay.com
        include:p._sid.ebay.com include:c._sid.ebay.com ~all

        v=spf1 mx include:s._spf.ebay.com include:m._spf.ebay.com
        include:p._spf.ebay.com include:c._spf.ebay.com ~all

    26) sohu.com
        v=spf1 ip4:61.135.130.0/23 ip4:61.135.132.0/23 ip4:61.135.134.0/23
        ip4:61.135.145.0/23 ip4:61.135.150.0/23 ip4:220.181.26.0/24
        ip4:222.28.152.128/25 ip4:218.206.87.0/25 ip4:221.236.12.128
        ip4:203.184.141.0/24 ip4:61.152.234.0/24 ~all

    27) 163.com
        v=spf1 ip4:220.181.12.0/22 ip4:202.108.5.0/24 -all

    5. spfmilter가 남기는 메일헤더와 procmailrc 설정

    maillog에 남은 spfmilter관련 메시지의 일부분이다. (※ 일부 IP와 도메인, 메일주소는 수정)

     
    Received-SPF: pass (coffeenix.net: domain of xxxxx@hanmail.net designates 211.43.197.24 as permitted sender) receiver=coffeenix.net; client-ip=211.43.197.24; helo=smail-102.hanmail.net; envelope-from=xxxxx@hanmail.net;

    Received-SPF: pass (coffeenix.net: 192.168.123.20 is whitelisted) receiver=coffeenix.net; client-ip=192.168.123.20; helo=xxx.coffeenix.net; envelope-from=xxxxx@xxx.coffeenix.net;

    Received-SPF: none (coffeenix.net: master@smtp.ahnlab.com does not designate permitted sender hosts) receiver=coffeenix.net; client-ip=211.233.80.33; helo=imas.ahnlab.com; envelope-from=master@smtp.ahnlab.com;

    Received-SPF: neutral (coffeenix.net: 220.82.22.156 is neither permitted nor denied by domain of xxxxx@aol.com) receiver=coffeenix.net; client-ip=220.82.22.156; helo=coffeenix.net; envelope-from=xxxxx@aol.com;

    Received-SPF: softfail (coffeenix.net: domain of transitioning xxxxx@chol.com does not designate 60.10.55.152 as permitted sender) receiver=coffeenix.net; client-ip=60.10.55.152; helo=60.10.55.152; envelope-from=xxxxx@chol.com;

    Received-SPF: fail (coffeenix.net: domain of xxxxx@126.com does not designate 203.100.177.221 as permitted sender) receiver=coffeenix.net; client-ip=203.100.177.221; helo=coffeenix.net; envelope-from=xxxxx@126.com;

    Received-SPF: unknown (coffeenix.net: unknown result during lookup of xxxxx@hanm...) receiver=coffeenix.net; client-ip=58.140.30.15; helo=coffeenix.net; envelope-from=xxxxx@hanm...;

    Received-SPF: error (coffeenix.net: error in processing during lookup of xxxxx@hanmail.net) receiver=coffeenix.net; client-ip=211.43.87.2; helo=127.0.0.1; envelope-from=xxxxx@hanmail.net;
     


    pass, fail, softfail, neutral, none, unknown, error 등의 결과를 확인할 수 있을 것이다.

    - pass     : 100% 확실한 메일로 판단한 경우이다. SPF 레코드나 whitelist에 포함된 IP이다.
    - fail     : 메일주소를 위변조한 것으로 판단한 경우. 해당 메일은 필터링처리하면 된다.
                 SPF 레코드에 -all 로 설정한 경우임
    - softfail : 100%는 아니지만 fail쪽에 가깝고, fail과 neutral의 중간정도에 해당한다.
                 SPF 레코드에 ~all 로 설정한 경우임
                 위 사이트에서 empas.com, jobkorea.co.kr, 163.com을 제외한 대부분이 ~all로 설정되어
                 있으니 이 판정 상태에 대해서도 필터링해야 SPF 사용에 효과가 있다.
    - neutral  : 메일주소의 위변조 판단하는 것을 원치 않음을 나타낸다. 따라서 none과 같은 형태로
                 처리해주면 된다. SPF 레코드에 ?all 로 설정한 경우임
    - none     : SPF 레코드를 제공하지 않는 경우
    - unknown  : lookup한 결과를 알 수 없을(완벽하게 처리되지 못한) 경우
    - error    : lookup할 때 에러가 발생한 경우

    메일주소 위변조가 높은 순서로 나열하면 fail > softfail > neutral > none > pass 순으로 볼 수 있다.
    SPF의 판정 상태를 알았으니 이제 procmail을 통하여 필터링 적용을 해보자.
    - 'Received-SPF: fail'일때와 'Received-SPF: softfail' 인 경우에는 procmail에 로그를 남기고
    - 수신된 메일을 스팸메일함(var/log/SPAM_SPF.log, 메일을 버리려면 /dev/null 지정)으로 보내기 위한
    procmailrc 설정 예는 다음과 같다.
    - 아래 설정에서 LOG= 다음줄에 큰따옴표(")는 줄바꿈을 위해서 표시한 것으로, 잘 못 표기한게 아니다.

    [ /etc/procmailrc ]
     
    LOGFILE=/var/log/procmail
    VERBOSE=no
    PATH=/usr/bin:/usr/local/bin:/bin
    SHELL=/bin/sh

    SPAM_SPF_LOG = "/var/log/SPAM_SPF.log"

    :0 :
    * ^Received-SPF: \/(fail|softfail)
    {
       STAT = "$MATCH"

       # From
       :0
       * ^From: \/.*
       {
          FROM = "$MATCH"
       }
                                                                                                                         
       # Subject
       :0
       * ^Subject: \/.*
       {
          SUBJECT = "$MATCH"
       }
                                                                                                                         
       # Log를 남김
       LOG="=====SPF_filter($STAT) F=$FROM, S=$SUBJECT
    "
       # 메일 별도 저장 또는 null
       :0
       $SPAM_SPF_LOG
    }
     

    * 다운로드 : http://coffeenix.net/truefeel/files/spf_procmailrc.txt

    /var/log/procmail 에는 다음과 같이 기본 로그 외에 '==='로 시작하는 한줄짜리 로그가 추가로 남게된댜.
    (메일주소 xxxxx로 변경)

     
    =====SPF_filter(fail) F=xxxxx , S=웰빙자격증==농산물...
    From xxxxx@empal.com  Tue May 30 18:13:50 2006
    Subject: 웰빙자격증==농산물...
      Folder: /var/log/SPAM_SPF.log                                            1981
     


    DomainKeys를 사용하는 야후를 제외한 대부분의 포털에서는 SPF 레코드 설정이 되어 있으므로 보다 깨끗해진
    메일함으로 상큼한 아침을 맞이하게 될 것이다.

    6. 참고자료(관련자료)

    * 스팸필터링 기술 SPF에 대한 SPF 레코드의 설치와 운영
      http://coffeenix.net/doc/security/SPF설치및운영지침서.pdf
      출처 : 불법스팸대응센터( http://www.spamcop.or.kr/ )

    * spfmilter Installation
      http://www.acme.com/software/spfmilter/

    * Received-SPF: a new header
      http://www.openspf.org/newheader.html

    * Sender Policy Framework (SPF) for Authorizing Use of Domains in E-MAIL, version 1
      http://www.schlitt.net/spf/spf_classic/draft-schlitt-spf-classic-02.html

    * SPF Softfail
      http://www.micheldonais.com/archives/17

    * SPF Configuration (글 김정균)
      http://oops.org/?t=lecture&sb=sendmail&n=9


    커피닉스, 시스템 엔지니어의 쉼터 / URL : http://coffeenix.net/board_view.php?bd_code=1426