土曜日, 9月 23, 2006

Becky!でのフィルタリング

 私は、勤務先ではメーラーBecky!のフィルタリング機能を利用してスパムを捨てている。その方法は、随筆記事「Becky!でスパムメールを自動的に90%以上捨てる方法」で紹介している。以前は、メールサーバが送信元の逆引き名をReceivedヘッダに記録してくれなかったので、S25R方式を応用した正規表現フィルタでHELOアドレスを検査して約60%、HTMLメールを捨てるフィルタを加えて約80%、さらに、怪しい単語(「viagra」など)を引っかけるフィルタを加えて約90%をごみ箱行きにしていた。
 最近になって、逆引き名がReceivedヘッダに記録されるようになったので、フィルタを変更した。
 まず、随筆記事で紹介している正規表現フィルタに若干工夫を加えた。「ヘッダ」欄に「Received」と入力し、「正規表現」のチェックをオンにして、「文字列」欄に次のように入力する。

from .*\((unknown|\[|[0-9]|[^.]*[0-9][0-9][0-9][0-9][0-9]|[^.]*[0-9]+(([a-z]|-)+|\.)[0-9]|.*\(may be forged\)).* by mail\.example\.jp

ここで、「mail\.example\.jp」は自サイトのメールサーバ名に置き換える。MTAがsendmailの場合は、「unknown|」はなくてもよい。Postfixの場合は、「\[|」と「|.*\(may be forged\)」はなくてもよい。
 これは、S25Rの一般規則を簡略化したもの(簡易一般規則と呼ぶことにする)である。逆引き失敗、およびルール1、2、3を合わせた条件とおおむね等価である。また、sendmailによるパラノイド検査(逆引き名の順引き結果が元のIPアドレスに一致するかどうかの検査)で不適合になって逆引き名に「(may be forged)」(偽造かもしれない)と付記されている場合も引っかけるようにしている。正当なメールをごみ箱行きから除外するには、この条件の下に絞り込み条件として除外条件を追加する。
 また、次のブラックリストも設定した。

from .*\(.+\.(adsl|internetdsl|sdi)\.tpnet\.pl .* by mail\.example\.jp
from .*\(xdsl.*\.dialog\.net\.pl .* by mail\.example\.jp
from .*\(user.*\.mindspring\.com .* by mail\.example\.jp

 2006年8月23日から9月22日までの1ヶ月間に受信したスパムは535通。そのうち519通(97.0%)がスパム判定された。簡易一般規則に引っかかったものは494通(92.3%)であった。いずれも、9月15日の記事「宛先の正しいスパムの阻止率」で報告した阻止率(トータルで97.4%、一般規則で92.1%)に近い値である。
 S25Rの一般規則には引っかかるが簡易一般規則をすり抜けたものは4通(0.7%)であった。このことから、簡易一般規則の効力はS25Rの一般規則に比べてさほど劣らないと言える。
 これで、HTMLメールを捨てるフィルタと、怪しい単語を引っかけるフィルタは不要になった。これらのフィルタを設定してもスパム判定率はほとんど上がらない。
 一方、誤ってごみ箱行きになった正当なメールは4通(送信元は3個)であった。人によってはもっと多くなるだろう。多くの外部サイトからのメールを受けないと、false positive率は計算しにくい。
 以前、ウイルスバスターの迷惑メール対策機能を使っていた時には、判定レベルを「高」にしても、スパム判定率は85%くらいであった。それに比べて、わずか4個の、負荷の軽いフィルタで97%のスパムをごみ箱行きにできるのだから、S25R方式を応用したフィルタリングの効果は高い。一日に100通のスパムを受ける人の場合も、受信箱に残るスパムは平均3通ですむのだから、メーラーによるスパム対策としてはこれで十分だと思う。
 Becky!以外への応用の参考のために、前記の4個のフィルタ設定を、Receivedヘッダ全体を検査する正規表現に直して示しておく。

/^Received: from .*\((unknown|\[|[0-9]|[^.]*[0-9][0-9][0-9][0-9][0-9]|[^.]*[0-9]+(([a-z]|-)+|\.)[0-9]|.*\(may be forged\)).* by mail\.example\.jp/
/^Received: from .*\(.+\.(adsl|internetdsl|sdi)\.tpnet\.pl .* by mail\.example\.jp/
/^Received: from .*\(xdsl.*\.dialog\.net\.pl .* by mail\.example\.jp/
/^Received: from .*\(user.*\.mindspring\.com .* by mail\.example\.jp/

4 件のコメント:

匿名 さんのコメント...

お世話になっております。
一点ご教示ほどおねがいいたします。Beckyを使ったフィルタリングで今回ブラックリストを提示していただきました。これはタイプAの設定だと思いますが、タイプBの場合はどのようにすればよいでしょうか?

deo さんのコメント...

 yanagidaさん、書き込みありがとうございます。
 タイプBの場合は、「from 」の次の「.*\(」の4文字を削除してください。「from」の直後のスペース1個は消さないでください。

匿名 さんのコメント...

有難うございます。早速設定したいと思います。一ヶ月ほど使用させていただいていますが、S25Rはすごいです。本当にありがたいです。

deo さんのコメント...

yanagidaさん:
 お役に立って私もうれしいです。