taRgrey - S25R + tarpitting + greylisting (tarpit + greylist policy server)

K2-net ホームへ

English

2006/11/14 (lastupdate 2012/4/18)

これはなに?

taRgreyとは、メールサーバ上でスパムやウイルスメールを排除するためのフィルタの手法で、 S25Rとtarpittingとgreylistingというスパム判定手法を組み合わせて使うというものです。
S25Rにより、動的IPっぽいFQDNからの接続からは怪しいと判断し、tarpitting(応答の遅延)を行います。tarpittingを待ちきれずに送信元が接続を切った後、再度送ってきた場合にはgreylisting(再送のチェック)により救済します。S25Rとtarpittingとgreylistingと、全てのフィルタを抜けれなかったものだけがスパムとして排除されます。
スパムの検出率を上げることより、正しいメールの誤検出をしないことやフィルタによる副作用を 減らすことを目標として設計されており、原理的にほとんど誤検出無く運用することが出来ます。
そのため、ベイジアンフィルタ等の他のコンテンツフィルタと組み合わせて 1次フィルタとして利用すると有効ですが、これだけでも93%程度の検出率はあります。(2006/7時点)

taRgreyの前身の手法として、greylistingのみを利用するRgreyや、tarpittingのみを利用するStarpitという手法も提案しています。taRgreyを理解するために、先にこれらの手法について参照しておくと理解しやすくなります。

また、自分のブログのほうで追加情報や質問・コメントなどを受けています。

開発動機と内容

Rgreyにより、誤検出や副作用の少ない1次フィルタを実現できましたが、さらにStarpitにより誤検出や副作用を減らすことができました。
しかしそれでも特殊な送信元に対して、完全に誤検出を無くすことは出来ませんでした。そこでよりメンテナンスフリーに近づけ、また相手サーバへの余計な負荷を減らす手法を考えました。

Starpitでは遅延を抜けれなかった場合、再送されてきても再度同じだけ遅延が掛かるためやはり抜けることが出来ません。そこで、遅延を抜けられなかったものについては、greylistingと同じ処理をさせて、再送されてきた場合には通す、という処理を行います。
これで、タイムアウト時間を非常に短く設定していて遅延を抜けられない場合でも、再送をしてきた場合にはフィルタを通ることが出来るようになります。

taRgreyの機能を実現するためにはgreylistingのポリシーサーバを利用することになります。greylistingサーバのホワイトリスト機能などを利用することで、ホワイトリスト登録されたものについてはtarpittingによる余計な遅延を掛けることなく、フィルタを抜けることが出来るようになるため、こちらと相手のサーバへの負荷を減らすことができます。

また、tarpittingとgreylistingのどちらも掛けることで、false negativeを減らすtarpit&greylistモードも考えられます。

佐世保高専の中原さんからは、各手法ごとのfalse negative率の比較レポートをいただきました。

排除率だけみると大差なく感じますが、taRgreyモードはtarpit&greylistモードの2.3倍のスパムがすり抜けることになります。

tarpittingでどの程度の遅延時間を掛けるべきかというパラメータが問題になってきますが、スパマーが切断する遅延時間のログより、taRgreyモードの場合は125秒程度が良いのではないかと考えています。
切断時間とその件数を示したグラフを参照してください。


詳しくは、下記エントリーを参照してください。
Postfix-2.3でsleep中に切断されたらすぐに終了するパッチ
モーグルとカバとパウダーの日記 - taRgreyのtarpitting時間について

taRgrey(greylistingによる救済がある場合)ではなく、tarpittingだけでフィルタを掛ける場合には65秒程度がバランスが良いと思われます。
tarpit&greylistモードには、greylist自体の検出率が高いことと、誤検出の恐れが高くなるため35秒程度が良いのではないかと思います。

またこちらのエントリーにありますように、sleepをかけた時に余計なプロセス増を減らすためのパッチも作成しましたので、必要性に応じて適用してみてください。
2.3.x/2.4.x/2.5.x/2.6.x/2.7.x/2.8.x/2.9.x に対してパッチが適用できることを確認しています。

postfix sleep patch
2.3~2.7向け http://k2net.hakuba.jp/pub/postfix-2.3.3-sleep.patch
2.8向け http://k2net.hakuba.jp/pub/postfix-2.8-sleep.patch
2.9向け http://k2net.hakuba.jp/pub/postfix-2.9-sleep.patch

実装

postfix用

Postfixでtarpitを利用するためには、Postfix-2.3.x以降を利用する必要があります。

postgrey用

postgrey-1.34 向け targrey-0.31-postgrey-1.34.patch (かずひこさんに対応パッチ提供いただきました)
postgrey-1.33 向け targrey-0.31-postgrey-1.33.patch
postgrey-1.32 向け targrey-0.31-postgrey-1.32.patch
postgrey-1.31 向け targrey-0.31-postgrey-1.31.patch
postgrey-1.30 向け targrey-0.31-postgrey-1.30.patch
postgrey-1.28/29 向け targrey-0.31-postgrey-1.28.patch
postgrey-1.27 向け targrey-0.30-postgrey-1.27.patch

0.31パッチでの修正点
0.3パッチでの修正点
targrey-0.23-postgrey-1.27.patch
0.23パッチでの追加される機能
インストール方法
> tar -zxf postgrey-1.27.tar.gz
> patch -p0 < targrey-postgrey.patch
# cp postgrey /usr/local/sbin/postgrey
# cp postgrey_whitelist_* /etc/postfix
# mkdir /var/lib/postgrey
# chown postgrey /var/lib/postgrey
設定
/etc/postfix/main.cf
smtpd_recipient_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_unauth_destination
        ...(whitelist and other filter)
        check_client_access    regexp:$config_directory/permit_client_nots25r
        check_policy_service   inet:60000
        ...
        permit

smtpd_data_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        ...(whitelist)
        check_client_access    regexp:$config_directory/permit_client_nots25r
        check_policy_service   inet:60000
        permit
/etc/postfix/permit_client_nots25r
/\.dip\.t-dialin\.net$/       WARN
/\.dyn\.optonline\.net$/      WARN
...(other dynamic IP FQDN pattern(not match S25R pattern))
!/(^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

smtpd_recipient_restrictionsでの一度目のcheck_policy_serviceでtarpittingを掛け、一旦tarpittingブラックリストに登録されます。
tarpittingを抜けた接続はsmtpd_data_restrictionsまで渡ってくるため、再度check_policy_serviceで呼び出し、tarpittingのブラックリストから削除します。
tarpittingのブラックリストに入っているIPからの接続から再送された場合、tarpittingの処理には回さずに、greylistingの処理に回ります。

postgreyをオプション指定でtaRgreyモードで起動する
targrey-0.30の場合
# /usr/local/sbin/postgrey --dbdir=/var/lib/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=127.0.0.1:60000 --tarpit=125 --targrey --retry-count=2 --delay=3600
targrey-0.27以前の場合
# /usr/local/sbin/postgrey --dbdir=/var/lib/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=127.0.0.1:60000 --tarpit=65 --retry-count=2 --delay=3600

--tarpitオプションで65秒の遅延を掛け、--delayと-retry-countオプションで最初に送信されてから1時間以上の期間あけて再送を、2回されたときのみgreylistingが通るように指定しています。
また、基本的な設定として各種DBファイルの置き場を/var/lib/postgrey以下に、ポリシーサーバの待ち受けポートを6000に指定しています。

設定ファイル例
RgreyとtaRgreyの、Postfixの設定ファイルをまとめたtar.gzファイルを公開していますので、こちらを参考にしてみてください。
ログの出力内容
『黒ぶちメガネのblog | taRgreyのログをまとめてみた』にてtaRgreyのログで、どういう理由の時どういうログが出力されるのかまとめていただきました。転載させていただきます。
postgrey_whitelist_clientsにマッチした場合
action=pass, reason=client whitelist
postgrey_whitelist_recipientsにマッチした場合
action=pass, reason=recipient whitelist
自動でホワイトリストに追加された場合
action=pass, reason=client AWL
遅延を待たずに再送してきた場合
action=greylist, reason=early-retry
新しくgreylistに入った場合
action=greylist, reason=new
データベースの中に遅延後受信に成功した「CLINET_IP」「SENDER」「RECIPIENT」の3セットを見つけた場合
action=pass, reason=triplet found

qmail用

ちっちさんがQgreyベースでtaRgreyが可能になるツールを公開されています。
こちらを参照ください。
s25rtarpitgreylist

履歴

2012/3/22 ログの内容について記述追記
2012/2/24 postfix-2.9向けのsleepパッチ公開
2011/12/19 ログの内容について記述追加
2011/10/19 1.34向けのパッチ公開
2011/3/30 postfix-2.8向けのsleepパッチ公開
2010/7/13 1.33向けのパッチ公開
2009/5/29 sleepパッチのpostfix-2.6での動作確認取れた記述を追記
2009/5/29 S25Rパターンを現バージョンのものに変更
2008/10/22 qmail用のs25rtarpitgreylistへのリンク追加
2008/7/25 postgrey-1.32向けパッチ公開
2008/3/3 設定ファイル例へのリンク追加
2008/2/7 sleepパッチのpostfix-2.5での動作確認取れた記述を追記
2007/12/19 false negativeの率なのに、97&などとなっていたのを3&などに修正
2007/7/31 postgrey-1.28/29向けのパッチを公開
2007/7/10 taRgreyで最適な遅延時間を125秒に修正
2007/4/13 sleepパッチのpostfix-2.4での動作確認取れた記述を追記
2006/12/28 図とtarpit&greylistモード、中原さんのレポート内容について追記
2006/12/7 遅延時間をどうすべきかについて参考エントリー追記
2006/12/6 ブログのほうのエントリー案内
2006/12/5 0.30でオプション指定の方法を変更したの情報へ修正
2006/11/14 taRgreyについての簡単な解説とpostgrey用パッチの公開

連絡先

佐藤 潔 (SATOH Kiyoshi)
http://d.hatena.ne.jp/stealthinu/