요 며칠 삽질기 -_-! with Exim

어째 요새 관리해야할 서버가 늘어버렸네요. (전 언픽스 하나로 족한데 ㅠ.ㅠ) 하여튼!! 요 며칠 사이 gentoo + exim + procmail + spf + srs + clamav + bogofilter + dovecot 를 시도해봤습니다.

사실 계속 제가 맡아서 할 게 아니라 길어야 일 년 정도 만져줄 서버기 때문에 젠투가 아닌 다른 배포판을 생각했었는데, spf 와 srs 를 지원할 수 있도록 하면서 기본으로 제공되는 패키지를 이용할 수 있는 조합이 몇 가지 되질 않더군요. exim 에서 spf 와 srs 는 experimental 로 되어 있기 때문에 바이너리 배포판에선 기본으로 적용이 되어 있질 않고, postfix + milter 조합에서는 srs 를 제공할 수 없기 때문에 남은 선택은 sendmail + milter 조합 밖에 없는데 sendmail 을 사용하기는 싫었거든요.

하여튼! exim 에 procmail 을 붙이는 방법은 아래와 같습니다.

Continue reading 요 며칠 삽질기 -_-! with Exim

exim 에 spf, srs 적용하기

unfix 서버를 구축할 땐 postfix 를 사용했지만 postfix 에선 srs 를 사용할 수가 없었기 때문에 새로 설치하게 된 서버들에선 exim 을 시도 중이다.
그런데 exim 을 사용하려고 하니 문제가 하나 있는데, 구글에서 검색을 해도 원하는 결과가 잘 나오질 않는다는 점이 바로 그것! exim 에는 spf 와 srs 등을 사용하기 위해서는 따로 패치가 필요 없이 그저 EXPERIMENTAL_SPF=yes EXPERIMENTAL_SRS=yes 이 두 가지 환경변수를 세팅한 채로 빌드를 진행하면 된다.
그 이후 어떻게 해야하는 지에 대한 설명이 없어서 한참 헤맸는데 exim 과 함께 설치되는 문서를 확인해야하는 것이었다. -_-; 보면 domain key 등도 위에서와 같이 환경변수만 세팅해주면 사용이 가능해진다.
doc/exim-4.68/experimental-spec.txt.bz2
문서를 확인해보니 이제 해야할 일은 spf 와 srs 설정을 추가해주는 것 뿐 후훗!
SPF 는 global 섹션에서 acl_smtp_rcpt 로 등록되어 있는 것에 다음과 같은 설정을 넣어주면 된다.
# Query the SPF information for the sender address domain, if any,
# to see if the sending host is authorized to deliver its mail.
# If not, reject the mail.
#
deny
message = [SPF] $sender_host_address is not allowed to send mail \
from $sender_address_domain
log_message = SPF check failed.
spf = fail
 
# Add a SPF-Received: header to the message
warn
message = $spf_received

젠투에선 acl_smtp_rcpt = acl_check_rcpt 와 같이 되어 있기 떄문에 acl_check_rcpt 에 위와같은 설정을 추가해줬다. 만약 아래 warn message = $spf_received 를 넣어주지 않으면 spf 결과를 헤더에 추가해주지 않게된다. 생색을 내기 위해선 뭔가 출력될 필요가 있으므로 -_-! 난 헤더를 추가하도록 설정해줬다.
하지만 위에 대로만 할 경우 내가 메일을 보낼 경우에도 SPF-Received 헤더가 붙는 문제가 생긴다. smtp auth 를 설정해놓은 상황에서 이 서버를 통해 메일을 보낼려면 인증이 되어있어야 할테니 아래와 같이 수정해서 이런 문제를 피해주자.

# Add a SPF-Received: header to the message
warn
message = $spf_received
!authenticated = *

그리고 그 담은 SRS 복잡하게 하려면 복잡하겠지만 다 귀찮아서 hash 용 secretkey 하나만 넣어서 설정해버렸다. 아래 설정은 global 섹션에 들어가면 된다. (domainlist 같은게 들어가는 곳) 실제로 somesecretkey 를 적어주는건아니고 그냥 원하는 단어 하나를 적어주면 된다.
srs_config = somesecretkey
그 다음엔 userforward 트랜스포트에 srs 를 적용하도록 해주자 srs = forward 만이 내가 추가해준 부분;;
userforward:
driver = redirect
srs = forward
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
file = $home/.forward
# allow_filter
no_verify
no_expn
check_ancestor
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply

이제 끝!!!
얼마 받지도 못하는 웍스테이션 조굔지 뭔지 때문에 지난 며칠간 고생한걸 생각하면 흑흑 ㅠ.ㅠ
p.s) exim 에 spf 적용하기와 관련해서 따라하기 편한 문서가 있는데 페이지 랭크가 낮은거 같아서 링크
http://slett.net/spam-filtering-for-mx/exim-spf.html

Sender Rewrite Scheme

spf 는 예전에 써놨던 글에서 충분히 설명해놨듯이 메일의 도메인값과 발송지 값을 이용해 스팸을 필터링해내기 위한 기술입니다. 예를 들어 From address 에 nospam@mytears.org 가 있을 경우 mytears.org 도메인의 txt 정보를 읽어오고, 거기에 적혀있는 61.109.245.78 에서 온 메일만을 정상적인 메일로 판단하게 되는데, 이렇게 spf 가 적용되어 있는 경우 .forward 나 alias 등을 이용해서 메일을 포워딩 시킬 경우 문제가 있을 수 있습니다.
.forwards 를 통해 nospam@mytears.org 를 nospam@gmail.com 으로 리다이렉션을 시킨 경우를 생각해봅시다.

  1. sender@somedomain 에서 nospam@mytears.org 로 메일을 보냄
  2. mytears 메일 서버에서 nospam@mytears.org 사용자에 대한 .forward 파일을 읽어서 거기 적혀있는 nospam@gmail.com 으로 메일을 포워딩 시킴
  3. gmail 메일 서버에서 from address 인 somedomain 의 txt 에서 spf 정보를 읽어옴
  4. spf 로 지정된 아이피와 메일을 포워딩시킨 서버의 아이피가 동일하지 않으므로 spf 정보가 맞지 않다고 판단함
  5. spf 정책에 따라 다르겠지만 대부분 스팸이라고 판단하게 됨
  6. 결국 제대로 메일이 전해지지 않음

이걸 해결하기 위한 방법으로 srs 라는 게 있습니다. 이걸 적극적으로 적용한 예로는 구글이 있습니다.
exim 의 경우 기본적으로 spf, srs 를 지원하기 때문에 빌드할 때 옵션을 잘 조절해주면 쉽게 적용할 수 있습니다. sendmail 의 경우 milter 를 이용하면 srs 를 적용할 수 있구요. 하지만 postfix 에서는 이를 사용할 수 없는 방법이 없습니다. (구버젼의 postfix 라면 패치를 통해 사용할 수 있지만 이 패치가 계속 유지되질 않고 있습니다.)
참고
spf: http://www.openspf.org/
srs: http://www.openspf.org/SRS
p.s) 그나저나 spf 가 나온지 꽤 오랜 시간이 흘렀음에도 대학 메일 서버들 중에 spf 를 지원하는 곳은 별로 없군요.

Sender Policy Framework

planet.findout.or.kr 이라던가 기타 여러 곳에서 spf 에 관련된 내용을 듣다가 spf filter 를 붙이면 얼마나 효과가 있을지 궁금해지길래 postfix 에 spf 패치를 해봤습니다. 정상적으로 spf 인증을 통과한 메일헤더에는 pass 했다는 표시가 붙고, 네임서버가 spf 를 지원하지 않는 곳이라면 none, 실패했을 경우엔 spf 정책에 따라 fail 이나 softfail 이라는 에러코드가 붙게 됩니다.
spf 는 Sender Policy Framework 의 약자로 메일에 붙은 return address 를 이용 메일이 인증받은 메일 서버를 통해 발송되었는지를 체크하는 방식입니다. dns(송신 측) 와 smtp server(수신 측) 모두 spf 를 지원하는 경우에 사용할 수 있습니다. (생각해보면 smtp server 대신 mta 에서 지원해도 안될 건 없을거라고 생각합니다.)

SPF makes it easy for a domain, whether it’s an ISP, a business, a school or a vanity domain, to say, “I only send mail from these machines. If any other machine claims that I’m sending mail from there, they’re lying.”

spf 의 원리를 아주 간단하게 표현해 놨길래 인용해봅니다… “난 이 메일서버를 통해서만 메일을 보내니까 만약 다른 메일 서버를 통해 이 메일주소로 메일이 온다면 그건 허위 메일이야!!” 뭐 이 정도로 이해하면 되겠습니다.
아래에 quote 된 결과와 같이, 2006년 9월 24일 현재 대부분의 이메일 서비스에서 spf 를 지원하고 있는 것을 확인할 수 있습니다. 다만 sk telecom 의 경우 이메일 고지서의 return address 가 emailadmin@emailrms.sktelecom.com 로 명시되어 있기 때문에 이메일 고지서는 spf 의 영향을 받지 않아 약간 아쉬움이 남네요. (사실 sk 에 아쉬운 부분은 그것 만이 아니죠. 괜히 ‘ass k’ 라고 부르는 게 아닙니다.)
yahoo 에서 spf 를 지원 안한다는 점 또한 무척이나 아쉬운 부분 중 하나입니다.
[spoiler ‘apblind”결과보기”결과 감추기’]

aqua@Macintosh aqua $ nslookup
> set q=txt
> unfix.net
unfix.net text = “v=spf1 a mx ptr ~all”
> dreamwiz.com
dreamwiz.com text = “v=spf1 ip4:211.39.128.0/24 ip4:211.39.129.0/24 ip4:222.122.42.0/25 ~all”
> korea.com
korea.com text = “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”
> hanmail.net
hanmail.net text = “v=spf1 ip4:211.43.197.0/24 ptr ~all”
> hotmail.com
hotmail.com text = “v=spf1 include:spf-a.hotmail.com include:spf-b.hotmail.com include:spf-c.hotmail.com include:spf-d.hotmail.com ~all”
> gmail.com
gmail.com text = “v=spf1 redirect=_spf.google.com”
> _spf.google.com
_spf.google.com text = “v=spf1 ip4:216.239.56.0/23 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ?all”
> nate.com
nate.com text = “v=spf1 ip4:203.226.253.0/24 ip4:203.226.255.0/24 ~all”
> naver.com
naver.com text = “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 ip4:220.95.237.0/24 ~all”
> msn.co.kr
*** Can’t find msn.co.kr: No answer
> msn.com
msn.com text = “v=spf1 include:spf-a.hotmail.com include:spf-b.hotmail.com include:spf-c.hotmail.com include:spf-d.hotmail.com ~all”
> yahoo.com
*** Can’t find yahoo.com: No answer
> yahoo.co.kr
*** Can’t find yahoo.co.kr: No answer
> hitel.net
hitel.net text = “v=spf1 ip4:211.41.82.0/24 a mx ptr ~all”
> sktelecom.com
sktelecom.com text = “v=spf1 ip4:203.236.1.100 -all”
> emailrms.sktelecom.com
*** Can’t find emailrms.sktelecom.com: No answer

[/spoiler]
이번엔 대학 메일 서비스의 경우를 살펴보겠습니다. 결과부터 말하자면 아주 실망스럽습니다. 제가 테스트 해본 대학들의 경우 전부 spf 를 지원하지 않네요.
[spoiler ‘apblind”결과 보기”결과 감추기’]

aqua@Macintosh aqua $ nslookup
> set q=txt
> hongik.ac.kr
*** Can’t find hongik.ac.kr: No answer
> wow.hongik.ac.kr
*** Can’t find wow.hongik.ac.kr: No answer
> korea.ac.kr
*** Can’t find korea.ac.kr: No answer
> snu.ac.kr
*** Can’t find snu.ac.kr: No answer
> yonsei.ac.kr
*** Can’t find yonsei.ac.kr: No answer
> hanyang.ac.kr
*** Can’t find hanyang.ac.kr: No answer

[/spoiler]
spf 를 지원하기 위해선 네임서버의 zone 파일에 “IN TXT “v=spf1 a mx ptr ~all” 정도의 룰을 삽입하면 되며, 룰은 아래의 링크를 이용하면 쉽게 만들 수 있습니다.
http://www.openspf.org/wizard.html?mydomain=&x=21&y=7
p.s) 국내 포털이 spf 를 지원하기 시작한 이후로 스팸의 70% 이상은 spf 로 걸러낼 수 있게 되었습니다.