グレーリスト法[1]の概念は、 Evan Harris の白書で提示されている: http://projects.puremagic.com/greylisting/。
SMTPトランザクションの遅延に似て、グレーリスト法は単純だが、 ラットウェアを介して配送されてくるメッセージを極めて効果的に取り除ける機構である。考え方は、 メッセージの送り手と受け手の間に以前も結びつきが存在していたかどうかを確認する、 というものだ。多くの真っ当なメールはそう確認でき、配送は正常に進む。
いっぼう、以前に結びつきが存在しなければ、 配送を一時的に (451 SMTP応答で) 拒否する。 真っ当なMTAであればこの応答を適切に扱い、 すこし後に配送を再試行する[2]。いっぽうラットウェアは、すぐに配送の試みを繰り返すか、 あるいは簡単に諦めてしまってアドレスリストのつぎのアドレスに照準を移す。
配送の試みから3点の情報を取り出す。これを三つ組と呼び、 送り手と受け手の間の関連を一意に識別するのに使う:
送信側のホストのIPアドレス。
配送の試みを一時的に拒否したときに、この三つ組をキャッシュする。 これをまずグレーリストに入れる。 決められた時間 (1時間としよう) が経った後に 新たに配送の試みがあれば受け付け、三つ組をホワイトリストへ移す。 ただし、決められた期限切れ (4時間としよう) までに新たな配送の試みがなければ、 三つ組をキャッシュから消す。
ホワイトリストに入った三つ組がさらに長い期間 (月次の支払明細のようなものを考慮して、最低でも1ヶ月) 現れなかったときは、消す。これで、リストが無制限に膨らむのを防げる。
この3種の期限切れは Evan Harris の元々のグレーリスト法白書 (いや、"灰書" と言うべきかな) から取った。 ある人によれば、グレーリストに入れた三つ組を消すまでの期限切れを もっと長くする必要があり得る。なぜならISPによっては (たとえば earthlink.net)、 配送の再試行を6時間くらいごとにしかしないからだ[3][4]。
複数の受入用メール交換機を運用していて、 それぞれの交換機が別々のグレーリスト法キャッシュを持っているとする。すると:
理論上は、ある送信者からユーザへの初回の配送は 最初の1時間の遅延の N 倍だけ遅れることになる。 N はメール交換機の数である。 理由は、メッセージの再送は 始めの配送で 451 応答したサーバとは 別のサーバに対して起こりやすいためだ。 最悪の場合、送信者ホストが最初の交換機へ配送を再試行しに戻ってくるまでに 4時間では間に合わなかったり、 グレーリストに入った三つ組が消えてからになったりする。 このため、配送の試みは幾度も繰り返し拒否されることになり、 送信者ホストが諦めるまで続く (普通は4日くらいかかる)。
実際問題、これは好ましくない。送信者ホストは通常、 配送の試みが一時的に失敗したら即座に別のMXを使って配送を再試行する。 だから、1時間後にはどのMXホストでもメッセージを受け入れるべきだ。
三つ組がMXのどれか一つでホワイトリストに入った後でも、 同じ三つ組の別のメッセージが別のMXに配送されると、 そこではグレーリストに入ってしまう。
このような理由から、 受入用メール交換機同士で グレーリストに入る三つ組のデータベースを共有できるように実装すべきだろう。 しかし、このデータベースを持っている計算機が唯一の弱点になってしまうので、 その計算機が落ちてもうまく動作する (例えば、全ての配送を受け付けるようにする、など) ようにしておくべきだろう。 あるいは、データベース複製のテクニックを使って、 SMTPサーバが検索のときに替わりの複製サーバを見にいくようにもできるかもしれない。
私自身の経験では、グレーリスト法は 不要メール配送数のおよそ 90% を止めることができる。 もちろん、すでに説明したさまざまなSMTPでの検査を 適用した上でのことだ。 グレーリスト法を最初の防衛線にすれば、 外部から来る不要メールをさらに高い率で捕らえてくれそうだ。
逆に、 このテクニックによる偽陽性は、実質的にゼロである。 主要なメール転送エージェントは全て、一時的な失敗の後に配送の再試行を実施する。 このため、いつかは配送に成功するのだ。
グレーリスト法の欠点は、 真っ当なメールであっても 特定の受信者に対して過去に電子メールを送ったことのない人からのものなら 1時間の遅延 (複数のMXホストを運用していれば複数時間) を受ける、という点だ。
スパム送信者が適応してきたら... も見てほしい。
| [1] | [訳注] greylisting。 |
| [2] | まれなことだが、"真っ当な" バルクメール送信者 (groups.yahoo.com のような) の中には、 一時的に失敗した配送を再試行しないものもある。 Evan Harris がこういう送信者の一覧をまとめているので、 この方式の適用外にする目的に使える: http://cvs.puremagic.com/viewcvs/greylisting/schema/whitelist_ip.txt?view=markup。 |
| [3] | 大規模なサイトによくあることだが、 外部へ行くメールを複数のサーバで扱っていることがある。 例えば、一つあるいはいくつかのサーバだけを即時の配送につかっていることがある。 このようなサイトでは、最初の配送の試みが失敗すると メールを大きな待ち行列を扱えるように調整された予備サーバに渡す。 このため、このようなサイトから来るメールでは、 最初の2回の配送の試みが失敗することになろう。 |
| [4] | [訳注] 実際のグレーリスト法の実装では、一時的に失敗させる期間をもっと短く (例えば300秒程度) とっているものが多い。多くのMTAで、 一時的な失敗の後に再送を開始するまでの時間は1時間より短く (例えば qmail では400秒、Postfix では既定で1000秒)、 その後は再送の間隔を延ばしていく。 いっぽう、一時的に失敗させる期間をあまり長くすると、 送信者に再試行中であることを知らせる配送状況通知を送る (だいたい数時間後) よう設定されている送信者サイトでは、真っ当な送信者を困惑させるかもしれない。 現在存在するグレーリスト法の実装などの情報については、 http://www.greylisting.org/ を参照。 グレーリスト法に似ているがより簡易な方式として、 三つ組の代わりにクライアントのIPアドレスだけを用いるお馴染さん方式がある。 |