[HOME] > PC-UNIX Tips > スパム・フィルタ

スパム・フィルタ

Created: 2005.01.30
Updated: 2006.02.04
Updated: 2006.11.10

PC-UNIX Tips

INDEX

環境

OS:
Plamo-4.01
MUA:
Mew version 3.3
POP Client:
fetchmail-6.2.2
Spam Filter:
bsfilter-1.0.6
Other:
procmail v3.14, ruby 1.8.2

スパムフィルタ導入

ホームページにメールアドレスを掲載しているせいか、最近やたらとスパム メールが多くなってきました。以前からあったのですが、最近特に多い気が します。よく言われるスパム対策が個人レベルでも必要になってきたかも。

で、fetchmail + Mewの環境にスパムフィルタを導入してみました。スパムフィルタ はベイズの定理を使ったベイジアンフィルタってのが主流だそーな。あらかじめ メール中のトークン(単語?)ごとのスパムである確率を学習しておき、対象となる メール中にスパム確率の高いトークンが多く含まれていたら、そのメールがスパム と判定します。そのベイジアン系の bogofilter と bsfilter を使ってみました。

bogofilter

最初、bogofilterを使って みました。英語のスパムはちゃんと認識してくれるのですが、nkfやkakasiを使った 日本語スパムの認識について、使いこなせなかったので断念。bogofilter自体は 日本語対応がないので、nkfやkakasiと組合せが必要とのこと。

設定は次のようにしてみました。

  1. fetchmailでPOPサーバからメールを取り込み
  2. procmailにforwardして
  3. bogofilterで判定し
  4. スパムは$HOME/Mail/spamに
  5. その他は$HOME/Mail/inboxに、procmailにて振り分け。

bsfilter

次に、国産のbsfilterを導入。こちらは、 国産ってこともあって、元もと日本語対応済み。設定はbgofofilterと同様。

  1. fetchmailでPOPサーバからメールを取り込み(同様)
  2. procmailにforwardして(同様)
  3. bsfilterで判定し
  4. スパムは$HOME/Mail/spamに(同様)
  5. その他は$HOME/Mail/inboxに、procmailにて振り分け。(同様)

bsfilterの育て方

bsfilter は、スパムとクリーンなメールのパターンを学習させて 育てていく必要があります。学習パターンが少ない初期の頃は、まま 誤認する場合がありますのでご注意ください。コマンドは下記のよ うになります。データベース反映を忘れないように。

  1. スパムメール・パターンの追加
    % bsfilter --add-spam -v ~/Mail/spam/*
    ...
    		
  2. クリーンメール・パターンの追加
    % bsfilter --add-clean -v ~/Mail/${dir}/*
    ...
    		
  3. データベース更新
    % bsfilter --update
    ...
    		
  4. スパム手動判定例: 最後のフィールドがスパムである確率
    % bsfilter spam.mail
    combined probability spam.mail 1 1.000000
    % bsfilter clean.mail
    combined probability clean.mail 1 0.000000
    %
    		

その後、bsfilterデータベースをある程度育てた段階で、ほぼ誤認はなくなり 実用レベルに達しました。たまーに誤認することもありますが、うまいこと スパムを排除してくれています :-) ただ、データベース更新のタイミングが しっくりきていません。現在のところ、データベース更新シェルを作成し、

を併用する運用にしています。

因みに、シェル: $HOME/bin/spamget.sh はこんな感じです。

#!/bin/sh

PATH=/usr/bin:/usr/local/bin

# get spam pattern
echo "learning spam mail ..."

bsfilter --add-spam ~/Mail/spam/*

# get normal mail pattern
echo ""
echo "learning normal mail ..."

for dir in inbox savebox savebox2;
do
 echo "${dir} processing ... "
 bsfilter --add-clean ~/Mail/${dir}/*
done

# update database
echo ""
echo "update database ..."
bsfilter --update

exit 0
	

もひとつおまけに、$HOME/.logout はこんな感じです。

echo ""
echo "Do you update bsfilter database ?"
echo -n "Your answer. ====> (y/N) "
set bsans = $<

if( "$bsans" == "y" ) then
        # get spam pattern for bogofilter
        $HOME/bin/spamget.sh
endif

exit 0
	

スパムメールの特徴

bsfilter等、MUA側で動作させるメールフィルタは、POP3等で既にメール ボックスに届いたスパムには有効です。しかし、心情的には、自分の メールアドレスがスパムに利用されているだけで、いい気分はしません。

最近は、メールサーバで受信拒否する機能を実装している場合が多くなって いますので、この機能を使えばメールボックスに到着する前に拒否すること ができます。私が利用しているメールサーバでも、メールヘッダとメール メッセージに対して、ある条件にマッチするメールを受信拒否することが できるようになり、この機能を利用してみました。

まず、Subjectヘッダのキーワードや、Fromヘッダ、メッセージのキーワード等 で試してみました。以下が比較的効果がありましたが、決定打にはなりませんで した。

Subject:
未承諾広告
未承認広告
From:
info@*
@のないメールアドレス
Content-Type:
text/plain以外全て
X-Mailer:
The Bat(参考: スパム対策)

試行錯誤の結果、スパムをかなりの確率で見分けることができる決定的なパターン がわかりました。スパム発信元がRFCに準拠しないアホなメールを発信し、かつ経由 するMTAがRFCに準拠して、ある機能を働かさないことが条件となります。既知のこと かもしれませんが、あえて答えは書きません。アホなスパム業者には知られたくない ので...

と、思っていたのですが、この方法だと受信したいメールでもスパムと同じパターン のものがままあることが分かりました。ってことで、別のパターンを探し続けて8ヶ月 ... やっとこれかな?と思えるパターンを発見。今回も答えは書きませんが、あるメール ヘッダに注目してみてください :-) 結構効きます。

PC-UNIX Tips

Written by kabada