2004/9/30 (lastupdate 2009/5/29)
Rgreyとは、メールサーバ上でスパムやウイルスメールを排除するためのフィルタの手法で、
S25Rとgreylistingというスパム判定手法を組み合わせて使うというものです。
スパムの検出率を上げることより、正しいメールの誤検出をしないことを目標
として設計されており、原理的にほとんど誤検出無く運用することが出来ます。
そのため、ベイジアンフィルタ等の他のコンテンツフィルタと組み合わせて
1次フィルタとして利用すると有効ですが、これだけでも95%弱程の検出率はあります。
同様の手法で、greylistingの代わりにtarpitting(遅延)を利用したStarpitという手法と、tarpittingとgreylistingを組み合わせて、さらに誤検出などを減らすtaRgreyという手法も提案しています。
現在のところtaRgreyをもっとも推奨しますので、こちらのページを参照後、StarpitとtaRgreyの説明も参照ください。
Starpitでほぼ誤検出無く98%のスパムを排除
taRgrey - S25R + tarpitting + greylisting
Selective SMTP Rejection (S25R) - 阻止率99%のスパム対策方式の研究報告 を読んで、簡単な仕組みながら効果が高いと思いました。
これはFQDNのパターンから、PPPなどの接続先と思われるところから直接出されているものを拒否することで、スパムやウイルスメールを排除するというものです。
しかし、この報告でも述べられているように、大規模なサイトで運用するには、間違って阻止されてしまうメールのリスクが高く、rejectで再送要求し、それでも再度送ってきたらホワイトリストに登録する、ということが薦められています。
そこで、その運用を自動化するためのスクリプトを書こうと考えていたのですが、よく考えるとそれは、Greylistingそのものだということに気が付きました。
Greylistingという方式については、下記記事を参照ください。
[postfix-jp:03911] Greylisting
つまり、一度必ず再送要求で返して、ちゃんと再送してきたら受け取るというものです。
これを、あやしい接続元に対してだけ再送要求で返せば、Greylistingによる
副作用 - 再送待ちによるメールの遅延や、正しいメール送信元からのメールの排除(まれに再送要求に応じない
メールサーバを使っているところがある) - がなく、スパムも受け取らなくて済むという、いいとこどりのシステムになるはずです。
FQDNのチェックとGreylistingを2重に掛けるからと言って、排除するための条
件がandになるわけですから、排除率が上がるわけではありません。FQDNチェッ
クとGreylistingの排除率が掛けられた率に下がってしまいます。
駆除率を上げるのではなく、フィルタリングによる悪影響を最小限にするため
の追加と考えてください。
ちなみに、自分宛に平均したところ200通/日で届いていた、スパム・ウイルスメールのうち、平均10通程すり抜けてきています。
内訳は、ドメイン名チェックですり抜けたものが7通程、Greylistingのチェッ
クですり抜けたものが3通程となっています。
約95%の駆除率となっています。
このフィルタは接続要求元を逆引きしてパターンマッチ掛けるだけなので、コンテンツフィルタと比較して非常に負荷が軽くなっています。
そのため、これを1次フィルタとして、2次フィルタにClamAV等のウイルスチェックフィルタや、SpamAssassin等のスパムフィルタを用いると、負荷低減という意味でも利用価値があります。
また、ベイジアンフィルタ等を用いたスパムフィルタでは、どうしても誤検出されることがあるので、スパムにより分けられたものを一度チェックしてから捨てることが多いと思います。
一日に届くスパムメールが100通以上もあると、そのゴミ漁りすらうっとおしいのではないでしょうか。
S25Rにマッチする接続元で、かつ再送要求にも応じないような送信元は、ほぼスパムかウイルスと断定してしまってよいと思います。
そういうわかりやすいものを先に捨ててしまうことで、一日に届くスパムはこのフィルタで100通から10通以内に減りますから、その後のフィルタで引っ掛けたゴミを漁るときに、楽になる効果も狙えます。
また、接続元の逆引き名やDNSBLなどから、怪しい接続に対してのみgreylistingを掛けるという同様のコンセプトは、現在では下記のように複数のところで提案がされており、このような手法を指してselective greylistingと呼ばれています。
Postfixは2.1よりSMTPDアクセスポリシーという機能が使えるようになり、外部のポリシーサーバにより、接続の許可などを行わせることが出来るようになっています。
Postfix SMTP Access Policy Delegation
この機能を使って、Greylistingの実装がサンプルで付いてきているのですが、その他にも、
Postgrey - Postfix Greylisting Policy Server
というものが公開されています。
S25Rの条件にマッチしたものだけをpostgreyに渡してGreylistingを掛けるようにします。
/etc/postfix/main.cf --- smtpd_restriction_classes = check_greylist check_greylist = check_policy_service inet:60000 smtpd_recipient_restrictions = … check_client_access regexp:/etc/postfix/check_client_fqdn --- /etc/postfix/check_client_fqdn --- /^unknown$/ check_greylist /^[^.]*[0-9][^0-9.]+[0-9].*\./ check_greylist /^[^.]*[0-9]{5}/ check_greylist /^([^.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]/ check_greylist /^[^.]*[0-9]\.[^.]*[0-9]-[0-9]/ check_greylist /^[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\./ check_greylist /^(dhcp|dialup|ppp|[achrsvx]?dsl)[^.]*[0-9]/ check_greylist ---この設定方法のアイデアは
ホワイトリストや、Rgreyをすり抜けてくるスパムをフィルタするための、NSによるブラックリスト設定など、より具体的な設定内容はspam対策まとめおよびStarpitでほぼ誤検出無く98%のスパムを排除を参照ください。
postfixを利用する場合、パッチを当てなくてすむ、上記の設定による手法のほうが、負荷やpostgreyサーバの保守の面でも有利ですので、そちらを利用したほうが良いでしょう。
postgrey では whitelists が指定できるのですが、これをちょこっと改造して、まず先にチェックすべき接続元、ここでは greylists と呼ぶとすると、これのどれかに合致しているなら、チェックする必要がある、という機能を追加しました。
postgrey-1.24用
パッチ本体:公開懺悔日記: 野良port
こちらで公開していただいておりますパッチをご利用ください。
postgrey-1.21用
パッチ本体:rgrey-0.2-1.21.tar.gz
Debian(sarge)のpostgrey-1.21用
パッチ本体:rgrey-0.2-1.21-debian.tar.gz
Debian用パッチを使ったインストールメモを参照
postgrey-1.16用
パッチ本体:postgrey-namecheck
このパッチを使ったインストールメモを参照し
てください。
また、こちらではmomonga用のrpmを公開いただいています。
[linux] Rgrey - S25R + postgrey パッチ - 寝言に相槌日記フォ〜!!! (2005-09-23)
postgrey-1.21-1m.nosrc.rpm
SQLgreyというpostgreyから派生したSQLサーバを利用するgreylistingサーバでは、Rgreyと同様の機能が取り入れられており、その中の設定ファイルdyn_fqdn.regexpで動的IPのマッチングが行われるようになっています。
この設定ファイルをS25Rのパターンに変更することで、Rgreyと全く同じ動作となります。
ちなみに、S25Rの提案者である浅見さんのテストによると、各パターンのスパムのマッチ率は以下のようになったとのことです。
qmail用にもいくつかgreylistingの実装が公開されており、そのうちの一つ、
qgreylist - simple greylisting for qmail
に対してのS25R対応パッチ、Qgreyも作成しました。