커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
*
HanIRC의 #coffeenix 방
[
장비 및 회선 후원
]
> Forum <
IT 일정
N
e
w
!
자동화 프로젝트
HOME
>
네트워크(network)
>
메일 서버(mail)
>
메일 필터링(스팸메일) / procmail
도움말
검색 :
사이트
WHOIS
웹서버 종류
스팸필터링을 위한 SPF 설정과 운영
작성일 : 2006/07/27 19:15
글쓴이 : 좋은진호 (
http://coffeenix.net/
)
조회수 : 25263
[
이전화면
/
수정
] 비밀번호 :
제 목 : 스팸필터링을 위한 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
커피닉스 카페 최근 글
[08/25]
#gpt_question_subje
[08/20]
From what I've seen
[08/14]
сайт
[06/16]
[질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
[04/22]
Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
[10/20]
Cross Compiler 깔
[07/14]
SSL АО
[04/26]
Re: 도스화면 원격조종 여부
[04/25]
도스화면 원격조종 여부
[10/30]
Cshell에서 난수 설정
[10/23]
공항철도주식회사 SE 구인 件
[01/26]
Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
[01/25]
wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
[01/11]
특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
[08/01]
DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
N
e
w
! 최근에 등록한 페이지
KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
오픈캐스케이드 캐드 (OpenCASCADE CAD)
QCad for Windows --- GNU GPL (Free Software)
The Hello World Collection
IPMI를 활용한 리눅스 서버관리
DNS 설정 검사
nagiosgraph 설치 방법
Slony-I 설치 방법 (postgresql replication tool)
Qmail기반의 Anti spam 시스템 구축하기
clusterssh
[ 함께하는 사이트 ]
운영진 :
좋은진호(truefeel)
, 야수(yasu), 범냉이, sCag
2003년 8월 4일~