그 동안 스팸의 염려로 WordPress에서 기본적으로 제공하는 Akismet과 더불어서 강력하다는 Bad Behavior plugin을 사용하고 있었다. 하지만, 이 Bad Behavior란 놈은 정상적인 댓글마저도 스팸으로 오인하는 치명적인 부작용을 가끔씩 경험하게 만들었고, 또 웹 페이지에 뿌려대는 지저분한 코드들과 이로 인한 페이지의 로딩 속도를 상당히 지연시키는 단점을 가지고 있기도 해서, 이번에 WordPress 2.6 버전으로 갱신하면서 사용을 중단하고 대신 차선책을 살펴보았다.

찾아보니, 비슷한 이유로 Bad Behavior와의 작별을 고하면서 차선책들을 강구해놓은 글을 참고해서, 방어막 구축에 다시 손을 보탰다.
주요 방비책으로는 결국 .htaccess 파일의 수정으로 요약되는데, 아래의 내용은 POST 시 Referrer가 없는 request들을 차단해준다:

# block comment spam by denying access to no-referrer requests 
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.*mydomainname.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule ^(.*)$ ^http://%{REMOTE_ADDR}/$ [R=301,L] [R=301,L]

여기서, !.*mydomainname.com.* 부분은 자신의 도메인 이름으로 대치해주면 됨.

자, 이제 지켜볼 일만 남았군.

개인적으로, OS X에 내장되어 있는 Postfix mailer를 Postfix Enabler 가지고 켜놓고 사용하고 있다.

그런데, 어느날 갑작스런 메일 서버의 통신량 증가로 system.log를 살펴본 결과, 수상한 발자국들이 찍혀있는 다음과 같은 경고 문구들을 발견하게 되었다.

warning: numeric domain name in resource data of MX record for neticks.com: 127.0.1.51
warning: numeric domain name in resource data of MX record for neticks.com: 127.0.1.51
warning: valid_hostname: empty hostname
warning: malformed domain name in resource data of MX record for angelfire.com: 
warning: numeric domain name in resource data of MX record for staa.com: 69.106.54.69
warning: valid_hostname: empty hostname
warning: malformed domain name in resource data of MX record for angelfire.com: 
warning: numeric domain name in resource data of MX record for staa.com: 69.106.54.69
warning: numeric domain name in resource data of MX record for aolloses.com: 127.0.1.51
warning: valid_hostname: empty hostname
warning: malformed domain name in resource data of MX record for angelfire.com: 
warning: valid_hostname: empty hostname
warning: numeric domain name in resource data of MX record for bioteda.com: 211.156.49.6
warning: numeric domain name in resource data of MX record for jaehnsautobody.com: 127.0.0.10
warning: numeric domain name in resource data of MX record for aolloses.com: 127.0.1.51
warning: valid_hostname: empty hostname
.
.
warning: mail2.remoteit.com[67.102.200.130] offered AUTH option multiple times
warning: mail.airewaves.com[216.24.174.202] offered AUTH option multiple times
warning: mail.visual-impct.com[206.80.23.8] offered AUTH option multiple times
warning: mx.rogersdesign.com[209.60.77.50] offered AUTH option multiple times
warning: mail.marketspacefinancial.com[199.227.43.234] offered AUTH option multiple times
warning: mail.ruralfree.net[209.213.15.65] offered AUTH option multiple times
warning: mail.spec.net[205.167.92.100] offered AUTH option multiple times
warning: imail.ipswitch.com[156.21.1.5] offered AUTH option multiple times
warning: mail.snworks.com[63.75.167.9] offered AUTH option multiple times
warning: mail.komo.com[64.83.205.251] offered AUTH option multiple times
warning: ns2.fourway.net[216.223.165.6] offered AUTH option multiple times
warning: sw1.la-lakers.com[66.226.3.253] offered AUTH option multiple times
warning: mail.pxgp.com[207.201.223.114] offered AUTH option multiple times
warning: mail.pageconcepts.com[204.118.3.168] offered AUTH option multiple times
warning: mail.netscape.everyone.net[216.200.145.10] offered AUTH option multiple times

이런! 😯 수시로 알 수 없는 곳에서 계속 나의 메일 서버를 relay 서버 삼아 쓰레기 전자우편들을 보내려고 시도하고 있는 것이 아닌가? 👿

이것을 계기로 아래는 꼭 살펴보아야 할 Postfix의 보안 관련 필수 설정 항목들을 모아 보았다.

SASLDB를 사용한 SMTP 암호 인증을 사용하지 않는 한 꼭 SSL 암호화 기능을 켜서, 만에 하나 암호가 중간에 가로채어지는 일을 방지할 것.

– /etc/postfix/main.cf:
# 인가된 네트워크에서만 접속을 허용.
smtpd_client_restrictions = permit_mynetworks, reject

# 자신의 hostname을 모르는 메일 시스템한테는 얘기를 안함.
# Postfix 버전이 < 2.3일 경우, reject_unknown_hostname를 지정.
smtpd_helo_restrictions = reject_unknown_helo_hostname

# 존재하지 않는 도메인에서는 전자우편을 받지 않음.
smtpd_sender_restrictions = reject_unknown_sender_domain

# 로컬 클라이언트들은 목적지의 지정이 자유로우나, 그 이외에는 차단.

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

# pipelining 명령을 못 알아드는 엉성한 클라이언트들은 차단.
smtpd_data_restrictions = reject_unauth_pipelining

# relay_domains_reject_code 변수는 SMTP 서버가 메일 전달 지침을 무시하려는
# 클라이언트들에게 어떻게 응답할 것인지를 지정함.
# 이것의 변수는 RFC 821를 따름. 기본값은 554: Transaction failed.
# 550: no access
relay_domains_reject_code = 550

# SMTP 클라이언트들은 SMTP 세션을 시작하기 전에
# 먼저 자신의 정체를 밝히도록 함.
smtpd_helo_required = yes

# 메일 전달 목적지가 Postfix에 의해 인가된 곳이더라도,
# 인가되지 않은 곳으로부터의 어떠한 메일 전달도 허용하지 않도록 함.
# 기본적으로 설정되어 있는 값이지만, 추가해 놓는다고 해가 될 것은 없다.
allow_untrusted_routing = no

Open Relay Database 같은 곳에 자신의 메일 서버가 스펨 메일 서버로 등록되지 않으려면, 주의가 필요하다.

– 추가 참고 글