2006/11/14 (lastupdate 2012/4/18)
taRgreyの前身の手法として、greylistingのみを利用するRgreyや、tarpittingのみを利用するStarpitという手法も提案しています。taRgreyを理解するために、先にこれらの手法について参照しておくと理解しやすくなります。
また、自分のブログのほうで追加情報や質問・コメントなどを受けています。
Rgreyにより、誤検出や副作用の少ない1次フィルタを実現できましたが、さらにStarpitにより誤検出や副作用を減らすことができました。
しかしそれでも特殊な送信元に対して、完全に誤検出を無くすことは出来ませんでした。そこでよりメンテナンスフリーに近づけ、また相手サーバへの余計な負荷を減らす手法を考えました。
Starpitでは遅延を抜けれなかった場合、再送されてきても再度同じだけ遅延が掛かるためやはり抜けることが出来ません。そこで、遅延を抜けられなかったものについては、greylistingと同じ処理をさせて、再送されてきた場合には通す、という処理を行います。
これで、タイムアウト時間を非常に短く設定していて遅延を抜けられない場合でも、再送をしてきた場合にはフィルタを通ることが出来るようになります。
taRgreyの機能を実現するためにはgreylistingのポリシーサーバを利用することになります。greylistingサーバのホワイトリスト機能などを利用することで、ホワイトリスト登録されたものについてはtarpittingによる余計な遅延を掛けることなく、フィルタを抜けることが出来るようになるため、こちらと相手のサーバへの負荷を減らすことができます。
また、tarpittingとgreylistingのどちらも掛けることで、false negativeを減らすtarpit&greylistモードも考えられます。
佐世保高専の中原さんからは、各手法ごとのfalse negative率の比較レポートをいただきました。
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 に対してパッチが適用できることを確認しています。
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
> 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
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の処理に回ります。
# /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=3600targrey-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に指定しています。