spam メイル対策で紹介した spam メイルの具体的な対策方法のうち,spam メイルと思わしき電子メイルを受け取らなくする,OpenBSD spamd について,導入方法などを紹介したいと思います.
OpenBSD spamd は,OpenBSD に付属するパケットフィルタ,pf と連携して動作し,MTA の通信を横取りして,proxy 動作します.(FreeBSD で多く使われている ipfw でも使えます)
MTA の種類を問わないので,qmail など,spam メイル対策が難しい MTA を使っている人に有用です.
ビット珈琲では,メイルサーバには,FreeBSD 上に,MTA として qmail を採用し,それに加え,アカウント管理のために,vpopmail を導入しています.
ここに,OpenBSD spamd を導入するのは非常に簡単です.
OpenBSD spamd は port (ports/mail/spamd) が用意されているので,これを使います.
後述する greylist を使うには,fdescfs が必要となるので,/etc/fstab に記述を追加します.
root@TOJO /root# cat /etc/fstab | grep fdescfs[CRLF]
fdescfs /dev/fd fdescfs rw 0 0
また,/etc/rc.conf にオプションを記述します.
root@TOJO /root# cat /etc/rc.conf | grep pfspamd[CRLF]
pfspamd_enable="YES"
pfspamd_flags="-g"
リストを更新するため,cron にリスト同期のコマンドを登録します.
root@TOJO /root# crontab -l | grep spamd[CRLF]
52 * * * * /usr/local/sbin/spamd-setup 2>&1 >/dev/null
最後に,/etc/pf.conf を書き換え,pf を有効にします.(spamd は port によって,/etc/services に追加されていますが,8025/tcp です)
root@TOJO /root# tail -7 /etc/pf.conf[CRLF]
ext_if="fxp0"
table <spamd> persist
table <spamd-white> persist
rdr pass on $ext_if proto tcp from <spamd> to port smtp -> 127.0.0.1 port spamd
rdr pass on $ext_if proto tcp from !<spamd_white> to port smtp -> 127.0.0.1 port spamd
root@TOJO /root# cat /etc/rc.conf | grep pf[CRLF]
pf_enable="YES"
pfspamd_enable="YES"
pfspamd_flags="-g"
spamd は,pf によって,blacklist あるいは,whitelist にない (greylist) IP アドレスから,SMTP (25/tcp) への接続を,自分自身 (8025/tcp) に転送します.
もし,blacklist からの接続の場合,1秒の遅延を加え,ウィンドウサイズを 1byte に変更し,わざとレスポンスを長くして,非常にゆっくりとしたやりとりで,電子メイルを受け取るフリをします.
spammer が本文を全て送りきった時点で,レスポンス 450 を返し,電子メイルを受け取れなかった旨を返します.
kakuo@TOJO /home/kakuo% telnet[CRLF]
telnet> open mail.bitcoffee.com 25[CRLF]
Trying 203.141.150.36...
Connected to 203.141.150.36.
Escape character is '^]'.
220 san.bitcoffee.net ESMTP spamd IP-based SPAM blocker; Tue May 8 07:09:53 2007
HELO kakuo.com
250 Hello, spam sender. Pleased to be wasting your time.
MAIL From: <kakuo@kakuo.com>
250 You are about to try to deliver spam. Your time will be spent, for nothing.
RCPT To: <hogehoge@bitcoffee.com>
250 This is hurting you more than it is hurting me.
DATA
354 Enter spam, end with "." on a line by itself
From: "Kakuo TOJO" <kakuo@kakuo.com>[CRLF]
To: hogehoge@bitcoffee.com[CRLF]
Subject: This is spam mail[CRLF]
[CRLF]
Hello.[CRLF]
How are you?[CRLF]
.[CRLF]
450-Your address (blacklist に載ってる IP アドレス) has mailed to spamtraps here
450 Connection closed by foreign host.
greylist からの接続の場合,まずは,HELO コマンド,MAIL コマンド,RCPT コマンドを受付け,451 Temporary failure, please try again later. を返します.
kakuo@TOJO /home/kakuo% telnet[CRLF]
telnet> open mail.bitcoffee.com 25[CRLF]
Trying 203.141.150.36...
Connected to 203.141.150.36.
Escape character is '^]'.
220 san.bitcoffee.net ESMTP spamd IP-based SPAM blocker; Tue May 8 07:22:36 2007
HELO kakuo.com
250 Hello, spam sender. Pleased to be wasting your time.
MAIL From: <kakuo@kakuo.com>
250 You are about to try to deliver spam. Your time will be spent, for nothing.
RCPT To: <hogehoge@bitcoffee.com>
451 Temporary failure, please try again later.
Connection closed by foreign host.
レスポンス 451 Temporary failure, please try again later. を返し,送信元の MTA に再送を促します.
デフォルトでは 25分以上4時間未満に再送された場合は正常に受け取り,以後36日間は,送信元の IP アドレスが whitelist に追加されます.
これは,spammer が,正常にメイルが送れなかった場合,再送しない特性を利用しています.正常な MTA であれば,再送処理を行うので,ham メイルは受け取れるのです.
whitelist からの接続の場合,spamd は介さず,直接 MTA がパケットを受け取ります.
spammer は,Webサイトなどを巡回し,メイルアドレスを集めています.そこで,Webサイトにダミーのメイルアドレスを記述しておき,このアドレス宛にメイルを送ってきた場合,自動的に blacklist に追加します.
ダミーのアドレスは,自分の管理するドメインで,存在しないアドレスを使います.(例えば honeypot@bitcoffee.com など)
これを,spamdb コマンドで,SPAMTRAP用のアドレスとして設定しておきます.また,Webサイトに,こっそり記述しておきます.(色を背景と同色にする,サイズを小さくする,スタイルシートで見えなく設定するなど)
kakuo@TOJO /home/kakuo% spamdb -T -a "<honeypot@bitcoffee.com>"[CRLF]
SPAMTRAP は上記 greylist と併せて使うと効果が上がります.