スパム対策技術 S25Rについて

S25Rとは何か?

S25Rとは、Selective SMTP(25) Rejectionというスパム対策技術の一つです。これは浅見秀雄さんという方が論文の形で2004年に公開した技術で、その詳細は阻止率99%のスパム対策方式の研究報告― Selective SMTP Rejection (S25R)方式 ―にあります。

S25Rのコンセプト

まず、このスパム対策技術のキーコンセプトは、スパムを送ろうとするサーバーからのSMTP接続そのものを拒否する、ということです。スパムフィルターがスパムを受け取ってからコンテンツを調べて判断するのに対して、S25Rは受け取る前に判断し、拒否するのです。このアイデアは非常に理にかなっています。スパムを受け取る前にSMTP接続そのものを拒否できれば、サーバーのリソースが守れるからです。

どうやって判断するのか?

詳細は上記リンク先に譲りますが、要はスパムを送るような怪しいサーバーのホスト名のパターンをルール化し、それにマッチしたサーバーからのアクセスを拒否するのです。そんなルールがあるのか?とお思いの方もいらっしゃるでしょうが、スパムを送るようなサーバーにはある程度の共通点があるのです。例えば、逆引きができない不良サーバーだったり、いかにも動的IPアドレスにありそうなホスト名が振られていたり。そのパターンを見事にルール化したものが、S25Rなのです。

Greylistingを組み合わせる

S25Rはその名の通り、SMTP接続を拒否するためのルールです。しかし、実際に拒否してしまうと、不都合なこともあります。S25Rに引っかかったサーバーからの送信が、必ずしもスパムというわけではないので、ホワイトリスト以外の救済策がないと、かなり極端な運用方法になってしまいます。

そこでGreylistを併用するのです。Greylistingとはご存知の通り、SMTP接続をしてきた相手サーバーに対しTemporary Error(450)の応答を返し、リトライを促す運用方法です。これは相手がまともなサーバーなら一定時間後にきちんとリトライをしてくれるが、スパム用のサーバーならすぐに諦めてしまうことも多い、という経験則に基づいています。これをS25Rに引っかかった相手サーバーに対してのみ適用するのです。

これにより、次のような運用方法が実現します。

  1. SMTP接続を受けた時、ホストを逆引きし、S25Rのパターンマッチングにかける
  2. S25Rにかからなかったら、SMTP接続を受け、そのままメールを受け取る
  3. S25Rにかかったら、Temp Errorの応答を返し、リトライを促す
  4. あまりに短い時間で送信を繰り返したサーバーには、再度Temp Errorを返す。
  5. 一定時間後に再接続して来たものに関しては接続を受け付ける

S25RにかかったサーバーのみをGreylistingすることにより、善良と思われるサーバーからのメールは遅延せず、また、仮にS25Rにかかったとしても、その後のリトライが通常通りなら、一定時間の遅延のみで受け取ることができます。運用方法としてはS25Rの良さを活かしつつ、現実的なものになっていると言えると思います。

S25R + Greylistingをqmailで動かす

用意するもの

まずパッチとqgreylist本体をダウンロードして展開
パッチを当てて所定の場所に置く

wget http://www.jonatkins.com/qgreylist/qgreylist-0.3.tar.gz tar -zxf qgreylist-0.3.tar.gz wget k2net.hakuba.jp/pub/qgrey-0.1-0.3.tar.gz tar -zxf qgrey-0.1-0.3.tar.gz cp qgrey-0.1-0.3/qgrey.patch qgreylist cd qgreylist patch < qgrey.patch su mkdir /var/qmail/greylist chown qmaild /var/qmail/greylist cp greylist /var/qmail/bin/ cd qgrey-0.1-0.3 cp s25r /var/qmail

さて、ここから運用上の調整をします。
まず、ログを取るために以下の変更を加えます。

#use Sys::Syslog;use Sys::Syslog qw(:DEFAULT setlogsock); setlogsock('unix');

それから、greylistを編集し、パラメーターをセットします。

my $greytime = 60 * 60

$greytimeはgreylistに置いておく時間です。
この間は再送信されても受け付けず、too soonと突っ返します。
デフォルトは2分になっていましたが、Greylisting:Whitepaperを参考にし、60分にしました。

my $maxageonce = 3 * 60 * 60;

これは初めてIPアドレスを見てから再送信要求を受け付ける時間。
実際は、$maxageonce - $greytimeがその時間で、これをウィンドウと言います。
この場合のウィンドウは3-1=2時間ということになります。

後は適宜運用の様子を見ながら調整してください。

起動スクリプトにgreylistを入れて起動すれば完了。
忘れてならないのは、tcpserverの起動オプションで-Hではなく-hとすること。
これをしないと逆引きしませんので。

/usr/local/bin/envdir /etc/relay-ctrl \ /usr/local/bin/relay-ctrl-chdir \ /usr/local/bin/tcpserver -R -h -v -u 82 -g 81 -x \ /var/qmail/relay-ctrl/tcp.smtp.cdb 0 smtp \ /usr/local/bin/relay-ctrl-check /var/qmail/bin/greylist \ /var/qmail/bin/qmail-smtpd 2>&1 | \ /var/qmail/bin/splogger smtpd &

以上です。