SPAMとの戦い | 雲の上はいつも青空

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

昨今の電子メール取り巻く状況は、とにかく酷いもので、流れているメールの8割がSPAMメール、もしくはこのようなジャンクメールに対するバウンスメール(メールサーバから自動応答されるメール)になっています。
このSPAMに対する対策にはいろんなやり方があるのですが、今回は簡単に実装できて思った以上に効果がある… つまり、コストパフォーマンスが高いstarpitという方式について書いてみます。

スパム対策技術に詳しくやり方について書いてあります。
また、私が採用したstarpitを発展させたRgrey - S25R + greylistingという方法もあるようです。

それではstarpitというのはどういう技術かというと、
----
1.postfixが稼動しているメールサーバ上で実行されます。
2.特別なプログラムは必要ありません。
3.SPAMの検出率は93%程度(上記の佐藤さんのサイトでは)
4.メールサーバには殆ど負荷は掛からない。
----
と、結構いいことづくめのようですがメールサーバの運用がちゃんとできる人がやらないと、いろいろと弊害が出るので注意が必要です。

次に、starpitを動かす環境(条件)は、postfixのバージョンが2.3以上であること!
これだけです。
qmailやsendmailでも出来るようですが、私が動かしているサーバの環境(2009/01/27現在)は、
debian GNU/4.0 Linux etch
kernel 2.6.18-6
postfix 2.3.8-2+etch1
で、動かしています。

基本的には、S25Rのフィルター条件にあてはまるものに対して、指定時間応答を遅らせています。
具体的には、postfixのmain.cfの中の以下の部分です。
smtpd_client_restrictions = permit_mynetworks,
check_client_access regexp:/etc/postfix/white_list.txt,
check_client_access regexp:/etc/postfix/white_list,
check_client_access regexp:/etc/postfix/warn_client,
check_client_access regexp:/etc/postfix/tarpit_client,
permit

permit_mynetworksの次の2行はファイル名の通り、ホワイトリストです。
S25Rのフィルタルールに引っかかるが正規のメールサーバの場合には、ここに記載して下さい。

次のwarn_clientとtarpit_clientは、ルール自体は同じです。
# cat /etc/postfix/warn_client
/^unknown$/ WARN
/^[^\.]*[0-9][^0-9\.]+[0-9]/ WARN
/^[^\.]*[0-9]{5}/ WARN
/^([^\.]+\.)?[0-9][^\.]*\.[^\.]+\..+\.[a-z]/ WARN
/^[^\.]*[0-9]\.[^\.]*[0-9]-[0-9]/ WARN
/^[^\.]*[0-9]\.[^\.]*[0-9]\.[^\.]+\..+\./ WARN
/^(dhcp|dialup|ppp|adsl|dynamicIP|pool|DSL)[^\.]*[0-9]/ WARN

# cat /etc/postfix/tarpit_client
/^unknown$/ sleep 125
/^[^\.]*[0-9][^0-9\.]+[0-9]/ sleep 125
/^[^\.]*[0-9]{5}/ sleep 125
/^([^\.]+\.)?[0-9][^\.]*\.[^\.]+\..+\.[a-z]/ sleep 125
/^[^\.]*[0-9]\.[^\.]*[0-9]-[0-9]/ sleep 125
/^[^\.]*[0-9]\.[^\.]*[0-9]\.[^\.]+\..+\./ sleep 125
/^(dhcp|dialup|ppp|adsl|dynamic|pool|DSL|dsl)[^\.]*[0-9]/ sleep 125

これは実際の応答遅延の処理はtarpit_clientで実行されますが、このままだと後でログを見たときに、starpitのフィルターではじかれたかどうかが解らないため、ログに記録するようにwarn_clientを走らせます。

※ログにはこんな感じで記録されます。
Oct 30 17:18:01 rickdom postfix/smtpd[10116]: NOQUEUE: warn: CONNECT from unknown[88.238.15.231]: ; proto=SMTP

尚、SMTPでは応答のTime outは5分となっているので、ちゃんと設定されているメールサーバであれば、125秒の応答遅延を行っても、本来正常に通信が行われます。 それに対し、スパマーが使うメールサーバでは、なるべく多くの相手にSPAMメールを送る事が要求されるため、starpitのように応答遅延が行われると、125秒も待たず相手側(スパマー側)から接続を切ってきます。

smtpのタイムアウトについては、RFC2821の4.5.3.2 Timeoutsを見てください。
詳しく載っています。


■starpitを設定した場合、他の注意点

postfixの機能であるsleepを使っていますが、このsleepという機能は単に指定時間寝てるだけなので、寝てる間に相手がコネクションを切っても、タスクとしては存在し続けます。
これは、単純にtime waitしているコネクション=タスクの数が増えることを意味しますが、postfixのデフォルト設定では接続待ちのタスクは最大100となっています。

この設定値だとちょっと足りない場合がありますので、ここを増やします。
ただし、メモリー見合いなのでむやみに増やしてはいけません(たぶん200くらいが適当かな?)。
# cat /etc/postfix/master.cf   ↓は内容の一部
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (50)
# ==========================================================================
#smtp inet n - n - - smtpd
smtp inet n - n - 200 smtpd

このようにデフォルト設定をコメントアウトし、プロセスの最大数を200に設定して下さい。

これで、S25Rというフィルターに引っかかった接続元には、応答遅延を行うというstarpitが働きます。
logwatchとかを走らせておけば解るのですが、このstarpitでも結構なSPAMやウィルスメールをはじいてくれます。

実は、該当となるメールサーバでsmtp認証とかやっていると、ちょっと問題がでるのでその対応策については、また別項で書くことにします。


2009/03/03 追記
starpitの設定で、大切な事を書き忘れていました。
smtpd_delay_reject = no
という一文を必ずmain.cfに書き加えてください。
これがないと、各種フィルターの動作が遅延するのでセッション成立時にtarpitの動作をしません。