milter-greylist の Tarpit 機能

長らく、バージョンアップが無かった milter-greylist ですが、10/11 に Ver. 4.4 がリリースされ*1、長い間、開発版扱いだった Ver 4.3 系に実装された機能が、リリース版となりました。

milter-greylist の Tarpit 機能は、milter-manager の開発に携わっている、株式会社クリアコードの須藤功平さんが作成したパッチで、Ver. 4.3.4 でマージされました*2。その機能が、リリース版で使えるようになった、ということで、実際に動作を確認してみました。

Tarpitting とは

語源は「tar pit」で、日本語に訳すと「タール抗」で、タール状の物が貯まっているようなところを指すようです。

spam 対策での Tarpitting は、送信相手に対して、わざとレスポンスを遅らせます。送信相手が普通のサーバであれば、分単位でレスポンスが返ってこなくても、コネクションが切られるような事はありません。

しかし、spammer の立場に立つと、できるだけ多くのメールを送信したい訳ですから、そんなレスポンスの遅いサーバへの送信はさっさと打ち切って、次の宛先へ送信した方が良い、ということになります。

一般的な Greylisting では、SMTP のレスポンスでステータスを一時エラーとして、「再送してくるか?」を確認するのに対し、遅いレスポンスに対して「待ちきれるかどうか?」を試すのが Tarpitting です。

milter-greylist で Tarpitting

前項の最後に書いたように、「相手がまっとうだったら、こうなるはず」という事を実際に試して様子を見る、という点では Greylisting も Tarpitting も同じです。なので、Tarpitting 単独での挙動は、下記のようになります。

  1. 相手からの要求に対して、一定時間、一切の応答を返さない。
  2. もし、相手がコネクションを切断する事無く、応答を待つ事ができれば、その先の処理は通常通り。
  3. 我慢できずに切断すれば、そこでおしまい。

milter-greylist で Tarpitting を行う時に、こういった挙動をさせるには、greylist.conf に次のように書きます。

racl whitelist tarpit 90s

上記の例では、90 秒後に応答を返すようにして、これに耐えられたら whitelist、つまり、受信・中継を許可する、ということになります。

ここまでは普通の Tarpitting なのですが、問題は途中で切断した時です。

Greylisting のような Tarpitting

途中で切断し、再度、同じ相手から同じ宛先へのメールがあったとします。この場合、tarpit を指定した ACL の行が、あたかも存在していなかったような挙動になります。この事は、須藤さんがパッチを送った時のメールにも説明されています。
[PATCH] tarpit support

This ACL means that clients that can wait a response in
65s are whitelisted. If the clients access again, they are
acceptted without lazy response because they are in
auto-whitelist.

If clients that couldn't wait a lazy response access again,
the ACL doesn't match.

「この ACL は、65 秒*3間、応答を待つ事ができたクライアントは、ホワイトリスト扱いとなる事を意味します。そのクライアントが再度アクセスしてきた場合、自動ホワイトリストに入っているので、待たされることなく受理されます。
もし、待ちきれなかったクライアントが再度アクセスしてきた場合、この ACL にマッチしません。」

つまり、きちんと待てたクライアントはホワイトリスト扱いで、かつ、自動ホワイトリストに入って、以後、待たされずに受理されますが、待てずに切って、再度接続してきた場合、tarpit を書いた ACL の行は、条件として引っかからず、その ACL より後に記述された内容に、判断がゆだねられる事になります。

下手すると spammer の方が有利

この挙動を考えると、「tarpit」の ACL は注意が必要です。「racl whitelist tarpit 90s」と書くと、辛抱強く待っていた相手が救われて、途中で切ってしまうせっかちな相手は拒否されるように思えますが、もし、

racl whitelist tarpit 90s
racl whitelist default

と書かれていたら、数秒で反応が無いと判断してコネクションを切断し、再接続した方が、辛抱強く 90 秒間待っていたより、少ないペナルティで配送されることになります。普通に Greylisting していても、ひたすら再送信を繰り返して、自動ホワイトリスト入りする相手がいますので、これでは下手すると、spammer の方が有利になってしまいます。

tarpit の後ろは大きなペナルティ

tarpit の直後の ACL は、Tarpitting に耐えられない相手に対するルールを記述するのが基本になります。もし、Tarpitting に耐えられたのであれば、tarpit を記述した行で配送される事になります。一番、単純な記述だと、下記のようになります。

racl whitelist tarpit 90s
racl blacklist default

これだと、全てのメールに対して 90 秒間の Tarpitting を行い、耐えられた物は配送し、耐えられなかったものは拒否する、という動きになります。

無条件に Tarpitting する場合は、上記のような記述になると思いますが、S25R や DNSBL を使った「条件付き Tarpitting」をする場合には、ペナルティを課す ACL でも同じ条件を与えないと、Tarpitting とは無関係に、その ACL が評価されます。

racl whitelist domain example.com tarpit 90s
racl blacklist default

上記の場合、相手 MTA が example.com だった場合に Tarpitting をして、耐えられなかったら拒否、という挙動になりますが、そもそも、相手が MTA が example.com では無かった場合には、1行目には引っかからずに2行目で引っかかる事になるので、「相手の MTA が example.com 以外は必ず拒否」という事になります。この場合であれば、

racl whitelist domain example.com tarpit 90s
racl blacklist domain example.com

とすべきでしょう。

tarpitting + greylisting

ここまでは、tarpit を指定した行を「whitelist」としていましたが、この代わりに「greylist」と記述することも出来ます。

racl greylist tarpit 90s
racl blacklist default

greylist を指定すると、「Tarpitting に耐えたら greylisting」という挙動になります。つまり、仮に Tarpitting に耐えたとしても、一度目は中継を許可されず、再送されると許可される、という挙動になります。

ただ、ちょっと挙動が微妙です。

一見、最初に Tarpitting に耐えたあとに Greylist 入りして、2度目に許可されそうに思いますが、実際に試すと、許可されるのは3度目でした。

  1. Tarpitting を受けた挙句に、一時エラー。
  2. Tarpitting は無いけど、一時エラー。
  3. 普通に許可

という事になるので、greylist で指定された Tarpitting の場合、相手 MTA の再送間隔の2倍の遅れが発生することになります。

使いどころ

Tarpitting は、ボットネットを使った spam 送信のように、「通常のメールサーバであれば、その様な挙動にならない」という事を基準にしている点は Greylisting と同じです。ただ、milter-greylist の Greylisting では、「しつこく再送してくる」タイプは許可してしまうのに対し、この Tarpitting は、tarpit を書いた ACL の次の行との組み合わせで、より強力なペナルティを科せられる、というのがポイントです。DNSBL などで怪しい物を抽出して Tarpitting してやると、せっかちな相手を確実にブロックする事ができると思います。

ただ、近頃の、特に日本語の spam の場合、普通に国内の固定 IP をもって、普通に MTA のサーバを立てて、しっかり SPF も設定して送ってくる事が多くなってきている印象があります。spam 送信にボットネットを借りるのと、Amazon ECS を借りるのとで金額が違わない、なんて話もあるので、前よりは Greylisting の効果は小さくなってきたかもしれません。

にしても、そんなに儲かるのかなぁ、spam の送信って。

*1:その後、10/19 に Ver. 4.4.1 がリリース

*2:milter-greylist 4.3.4 is available

*3:メールの中に書かれている例では、「tarpit 65s」という記述。