[HOME] > PC-UNIX Tips > スパム・フィルタ
Created: 2005.01.30
Updated: 2006.02.04
Updated: 2006.11.10
PC-UNIX Tips
ホームページにメールアドレスを掲載しているせいか、最近やたらとスパム メールが多くなってきました。以前からあったのですが、最近特に多い気が します。よく言われるスパム対策が個人レベルでも必要になってきたかも。
で、fetchmail + Mewの環境にスパムフィルタを導入してみました。スパムフィルタ はベイズの定理を使ったベイジアンフィルタってのが主流だそーな。あらかじめ メール中のトークン(単語?)ごとのスパムである確率を学習しておき、対象となる メール中にスパム確率の高いトークンが多く含まれていたら、そのメールがスパム と判定します。そのベイジアン系の bogofilter と bsfilter を使ってみました。
最初、bogofilterを使って みました。英語のスパムはちゃんと認識してくれるのですが、nkfやkakasiを使った 日本語スパムの認識について、使いこなせなかったので断念。bogofilter自体は 日本語対応がないので、nkfやkakasiと組合せが必要とのこと。
設定は次のようにしてみました。
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #username"
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/.
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$HOME/.lockmail
:0 HB
* ? bogofilter
spam/.
:0:
inbox/.
次に、国産のbsfilterを導入。こちらは、 国産ってこともあって、元もと日本語対応済み。設定はbgofofilterと同様。
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #username"
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/.
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$HOME/.lockmail
:0 fw
| /usr/local/bin/bsfilter --pipe --insert-flag --insert-probability
:0
* ^X-Spam-Probability: *(1|0\.[89])
spam/.
:0:
inbox/.
bsfilter は、スパムとクリーンなメールのパターンを学習させて 育てていく必要があります。学習パターンが少ない初期の頃は、まま 誤認する場合がありますのでご注意ください。コマンドは下記のよ うになります。データベース反映を忘れないように。
% bsfilter --add-spam -v ~/Mail/spam/*
...
% bsfilter --add-clean -v ~/Mail/${dir}/*
...
% bsfilter --update
...
% 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ヘッダ、メッセージのキーワード等 で試してみました。以下が比較的効果がありましたが、決定打にはなりませんで した。
試行錯誤の結果、スパムをかなりの確率で見分けることができる決定的なパターン がわかりました。スパム発信元がRFCに準拠しないアホなメールを発信し、かつ経由 するMTAがRFCに準拠して、ある機能を働かさないことが条件となります。既知のこと かもしれませんが、あえて答えは書きません。アホなスパム業者には知られたくない ので...
と、思っていたのですが、この方法だと受信したいメールでもスパムと同じパターン のものがままあることが分かりました。ってことで、別のパターンを探し続けて8ヶ月 ... やっとこれかな?と思えるパターンを発見。今回も答えは書きませんが、あるメール ヘッダに注目してみてください :-) 結構効きます。
PC-UNIX Tips
Written by kabada