最近スパムが多くて、良いスパム対策はないかと物色。
で、なんか売り文句によると99%のスパムメール撲滅できるというものが。
基本的なコンセプトはこちらに詳しく書いてある。
- メールサーバがメール中継サーバからのSMTPアクセスは受け入れるがエンドユーザーコンピュータからの直接のSMTPアクセスは拒絶するという単純なもの
- SMTPアクセスをかけてきたクライアントのFQDNの特徴に基づいて、クライアントがメール中継サーバか、エンドユーザー回線につながったコンピュータかを推定することができる
- うまく管理されているメール中継サーバのほとんどは、逆引きで得られるFQDNを持つ。逆引きFQDNのないIPアドレスからのSMTPアクセスは、少しの例外を除いて拒絶すればよい。
- 正規表現を使うことによって、エンドユーザー用回線の逆引きFQDNとメール中継サーバの逆引きFQDNを区別する
- メールサーバがこれらの規則によってSMTPアクセスを拒絶する時は、「後で再試行せよ」を意味する応答コード「450」を 返すべきである。そうすれば、これらの規則のいずれかに引っかかる正当なメール中継サーバを、後で述べるホワイトリスト(許可リスト)を作ることによって 救済することができる。
- HELOコマンドが宛先サーバのIPアドレスまたは受信者のドメイン名を通知している
- 送信者ドメインの検索失敗
- 内容の検査
なるほどね。
エンドユーザ回線を拒絶するのはでかそうだ。
この方式をS25R(Selective SMTP Rejection)方式というそうだ。
そして、この方式とは別にGreylistingという方式がある。
Greylistingは簡単に言えば、再送要求を一旦返して、ちゃんと再送してきたものを受け取る方式。
S25RとGreylistingを組み合わせた方式がRgrey方式として紹介されている。
また、意図的な応答遅延を行うことで配送タイムアウトが通常のMTAよりも速いものを切り落とすtarpittingという方式もある。
これは、通常、スパム業者は大量のメールを配送する関係から、応答の遅いMTAには配送を早々とあきらめるよう設定されていることが多いことを利用したもの。
S25R+tarpittingによる、Starpitという手法も紹介されている。
そして、全部ごった煮のパターン、S25R + tarpiptting + Greylistingを組み合わせたtaRgrey方式が紹介されていた。
taRgrey方式の簡単な説明は以下の通り。
taRgreyとは、メールサーバ上でスパムやウイルスメールを排除するためのフィルタの手法で、 S25Rとtarpittingとgreylistingというスパム判定手法を組み合わせて使うというものです。
S25Rにより、動的IPっぽいFQDNからの接続からは怪しいと判断し、tarpitting(応答の遅延)を行います。tarpittingを待ちき れずに送信元が接続を切った後、再度送ってきた場合にはgreylisting(再送のチェック)により救済します。S25Rとtarpittingと greylistingと、全てのフィルタを抜けれなかったものだけがスパムとして排除されます。
さて、じゃあtaRgrey方式で、といきたいところだが、ここにかかれている方法はパッチを当てなければならない。
aptでパッケージ管理している関係上、できるだけdebian非公式パッチは当てたくない。
なので、パッチを使わないで実装する方向とする。
ということでどこでチェックしようかpostfixの設定を眺めることしばらく。
smtpd_recipient_restrictionsでやるのがいいかなあ、という結論。
PostfixでのGreylistingはpostgreyを使う。
ホワイトリストは許可して、S25R方式で怪しい奴らにgreylistingをかける。
それを通ったものにはtarpittingをかける。
という流れにする。
postgreyをインストール。
# aptitude install postgrey
/etc/default/postgrey POSTGREY_OPTS="--inet=127.0.0.1:10023"
127.0.0.1をつけないとipv6でbindしてた。
いや別にいいんだけど。
main.cf smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_client_access regexp:$config_directory/white-list.txt, check_client_access regexp:$config_directory/permit_client_nots25r, check_policy_service inet:127.0.0.1:10023, check_client_access regexp:$config_directory/tarpitting, permit
white-list.txt http://www.gabacho-net.jp/anti-spam/white-list.txtのものを使用
permit_client_nots25r /.(internetdsl|adsl|sdi).tpnet.pl$/ WARN /^user.+.mindspring.com$/ WARN /^[0-9a-f]{8}.(.+.)?virtua.com.br$/ WARN /.catv.broadband.hu$/ WARN /[0-9a-f]{4}.[a-z]+.pppool.de$/ WARN /.dip[0-9]+.t-ipconnect.de$/ WARN /.dip.t-dialin.net$/ WARN /.dyn.optonline.net$/ WARN /.(adsl|cable).wanadoo.nl$/ WARN /.ipt.aol.com$/ WARN !/(^unknown$)|(^[^.]*[0-9][^0-9.]+[0-9].*.)|(^[^.]*[0-9]{5})|(^([^.]+.)?[0-9][^.]*.[^.]+..+.[a-z])|(^[^.]*[0-9].[^.]*[0-9]-[0-9])|(^[^.]*[0-9].[^.]*[0-9].[^.]+..+.)|(^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9])/ OK /./ WARN
tarpitting /./ sleep 65
main.cfでのsmtpd_recipient_restrictionsで基本的な認可のあとに
ホワイトリストによる認証(check_client_access regexp:$config_directory/white-list.txt)
S25RでOKなものの認可(check_client_access regexp:$config_directory/permit_client_nots25r)
微妙なやつらをpostgreyでgreylistチェック(check_policy_service inet:127.0.0.1:10023)
それも抜けたのはtarpitting(check_client_access regexp:$config_directory/tarpitting)
という感じ。
設定してからしばらくログ眺めてたけど良い感じでスパムをブロックしてくれている。
SPFの設定もしようかと思ったけど、あっちは転送時にfailしたりしちゃうことがあるみたいだから、とりあえず今回はやめておいた。
postfix-policyd-spfパッケージ入れてちょいちょいいじれば使えそうなんだけどね。