先週まで風邪や雨の多い日が続いていてなかなか自転車通勤ができませんでしたが、今日から自転車通勤を再開したnaoyaです。
今日は、僕がメールサーバを新しく構築するにあたって新たにスパム対策を施したので、その内容について紹介します。
まず、メールサーバですが、次のようなオープンソースソフトウェアで構成されています。
- OS: Fedora Core 5
- MTA: Postfix
- MUA: Dovecot(IMAP & POP3)
それぞれ yum で最新版をインストールしていました。さらにウノウではメーリングリストを使っているのですが、メーリングリストの配送プログラムには mailman を使っています。mailman も yum で最新版をインストールしました。
さてスパムメールですが、よくメーリングリスト宛にたくさん送られてくるのに対して個人宛にはまったく送られてきません。
そこで、メーリングリストプログラムでメールの配送前にスパム対策を施そうと、まずはオープンソースで使えるスパムフィルターを探してみました。
次の三つのスパムフィルターが見つかりました。
それぞれのスパムフィルターの特徴は、次の通りです。
SpamAssassin
おそらく世界で一番有名なスパムフィルターだと思います。Perl で書かれており、デーモンとしても動作します。
bsfilter
Ruby で書かれているスパムフィルター。作者が日本人のため、日本語に標準で対応しています。
bogofilter
C 言語で書かれているスパムフィルター。C 言語のため高速に動作する。
すべてのスパムフィルターを使うとメールの配送が遅れてしまう予感がしたので、まずはどのスパムフィルターを使うと効果的か自分のメール環境で試してみました。
それぞれのスパムフィルターを試すために、インストールと設定をしました。
SpamAssassin
- # yum -y install spamassassin
- 設定ファイル (/etc/mail/spamassassin/local.cf) を日本語対応のファイルに置き換える(*1)
- # chkconfig spamassassin on
- # /etc/init.d/spamassassin start
(*1) Tokyo Linux Entertainment Community様にて配布されている定義ファイルが便利です。
bsfilter
パッケージはないため、ホームページから最新版をダウンロードして展開します。
bogofilter
日本語に対応させるため、kakasi もあわせてインストールします。
- # yum install bogofilter
- # yum install kakasi
スパムフィルターをインストールしてたら、まず行うのは Ham& Spam メールの学習です。
スパムフィルターの学習を手動で毎回行うのは面倒のため、次のようなシェルスクリプトを作って cron で深夜 0 時に毎日実行するようにしました。
なお、下記のシェルスクリプトでは、MailDir 形式で spam ディレクトリにスパムメールが存在して、cur ディレクトリ(つまり Inbox)に通常のメールがある前提で作成されていますので注意してください。
#!/bin/sh BGFILTER=/usr/bin/bogofilter BSFILTER=/opt/bsfilter/bsfilter/bsfilter SALEARN=/usr/bin/sa-learn MAILDIR=$HOME/Maildir # spam echo "spam for bogofilter..." find $MAILDIR/.spam/cur -name "*" -type f -exec nkf -Z -m -j {} \; | kakasi -w | $BGFILTER -Nsv echo "spam for bsfilter..." $BSFILTER -sv $MAILDIR/.spam/cur/* echo "spam for SpamAssasin..." $SALEARN --spam $MAILDIR/.spam/cur echo "" # not spam echo "ham for bogofilter..." find $MAILDIR/cur -name "*" -type f -exec nkf -Z -m -j {} \; | kakasi -w | $BGFILTER -Snv echo "ham for bsfilter..." $BSFILTER -cv $MAILDIR/cur/* echo "ham for SpamAssasin..." $SALEARN --ham $MAILDIR/cur # update database $BSFILTER -u
このシェルスクリプトを約2週間ほど自動実行して Ham& Spam メールの学習を行いました。
この状態で、やっとどのスパムフィルターが効果的か試験をすることにしたのですが、長くなってきましたので、続きは後編で書きたいと思います。
後編では、スパムフィルターを試した結果と mailman でのスパム対策方法について書きたいと思います。