bogofilter, spamassassin, ClamAVを使ってメールのフィルタリングをします。
Debianサーバーで設置しました
インターネット → 自宅サーバー → procmail 処理 → プロバイダーのメールボックスと転送してメールの受け取りをしていますが、多い日にはspamが1日に100通 ほどやってきます。少ないときには余り気にしていませんでしたが手動で仕訳するには困るほど増えて来ましたのでサーバーにフィルターソフトを導入しまし た。
ただしメールを受信するsylpheed上で確認して破棄したいので ウイルスメールや spam をサーバーで捨ててしまわずに、ヘッダーを挿入したりタイトルを変更するだけにしています。
Debianでeximをそのまま使用し、フィルタリングソフトには ClamAV, bogofilter, spamassassinを使用します。ClamAVと spamassassin はオーバヘッドを抑えるためにデーモンとして起動することにします。
ClamAVのウイルス定義データーは自動的に更新されます。
bogofilter が日本語メールの処理をうまくできないようで nkf でEUC-JPに文字コードを変換し、kakasi わかち書きに加工していましたが、それでも学習がうまくできないようで、日本語の出会いサイト系のメールが bogofilter をかなりの確率で素通りしますし、いったん学習してもすぐに忘れてしまうようです。今 回さらにローマ字変換することでさらに精度が向上しました。
●ソフトをインストールします。いつもながらdebianのパッケンジャーに感謝。
apt-get install bogofilter spamassassin clamav-daemon nkf kakasi sed
●spamassassin のユーザー用初期設定をします。 フィルターソフト使用開始直後はベイジアンフィルターの効果が発揮されません。そこで複雑な条件式を組み込んでいる spamassassin の初期設定をネットからコピーします。
とりあえずこれで大部分はチェックできますが少し厳し過ぎるかも知れません。私の場合ある公的機関のメーリングリストがすべてスパムと判定されてしまいま した。学習すればOKです。
mkdir ~/.spammassassin
cd ~/.spamassassin
wget -O user_prefs http://tlec.linux.or.jp/docs/user_prefs
●root で /etc/default/spamassassinを編集します。
# /etc/default/spamd.conf
# Duncan Findlay
# WARNING read README.spamd before using. THERE ARE SECURITY RISKS!
# Change to one to enable spamd
ENABLED=1
以下略
●root で spamassassin をデーモンで起動します。
sudo /etc/init.d/spamassassin start
●.procmailrc を編集します
#.procmailrc
#pipe the mail through spamassassin
VERBOSE=off
MAILDIR=$HOME/mail
PMDIR=$HOME/.procmail
LOGFILE=$PMDIR/`date +%y%m%d`.log
BOGO=`nkf -ZmeLu | kakasi -w | kakasi -Ha -Ka -Ja -ka -rh | bogofilter -v`
#動作が確認できるまでは下の2行をコメントアウトする
#:0c
#! foo@hogehoge.ne.jp
#mail to learn spam or ham
:0
* ^Subject: spam-hogehoge
{
:0cw :bogo.lock
| nkf -ZmeLu | kakasi -w | kakasi -Ha -Ka -Ja -ka -rh | bogofilter -Ns
:0 :spam.lock
spam/.
}
:0
* ^Subject: ham-hogehoge
{
:0cw :bogo.lock
| nkf -ZmeLu | kakasi -w | kakasi -Ha -Ka -Ja -ka -rh | bogofilter -nS
:0 :ham.lock
ham/.
}
#virus check
:0 HBf :virus.lock
* ? /usr/bin/clamdscan --quiet - ;test $? = "1"
| /usr/bin/formail -i "Subject: This is virus mail detected by ClamAV"
#spam check by bogofilter
:0fw
| /usr/bin/formail -i "X-Spam-scanned: by bogofilter" -i "$BOGO"\
-i "X-Virus-Scanned: by ClamAV Daemon Client"
#if mail is assessed spam by bogofilter
:0
* ^X-Bogosity: Spam
! foo@hogehoge.ne.jp
#spam check by spamassassin
:0fw :spamc.lock
| /usr/bin/spamc
#if mail is spam by spamassassin
#:0cw :bogo.lock
#* ^X-Spam-Status: YES
#| nkf -ZmeLu | /usr/bin/kakasi -w | kakasi -Ha -Ka -Ja -ka -rh | bogofilter -Ns
:0
! foo@hogehoge.ne.jp
特徴は
- ログは1日1つ作成します。動作が安定したらコメントアウトします。
- メールをnkf, kakasiで前処理することでbogofilterは評価、学習ともに日本語対応(無理矢理)になっています。
- 初期設定の段階で bogofilter で評価した結果を環境変数に代入し、あとで利用します。
- タイトルが「spam-hogehoge」や「ham- hogehoge」のメールはそれぞれspam, ham としてbogofilter で学習し、$MAILDIR/spam, $MAILDIR/hamにオリジナルのまま1メール1ファイル、連番で保存します。メールが間違って判定されて届いた場合にタイトルのみを変更し自分自 身に転 送すれば bogofilter の学習結果がすぐに反映されます。
- clamAVで評価しウイルスであればタイトルを変更します。
- bogofilter でスパムと判定すればすぐに転送し、そうでなければ spamassassin で念のため評価します。
- 設置直後は bogofilter で ham, spamassassin で spam と判定されたメールを bogofilter にspam として学習させることができます。ある程度学習が進めば不用になります。
注意点
- メールが一度にたくさん来て多くのプロセスを立ち上げてリソースを喰い尽くしたり、bogofilterの学習を並行して 行ったりすることになるので、ファイルを書き込んだり、bogofilter や spamassassin で操作する際にはロックファイルでロックする必要があります。ロックかけずに山のようにメールを送ったらサーバーを再起動する羽目になりました。
- bogofilter の学習はある程度進むと時間がかかるようになりますので、まとめて学習させる際には注意が必要です。手元の ham 400通をタイトルを変えてsendmailするスクリプトで10秒に1通送ってもK6-2/300のサーバーでは300通辺りで処理仕切れなくなりまし た。
- spamassassin はデーモンにしてもやっぱり負荷がある程度かかります。負荷が気になる場合は bogofilter が賢くなってから外してもいいでしょう。
●.forward を編集し、メールを受け取ったら procmail に渡すように設定します。procmailrcの設定が終わってから最後に します。
# .forward
# Exim filter
pipe "/usr/bin/procmail"
これで一度動作を確認してください。ミスがあるとメールを受信できないことがあります。
自分宛のメールが届くかどうか。スパムのタイトルを「spam-hogehoge」と変更し自分に送り学習させ、もう一度自分に送るとスパムと判定される かどうか。
cron で一日一回 spamassassin の学習をさせます。学習量が多くなるとそれなりの負荷になるかもしれません。
crontab -e
0 5 * * * /usr/bin/sa-learn --spam /home/foo/mail/spam/* && \
/usr/bin/sa-learn --ham /home/foo/mail/ham/* && \
/usr/bin/sa-learn --sync
●学習の反復どうも bogofilterは学習内容を忘れることが有るようなので$MMAILDIR/spamに有るメールを週に1回は全て判定させ、判定を誤ったメールは再度学習させています。
●HAMの学習も忘れずにSPAMばかりを学習させるとだんだん調子が悪くなります。
定期的にHAMも学習させたほうが判定精度が上がるようです。
●学習のためのスパムはこちらから入手できます。
http://www.flcl.org/~yoh/spam.tar.gz
http://www.flcl.org/~yoh/spam9xxxx.tar.gz
http://www.flcl.org/~yoh/problem/jpspam03jul_04jan.tar.gz
テスト用ウイルスメールはこちらに頼めば送ってもらえます。
今回はサーバーで処理を行いましたが、メールを受信するlinuxマシン上でもスクリプトを作成しsylpheedのアクションに設定すれば同じ事ができ ますのでサーバーの負担を減らすことができます。