土曜日, 10月 21, 2006

無精者の勝利

 2001年3月、sendmailから、設定の楽なPostfixに乗り換えた。
 2001年8月、悪気のない未承諾広告メールを2度送ってきた業者に対して拒絶の意思を伝えようと考え、header_checksパラメータでFromヘッダをチェックしてエラーリターンさせるようにした(今にして思えば、smtpd_sender_restrictionsパラメータを使ってもよかったのだが)。これが私のスパム対策の始まりである。
 2001年10月、同じ文面でFromアドレスを変えたスパムが2通来た。body_checksパラメータで、スパマーが宣伝しようとするウェブサイトのURLを引っかけてエラーリターンさせることを思い付いた。
 その後1年あまり、この方法はうまくいっていた。着信するスパムがあまりに少なくなって、スパム防御策を研究しにくくなって面白くなくなった。そこで、2003年3月、見えないmailtoアンカーにおとりのアドレス(User unknownになる)を書いてホームページに仕掛けた。さっそく引っかかった奴が現れたので楽しかった。
 2003年5月、着信するスパムが急に増え始めた。次々に来るスパムに防御が追い付かなくなった。また、URLに十六進文字符号を混ぜたり、本文全体をBASE64符号化したりするスパムもあった。内容チェックによる防御策に見切りを付けた。
 内容チェックを高度化したベイジアンフィルタという技術があることは知らなかった(そのころすでに一般化していたのかどうか、今も知らない)。根が無精だから、世の中にどんなスパム対策技術があるのかをつぶさに調査することもしなかった。もっとも、もしベイジアンフィルタを知っていても、使いはしなかっただろう。受けてからフィルタリングする方法では、拒絶の意思をスパマーに思い知らせることができない。拒否応答を返さなければ気がすまない。悪人に対してはサディスティックなのである。
 多くのスパムに共通することは何かと観察して、送信元のIPアドレスに着目した。ほとんどのスパムはエンドユーザー回線から直接送信されており、その多くは逆引きできないことがわかった。smtpd_client_restrictionsパラメータを使うことを覚え、「reject_unknown_client」を指定したら効果てきめんだった。また、逆引きできるエンドユーザー回線には逆引き名にIPアドレスを反映したものがかなりあることに気付いた。そこで、ハイフンかドットで区切られた4個の数字列が逆引き名に含まれていたら蹴るように正規表現を書いた。リトライする正当なメールサーバを救済する方法もマスターした。S25R方式の開発はここから始まった。個人サーバだから、思い切った試行錯誤ができた。
 根が無精だから、楽をするためには労苦を惜しまない。たくさんの不正メールアクセスを観察しながら、なるべく多くのエンドユーザー回線を引っかけることができて(つまり、ブラックリスト作成の手間が少ない)、メールサーバを引っかけることがなるべく少ない(つまり、ホワイトリスト作成の手間が少ない)正規表現を作り上げた。この方式でよいと判断したのは、10ヶ月後の2004年3月だった。スパムだけでなくウィルスメールもほとんど阻止できる方式ができ上がった。
 スパマーの立場に立って、S25R方式を破る方法も考えた。少量のスパムなら、ISPのメールサーバを経由するなどして送り込むことができるが、S25R方式の防御を破って大量のスパムを届かせることは、スパム送信コンピュータのリソース負荷が大きくなってきわめて難しいと結論付けた。簡単に破れる方式でも、大量スパムの90%以上を阻止し続けることができれば、それは勝利である。
 私のような無精者が考え付くことはすでに世界の誰かが作っているのではないかと思ったが、不思議なことに、あちこち情報を検索しても見つからなかった。
 もし私がベイジアンフィルタの発明者だったら…。もし私がもっと頭が良くて勤勉で、高度な数学を駆使することができて、内容チェックを高度化する道を突き進んでいたら…。宣伝文を画像化するというあまりにも簡単な方法で破られることに気付かされた時、「ああ、私の今までの努力は何だったのか」と嘆き悲しみ、絶望のあまりに憤死していたに違いない。
 無精者だからできる発明もある。

0 件のコメント: