モーグルとカバとパウダーの日記 このページをアンテナに追加 RSSフィード Twitter

モーグルやカバ(EXカービングスキー)、山スキー(BC)の山行記録などがメインの日記です。
いろんな条件のいろんなところを、その時々の条件にあった滑り方で楽しむ、フリースキーをして遊んでいます。

検索で来られた方は、上の検索窓から再度検索していただくか、右サイドバーのカテゴリーやトピックスの項目で絞り込んでみてください。
仕事柄、コンピュータ系のネタも多いので、スキー関連ネタだけ読みたい方は[ski]、コンピュータ関連ネタは[pc]、スパム関連ネタは[spam]で絞り込んでください。

2006-12-06 (Wed)

[][]taRgrey - S25R + tarpitting + greylisting taRgrey - S25R + tarpitting + greylistingを含むブックマーク 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を順に追っていただけるとつかめると思います。

Rgrey - S25R + greylisting

Starpitでほぼ誤検出無く98%のスパムを排除 (S25R+tarpittingによるスパム対策)

Postfix-2.3でsleep中に切断されたらすぐに終了するパッチ

RgreyとStarpitの比較

Starpitの課題

taRgrey(S25R+tarpitting+greylisting)というスパム対策のアイデア


targreyパッチでは、大きく二つの利用方法があります。

  • greylistのフィルタにtarpitのフィルタを追加して使い、false negative(スパムメールを誤って通してしまう)を減らす tarpit & greylist モード
  • 上記で説明している、tarpitをさらにgreylistを使ってfalse positive(正しいメールを誤まってスパムと判断する)を減らすtaRgreyモードです。

それぞれの動作は、下記の図を見ていただくとわかりやすいかと思います。

f:id:stealthinu:20061207174139p:image

f:id:stealthinu:20061207174204p:image


Cookieさんのところでは、taRgrey導入方法についてのレポートをいただいています。

インストール方法の参考になると思います。

Birds Of a Feather | taRgreyポリシーサーバ評価中


Lukeさんところでは、"--tarpit=65 --retry-count=2"というオプション指定で、tarpittinggreylistingどちらも掛け、かつ再送は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 - まっちゃだいふくの日記★とれんどふりーく★ - 姉の日

-Luke's Admin ネタ帳-(2006-12-05)

Birds Of a Feather | taRgreyポリシーサーバ評価中

*1:--tarpit=65 --targrey --delay=3600 --retry-count=2

*2:--tarpit=65

enoeno 2006/12/07 15:23 いつも参考にさせてもらってます。さっそくtaRgreyを入れてみましたが期待通りにsleepしてくれなかったので952行目をコメントアウトして様子見中です。

stealthinustealthinu 2006/12/07 15:57 あ、こんにちわ。
952行目というのはパッチあてたpostgreyの、ということですか?
確認してみたんですが、ちょうどpostgreyの最後の行だったので、ちょっとtypoなのかなと。
ちなみに、sleepしなかったとのことなので、postfixのバージョンが気になったのですが、postfix-2.3.xを使われてますでしょうか?

enoeno 2006/12/07 16:17 ごめんなさい。まちがえてました。325行目です:-<
postgrey は 1.27、Postfixは2.3.4を使っています。
(sleepパッチも適用済みです)
この状態でうまくtarpitが掛かっています。

stealthinustealthinu 2006/12/07 16:33 325のところはtargreyモードで、tarpittingを抜けたときに通るところなので、そこをコメントアウトすると効いてくるのだとすると、postfixのmain.cfでsmtpd_data_restrictionsだけからpostgreyを呼び出してたりされてませんか?
targreyモードで動かす場合は、smtpd_recipient_restrictionsと2回呼び出さないといけませんが、そうされてますでしょうか。
smtpd_data_restrictionsから呼ばれた場合は、メールがちゃんと受信された場合だよ、という処理が呼ばれるようになっているので、呼び出し場所が違っているとうまく動かないのです。

enoeno 2006/12/07 16:55 原因が分かりました。Starpitから乗り換える際に postfix reloadとしたのがまずかったようです。smtpd_recipient_restriction の
sleepで待ってたのがDATAに帰ってきて、そのまま通り抜けてしまう状態でした。
「阻止できてない!!!」と慌てて前の設定に戻して、設定をいじってまたテストの繰り返しも良くなかったようです。

お騒がせしました。

ちなみに、--tarpit=65 --targrey --retry-count=2 のときは
65秒待ち続けた場合メールが通過するという動作でOKですか?

stealthinustealthinu 2006/12/07 17:09 よかった!
そのオプションの場合targreyモードになりますので、tarpittingを抜けただけで通るということでOKです。

NomyaNomya 2007/02/06 10:08 targrey を検証させていただいております。
ここで聞いて良いのかわかりませんが、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
-------------------

ってなっちゃうのは仕方ないでしょうか?
できれば、通ってほしいのですが。

stealthinustealthinu 2007/02/06 11:09 あれ?それはおかしいですね。
targreyモードだとそこで通るはずです。
最新パッチだとデフォルトがtarpit&greylistモードになっており、targreyモードにするには--targreyとオプション指定をする必要があります。
このあたりの設定を、一度確認してみていただけないでしょうか?

NomyaNomya 2007/02/06 11:21 ps コマンドの出力です。
----------------------
/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
----------------------

stealthinustealthinu 2007/02/06 11:30 あ、じゃあ、telnet掛けてるクライアントでは、一度tarpit中に切断テストされませんでしたか?
tarpit通らなかったIPはtarpit blacklist入りするので、その後はtarpit掛けずにgreylistに回されます。
RCPT TO後にすぐにgreylistの返答返ってくるようならそれです。
db_dump -p /var/lib/postgrey/tarpit_client とやって、telnetでのテスト掛けてるクライアントIPが入っていないか確認してみてください。
もし入っていたら、一旦dbファイルを削除してしまってpostgreyを再起動してみてから試してみてください。

NomyaNomya 2007/02/06 11:41 お騒がせしております。
postgrey の DB 削除、postgreyを再起動 は試しております。
状況としては、(削除・再起動後に) 最初の RCPT To では tarpitting がかかって sleep するのですが、2つ目の RCPT To では即座に 450 が返ってきます。その後、db に格納されてしまいます。

stealthinustealthinu 2007/02/06 16:47 なるほど。
では、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への処理に回されてしまいます。
状況から考えるとこれが一番ありそうなのですが。

NomyaNomya 2007/02/06 18:13 何度もすみません。white list などを減らして以下のような
設定にしてみましたが、やはり同じ結果になってしまいます。

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
--------------------------------------------

stealthinustealthinu 2007/02/06 18:42 ログあると話が早いですね。
他にはpostgreyのログは出て無かったとすると、protocol_state=RCPTですから、smtpd_recipient_restrictionsからしかpostgreyを呼び出してないように見えます。
smtpd_data_restrictionsで単にcheck_policy_service呼んでもこういうログになりますでしょうか?

通りすがり通りすがり 2007/02/06 20:58 smtpd_data_restrictionsは、この段階で評価されるんですか?
DATAコマンドを受け取った時では?

stealthinustealthinu 2007/02/06 21:29 あああ、なるほど。そういうことか。
RCPT TOが複数行ある場合なんですね。
確かにこれはダメだわ。うーん、さてさてどうしたもんだろう。
Nomyaさん、これは自分が勘違いしてました。この場合はNomyaさんの望まれるような動きにはなりません。
なにかうまい解決法がないか、考えて見ます。
通りすがりさん、おかげで問題点がわかりました。ありがとうございます。

stealthinustealthinu 2007/02/07 09:05 smtpd_data_restrictionsでtarpitブラックリスト削除ではなく、別ポートでも待ち受けさせて、そっちで来たらtarpitブラックリスト削除、とすることで可能になると思われます。
ただ、そういう構成にするにはpostgreyへの変更点も大きくなるので、作るのにちょっと時間掛かるので今すぐには出来ないという感じです。
postgreyベースではなく、policydベースでtargrey実装を考えているので、そちらのほうだけでやるかもしれません。

NomyaNomya 2007/02/07 11:25 色々とありがとうございました。
white list のメンテナンスをすることで回避します。
(サボれるとうれしかったのですが。)

policyd ベースでの targrey 期待しております。

stealthinustealthinu 2007/02/07 14:35 どういう形にせよ、改善したものを後日作りますので、気長にお待ち下さい _o_

stealthinustealthinu 2007/02/07 15:51 ちなみに、greylistのほうで何度か通ってると、そちらでもオートホワイトリストに入りますから、一応手動でホワイトリストメンテしなくても大丈夫ではあります。
ただそれまでは再送要求出してしまうので、ホワイトリスに入れたほうがベターだとは思います。

あとよろしければ、Nomyaさんのメールアドレスを私のアドレス宛に教えていただけませんでしょうか?
今後改善策を実装した場合にご連絡させていただきたいと思いますので。

NomyaNomya 2007/02/07 16:22 メールを送信しました。色々とお手数をおかけしますが、よろしくお願いいたします。

kinchankinchan 2007/07/11 12:15 taRgrey 使わせていただいています。ありがとうございます。
さて、postgrey が 2007/6 に 1.28 にバージョンアップされていますが、こちらに対応した patch はございますでしょうか?
どうぞ、今後もよろしくお願いします。

stealthinustealthinu 2007/07/11 19:38 バージョンアップで取り入れてもらえることを期待してたんですけど、ダメだったんですよ〜。残念です。
で、まだ1.28でのテストしてなかったので、試してみたんですがpatchあたらないですね。
とりあえず手でパッチ当てたものを作ってみましたが、まだ未テストなのでうちのサーバで動かしてみて、ある程度ちゃんと動くようだったら公開します。
もし、そういう不安定版でもよろしければお送りしますので、メールいただけないでしょうか?テストしていただけると嬉しいです。

kinchankinchan 2007/07/12 05:02 佐藤様、早速のお返事ありがとうございます。
satoh+hatena にメールさせていただきます。
当方、1日200〜300通程度の小規模メールサーバーですが、それでもよろしければ、ご協力させてください。

stealthinustealthinu 2007/07/12 09:51 ありがとうございます。メールで返信させていただきます。
とりあえずまだ、パッチ当てただけで動かしてないので、再度ソース見直して、テストサーバで動かしてみた段階でお送りします。
現状、稼働テスト期間ゼロなので、そちらでもいったんテストサーバで動かしてみてからお試しいただくようお勧めします。

kinchankinchan 2007/07/12 11:44 佐藤様、了解しました。
テストサーバーを用意しておきますのでよろしくお願いします。

hiro-uedahiro-ueda 2009/01/07 10:46 昨日のことですが、Google Apps を使っているユーザからのメールが s25r ルールに引っかかってしまいました。ホスト名が mail-bw0-f13.google.com で、permit_client_nots25r の "(^[^\.]*[0-9][^0-9\.]+[0-9])" にマッチしています。

s25r ルールを抜けたホストのうち、EHLO が Yahoo! や Nifty.com などのうそ臭いヤツを弾くルールを後段に入れていたため、誤爆してしまいました ^^;)。自業自得ですが回避するために s25r ルールの頭の方で .google.com を OK にしました。他の方の参考になれば幸いです。

stealthinustealthinu 2009/01/11 01:34 確かに、.google.comはホワイトリスト入れておいたほうが良いですね。あと、yahooやhotmailとかも。
自分のホワイトリストもその辺入れてあります。

 NomyaNomya  NomyaNomya 2009/02/02 22:42 お久しぶりです。
さて、S25R のルール1とルール6が変更になっております。
taRgrey の設定例も変更された方がよろしいかと。

stealthinustealthinu 2009/02/03 18:38 ありがとうございます。
うちにもメール来てました。IPv6関連ですね。
変更したいと思います。

kenjikenji 2009/04/28 11:58 はじめまして。
taRgreyを勉強させてもらっています。
教えていただきたいのですが、tarpitを通りぬけた相手からの
2回目の送信メールに X-Greylist ヘッダーが前のメールとの
間隔分 delay があったように付加されます
初めてtarpitまたはgreylistを通りぬけた時に
X-Greylist ヘッダーが付くようにならないのですが
どこかの設定を変更すれば可能でしょうか?

また、BerkeleyDBよりMySQLの方が身近なのですが
SQLgrey で taRgrey が使えたらとっても嬉しいのですけど
そんなお願いは無理ですか?

よろしくお願いします。

stealthinustealthinu 2009/04/28 15:23 なるほど。それはバグですね。
上のコメントで出ているように、他にも改善したい点があるんですがずっとやってなくて、これも一緒に改善したいと思います。

あとSQLgreyですが、自分もそれ考えてました。
postgreyだとタイムアウトしたものをDBから掃除するときに、反応が無くなるという問題があって、SQLgreyのほうが良いのですよね。
ただ、postgreyのテストバージョンがSQLgreyと同じく、SQL対応になっているため、それ待ちと思ってたのですが、それがなかなか出てくれなくて…
あと、milter-greylistにtargreyモード付けたいなとかもあるんですが、どれから手を付けようという感じです。

kenjikenji 2009/04/29 11:23 早速お返事いただきありがとうございます。
X-Greylist ヘッダーの件わかりました。

postgrey-2.0alpha1もmilter-greylistもSQLite対応みたいですけど
SQLiteでは複数サーバから使えないんですよね
セカンダリMXでの再送をカバーするために
MySQLで使えるのが理想的だと思ったんです。
データ内容もphpMyAdminでお手軽にみれるし
是非SQLgreyを何卒よろしくお願いします。

自分は我流で覚えたPHPしかプログラムを書けないので
あまり役には立たないかもしれませんが
お手伝いできることがあれば出来る限りの事はしたいと思っています
持っているグローバルIPアドレスに余裕がありますので
専用テストサーバーの提供やプログラムのテストなどは出来ると
思っています、よろしくお願いします。

stealthinustealthinu 2009/04/30 10:07 あー、なるほど。セカンダリで受けちゃった時も再送に対応したいからバックエンドをSQLにしたい、と。
でもたぶんpostgrey-2.0もSQLiteだけじゃなくて、ふつーにSQL扱うものだったら、だいたい対応できるんじゃないかと。DBI経由してるでしょうから。

とりあえず、新たなコード書きましたら、たぶんブログで書くのでそれ見ていただくか、もしよろしければ、プロフィールの欄にアドレスありますのでメールいただけると、なにか新規のもの作った時ご連絡させていただきます。

kenjikenji 2009/05/01 11:33 そうでしたか、DBI経由でSQLiteに対応していると
MySQL他にも対応できるんですね。
しばらくはBerkeleyDBでinet:192.168.0.20:10023として
複数サーバでのテスト運用をして見ます。
ありがとうございました、メール送らせて頂きます。

BerkeleyDBのデータをコマンドで追加、削除できるツールが
あれば便利ですね、ありそうなのに見つけられませんでした。

stealthinustealthinu 2009/05/03 00:51 あれ?あまり自信ないのですが、BerkeleyDBで普通にtieして使う場合って、他のプロセスからも書き換えがあったらおかしくなるような気が。それ以前にLOCKしてて同時に同じDB見ること出来ないかもしれません。ちょっとこの辺はソース見て確認されることをお勧めします。

BerkeleyDBのデータ追加削除簡単に出来るのって、自分も知りません。
Perlでちょこっと書いてそれでテストしてました。

kenjikenji 2009/05/04 13:14 はい、私の早とちりでした、別マシンからtelnetで反応があっただけで、あちこちから使えると思い込んでしまってました。
当面SQLの使えるもので Rgreyとして引き続き勉強させて頂きます。
ありがとうございました。

stealthinustealthinu 2009/05/07 17:13 自分も他のgreylistingサーバへのポート、努力してみます〜