2006-12-06 (Wed)
■[pc][spam]taRgrey - S25R + tarpitting + greylisting

あー、すでにセキュリティホールメモさんに補足されてる…
MLに書くまえにブログでエントリー上げておくべきだった orz
これまでRgreyやStarpitのことで連絡いただいてた方にテスト運用お願いしていたり、postgrey-MLのほうに書いたりしてたので、もう公開してる気持ちでいたんで失敗しました。
taRgreyについて、このエントリーでぼちぼちと情報を追加したり、ご質問やコメントがあれば、ここで答えたいと思います。
taRgreyはスパム対策の手法で、tarpitting(遅延)とgreylisting(再送)を組み合わせることで、それぞれを個別に使ったときより、より誤検出(false positive)を減らすために考案しました。
taRgrey - S25R + tarpitting + greylisting
元々、Rgreyという、S25Rを用いて動的IPっぽいものについてだけgreylistingを掛ける手法を考案したのですが、それでも逆引き出来ない接続先からのメールが遅延するなどの副作用があり、そこでgreylistingの代りにtarpittingを利用したStarpitという手法を考案しました。
しかしStarpitでも、懸賞付きメールマガジンなどが逆引き出来ないIPから出されている場合など、あまり到達性は求めていないようなメールで、false positiveがありました。
また、Starpitではポリシーサーバを利用していなかったため、オートホワイトリストなどが実装されておらず、S25Rにマッチする接続元からのメールは、毎回遅延させられるという問題もありました。
taRgreyでは、それらの問題点を全て解決しています。
これらの流れは下記URLを順に追っていただけるとつかめると思います。
Starpitでほぼ誤検出無く98%のスパムを排除 (S25R+tarpittingによるスパム対策)
Postfix-2.3でsleep中に切断されたらすぐに終了するパッチ
taRgrey(S25R+tarpitting+greylisting)というスパム対策のアイデア
targreyパッチでは、大きく二つの利用方法があります。
- greylistのフィルタにtarpitのフィルタを追加して使い、false negative(スパムメールを誤って通してしまう)を減らす tarpit & greylist モード
- 上記で説明している、tarpitをさらにgreylistを使ってfalse positive(正しいメールを誤まってスパムと判断する)を減らすtaRgreyモードです。
それぞれの動作は、下記の図を見ていただくとわかりやすいかと思います。
Cookieさんのところでは、taRgrey導入方法についてのレポートをいただいています。
インストール方法の参考になると思います。
Birds Of a Feather | taRgreyポリシーサーバ評価中
Lukeさんところでは、"--tarpit=65 --retry-count=2"というオプション指定で、tarpittingとgreylistingどちらも掛け、かつ再送は2回以上行わないと通れない、というfalse negativeを減らす方の運用での結果をレポートしていただいてます。
現在、postgreyでgreylistingの運用されているようなところでは特に参考になると思います。
-Luke's Admin ネタ帳-(2006-12-05)
まっちゃさんところで構成図を書いていただいており、どういう動きをするのか理解しやすくなると思います。
[セキュリティ]taRgrey - S25R + tarpitting + greylisting - まっちゃだいふくの日記★とれんどふりーく★ - 姉の日
まっちゃさんと話して、自分も構成図を書いてみました。
あと、mixiのコミュニティ内のトピックになってしまいますが、
[mixi] SLUG - 信州 Linux Users Group | taRgrey
でフォローしている情報がありますので、参考にどうぞ。
佐世保高専の中原さんからは、各種フィルタでのスパム排除率についてレポートをいただきました。
false positiveの可能性とスパムの排除率とのバランスを考えて、どちらの手法を採用するか決める際に、とても参考になる情報だと思います。
| taRgrey*1 | 96.5%程度 |
| Rgrey | 97.0%程度 (retry-count=2でもほぼ同じ) |
| tarpit&greylist*2 | 98.5%程度 |
この拒否率は、Starpitの説明やtaRgreyの設定例ファイルで利用されている、HELOやNSのブラックリストも併用した場合とのことです。
自分の環境では、以前計測したときにはStarpit≒taRgreyで98%程度の排除率で、それが最近は少し落ちてる感じ(最近増えた画像スパムが、tarpittingを抜けてくるものが多いため)ですから、だいたい同じぐらいの結果になってると思います。
2%のfalse negative減というと少なく感じますが、逆に見るとtarpit&greylistのfalse negative率は1.5%、taRgreyは3.5%と、約2.3倍のスパムがすり抜けてくることになります。
その分でfalse positiveの不安を無くすか、という選択になるでしょう。
(追記)
モーグルとカバとパウダーの日記 - taRgreyのtarpitting時間について
にて、2007/7現在の、遅延時間とその拒否率についてのグラフを公開しています。
この結果から、taRgreyでは現時点で125秒くらいが最適な設定のようです。
(参考)
taRgrey - S25R + tarpitting + greylisting - セキュリティホール memo
[セキュリティ]taRgrey - S25R + tarpitting + greylisting - まっちゃだいふくの日記★とれんどふりーく★ - 姉の日
- http://d.hatena.ne.jp/ripjyr/20061206
- http://d.hatena.ne.jp/ripjyr/00001206
- http://d.hatena.ne.jp/stealthinu/20060728
- http://d.hatena.ne.jp/stealthinu/20060706
- http://d.hatena.ne.jp/bmstz66/20070107
- http://d.hatena.ne.jp/stealthinu/20060916
- http://d.hatena.ne.jp/ripjyr/20070131
- http://d.hatena.ne.jp/ripjyr/20070131
- http://d.hatena.ne.jp/stealthinu/20070630
- http://d.hatena.ne.jp/stealthinu/20070703
- モーグルとカバとパウダーの日記 - Gentooのpostgreyはtargreyにな...
- エンジニアでありたい人の日記 - Rgrey + ウソ EHLO で初の誤爆
- インストール: taRgrey
- 1878 http://k2net.hakuba.jp/targrey/
- 127 http://k2net.hakuba.jp/targrey/index.html
- 115 http://tatsuya.info/wp
- 98 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-46,GGLD:ja&q=モーグル taRgrey
- 47 http://www.google.co.jp/search?q=taRgrey&lr=lang_ja&ie=utf-8&oe=utf-8&rls=org.mozilla:ja:official&client=firefox
- 38 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2005-30,GGLD:ja&q=コブ+滑り方 モーグル
- 31 http://www.google.co.jp/search?q=targrey&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a
- 30 http://www.rimu.info/linux/postfix.html
- 29 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:en-US:official&hs=umF&q=s25r+greylist&btnG=Google+検索&lr=
- 29 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=greylist+HELO&num=50



952行目というのはパッチあてたpostgreyの、ということですか?
確認してみたんですが、ちょうどpostgreyの最後の行だったので、ちょっとtypoなのかなと。
ちなみに、sleepしなかったとのことなので、postfixのバージョンが気になったのですが、postfix-2.3.xを使われてますでしょうか?
postgrey は 1.27、Postfixは2.3.4を使っています。
(sleepパッチも適用済みです)
この状態でうまくtarpitが掛かっています。
targreyモードで動かす場合は、smtpd_recipient_restrictionsと2回呼び出さないといけませんが、そうされてますでしょうか。
smtpd_data_restrictionsから呼ばれた場合は、メールがちゃんと受信された場合だよ、という処理が呼ばれるようになっているので、呼び出し場所が違っているとうまく動かないのです。
sleepで待ってたのがDATAに帰ってきて、そのまま通り抜けてしまう状態でした。
「阻止できてない!!!」と慌てて前の設定に戻して、設定をいじってまたテストの繰り返しも良くなかったようです。
お騒がせしました。
ちなみに、--tarpit=65 --targrey --retry-count=2 のときは
65秒待ち続けた場合メールが通過するという動作でOKですか?
そのオプションの場合targreyモードになりますので、tarpittingを抜けただけで通るということでOKです。
ここで聞いて良いのかわかりませんが、targreyモードで動作
させたとき
-------------------
HELO example.com
250 mail.example.com
MAIL From:<test1@example.com>
250 2.1.0 Ok
RCPT To:<test2@example.com>
250 2.1.5 Ok
RCPT To:<test1@example.com>
450 4.7.1 <test1@example.com>: Recipient addresrejected: Greylisted, see http://isg.ee.ethz.ch/tools/postgrey/help/example.com.html
-------------------
ってなっちゃうのは仕方ないでしょうか?
できれば、通ってほしいのですが。
targreyモードだとそこで通るはずです。
最新パッチだとデフォルトがtarpit&greylistモードになっており、targreyモードにするには--targreyとオプション指定をする必要があります。
このあたりの設定を、一度確認してみていただけないでしょうか?
----------------------
/usr/local/sbin/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=127.0.0.1:10023 --user=postgrey --group=postgrey --dbdir=/var/db/postgrey --tarpit=35 --targrey --retry-count=2 --delay=1800
----------------------
tarpit通らなかったIPはtarpit blacklist入りするので、その後はtarpit掛けずにgreylistに回されます。
RCPT TO後にすぐにgreylistの返答返ってくるようならそれです。
db_dump -p /var/lib/postgrey/tarpit_client とやって、telnetでのテスト掛けてるクライアントIPが入っていないか確認してみてください。
もし入っていたら、一旦dbファイルを削除してしまってpostgreyを再起動してみてから試してみてください。
postgrey の DB 削除、postgreyを再起動 は試しております。
状況としては、(削除・再起動後に) 最初の RCPT To では tarpitting がかかって sleep するのですが、2つ目の RCPT To では即座に 450 が返ってきます。その後、db に格納されてしまいます。
では、postfixの設定main.cfで、smtpd_recipient_restrictionsとsmtpd_data_restrictionsと2回postgreyを呼び出していますが?
smtpd_recipient_restrictionsで一度必ずtarpit blacklistへの登録が行われ、その後smtpd_data_restrictionsで呼び出された場合にはtarpit blacklistから削除、という処理になっていますので、smtpd_data_restrictionsでの呼び出しがないと、2回目は必ずgreylistingへの処理に回されてしまいます。
状況から考えるとこれが一番ありそうなのですが。
設定にしてみましたが、やはり同じ結果になってしまいます。
main.cf
--------------------------------------------
smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
check_client_access regexp:/usr/local/etc/postfix/permit_client_nots25r
check_policy_service inet:127.0.0.1:10023
permit
smtpd_data_restrictions =
permit_mynetworks
check_client_access regexp:/usr/local/etc/postfix/permit_client_nots25r
check_policy_service inet:127.0.0.1:10023
permit
--------------------------------------------
master.cf の smtpd はデフォルトのままでオプションはつけていません。
--------------------------------------------
smtp inet n - n - - smtpd
--------------------------------------------
postgrey --verbose を取るとこうなっていました。
--------------------------------------------
2007/02/06-17:14:34 CONNECT TCP Peer: ”127.0.0.1:59810” Local: ”127.0.0.1:10023”
request age 0
request: ccert_fingerprint= ccert_issuer= ccert_subject= client_address=10.0.31.153 client_name=p031d153.example.com encryption_cipher= encryption_keysize=0 encryption_protocol= etrn_domain= helo_name=example.com instance=6e90.45c838ea.aed97.0 protocol_name=SMTP protocol_state=RCPT queue_id= recipient=test2@example.com recipient_count=0 request=smtpd_access_policy reverse_client_name=p031d153.example.com sender=test1@example.com size=0 action=SLEEP 35
request age 0
request: ccert_fingerprint= ccert_issuer= ccert_subject= client_address=10.0.31.153 client_name=p031d153.example.com encryption_cipher= encryption_keysize=0 encryption_protocol= etrn_domain= helo_name=example.com instance=6e90.45c838ea.aed97.0 protocol_name=SMTP protocol_state=RCPT queue_id=1AD0E130C5E recipient=test1@example.com recipient_count=0 request=smtpd_access_policy reverse_client_name=p031d153.example.com sender=test1@example.com size=0 action=DEFER_IF_PERMIT Greylisted, see http://isg.ee.ethz.ch/tools/postgrey/help/example.com.html
--------------------------------------------
他にはpostgreyのログは出て無かったとすると、protocol_state=RCPTですから、smtpd_recipient_restrictionsからしかpostgreyを呼び出してないように見えます。
smtpd_data_restrictionsで単にcheck_policy_service呼んでもこういうログになりますでしょうか?
DATAコマンドを受け取った時では?
RCPT TOが複数行ある場合なんですね。
確かにこれはダメだわ。うーん、さてさてどうしたもんだろう。
Nomyaさん、これは自分が勘違いしてました。この場合はNomyaさんの望まれるような動きにはなりません。
なにかうまい解決法がないか、考えて見ます。
通りすがりさん、おかげで問題点がわかりました。ありがとうございます。
ただ、そういう構成にするにはpostgreyへの変更点も大きくなるので、作るのにちょっと時間掛かるので今すぐには出来ないという感じです。
postgreyベースではなく、policydベースでtargrey実装を考えているので、そちらのほうだけでやるかもしれません。
white list のメンテナンスをすることで回避します。
(サボれるとうれしかったのですが。)
policyd ベースでの targrey 期待しております。
ただそれまでは再送要求出してしまうので、ホワイトリスに入れたほうがベターだとは思います。
あとよろしければ、Nomyaさんのメールアドレスを私のアドレス宛に教えていただけませんでしょうか?
今後改善策を実装した場合にご連絡させていただきたいと思いますので。
さて、postgrey が 2007/6 に 1.28 にバージョンアップされていますが、こちらに対応した patch はございますでしょうか?
どうぞ、今後もよろしくお願いします。
で、まだ1.28でのテストしてなかったので、試してみたんですがpatchあたらないですね。
とりあえず手でパッチ当てたものを作ってみましたが、まだ未テストなのでうちのサーバで動かしてみて、ある程度ちゃんと動くようだったら公開します。
もし、そういう不安定版でもよろしければお送りしますので、メールいただけないでしょうか?テストしていただけると嬉しいです。
satoh+hatena にメールさせていただきます。
当方、1日200〜300通程度の小規模メールサーバーですが、それでもよろしければ、ご協力させてください。
とりあえずまだ、パッチ当てただけで動かしてないので、再度ソース見直して、テストサーバで動かしてみた段階でお送りします。
現状、稼働テスト期間ゼロなので、そちらでもいったんテストサーバで動かしてみてからお試しいただくようお勧めします。
テストサーバーを用意しておきますのでよろしくお願いします。
s25r ルールを抜けたホストのうち、EHLO が Yahoo! や Nifty.com などのうそ臭いヤツを弾くルールを後段に入れていたため、誤爆してしまいました ^^;)。自業自得ですが回避するために s25r ルールの頭の方で .google.com を OK にしました。他の方の参考になれば幸いです。
自分のホワイトリストもその辺入れてあります。
さて、S25R のルール1とルール6が変更になっております。
taRgrey の設定例も変更された方がよろしいかと。
うちにもメール来てました。IPv6関連ですね。
変更したいと思います。
taRgreyを勉強させてもらっています。
教えていただきたいのですが、tarpitを通りぬけた相手からの
2回目の送信メールに X-Greylist ヘッダーが前のメールとの
間隔分 delay があったように付加されます
初めてtarpitまたはgreylistを通りぬけた時に
X-Greylist ヘッダーが付くようにならないのですが
どこかの設定を変更すれば可能でしょうか?
また、BerkeleyDBよりMySQLの方が身近なのですが
SQLgrey で taRgrey が使えたらとっても嬉しいのですけど
そんなお願いは無理ですか?
よろしくお願いします。
上のコメントで出ているように、他にも改善したい点があるんですがずっとやってなくて、これも一緒に改善したいと思います。
あとSQLgreyですが、自分もそれ考えてました。
postgreyだとタイムアウトしたものをDBから掃除するときに、反応が無くなるという問題があって、SQLgreyのほうが良いのですよね。
ただ、postgreyのテストバージョンがSQLgreyと同じく、SQL対応になっているため、それ待ちと思ってたのですが、それがなかなか出てくれなくて…
あと、milter-greylistにtargreyモード付けたいなとかもあるんですが、どれから手を付けようという感じです。
X-Greylist ヘッダーの件わかりました。
postgrey-2.0alpha1もmilter-greylistもSQLite対応みたいですけど
SQLiteでは複数サーバから使えないんですよね
セカンダリMXでの再送をカバーするために
MySQLで使えるのが理想的だと思ったんです。
データ内容もphpMyAdminでお手軽にみれるし
是非SQLgreyを何卒よろしくお願いします。
自分は我流で覚えたPHPしかプログラムを書けないので
あまり役には立たないかもしれませんが
お手伝いできることがあれば出来る限りの事はしたいと思っています
持っているグローバルIPアドレスに余裕がありますので
専用テストサーバーの提供やプログラムのテストなどは出来ると
思っています、よろしくお願いします。
でもたぶんpostgrey-2.0もSQLiteだけじゃなくて、ふつーにSQL扱うものだったら、だいたい対応できるんじゃないかと。DBI経由してるでしょうから。
とりあえず、新たなコード書きましたら、たぶんブログで書くのでそれ見ていただくか、もしよろしければ、プロフィールの欄にアドレスありますのでメールいただけると、なにか新規のもの作った時ご連絡させていただきます。
MySQL他にも対応できるんですね。
しばらくはBerkeleyDBでinet:192.168.0.20:10023として
複数サーバでのテスト運用をして見ます。
ありがとうございました、メール送らせて頂きます。
BerkeleyDBのデータをコマンドで追加、削除できるツールが
あれば便利ですね、ありそうなのに見つけられませんでした。
BerkeleyDBのデータ追加削除簡単に出来るのって、自分も知りません。
Perlでちょこっと書いてそれでテストしてました。
当面SQLの使えるもので Rgreyとして引き続き勉強させて頂きます。
ありがとうございました。