unoh.github.com

ベンチャー流のスパムメール対策術(前編)

Mon Apr 23 03:24:22 -0700 2007

先週まで風邪や雨の多い日が続いていてなかなか自転車通勤ができませんでしたが、今日から自転車通勤を再開したnaoyaです。



今日は、僕がメールサーバを新しく構築するにあたって新たにスパム対策を施したので、その内容について紹介します。



まず、メールサーバですが、次のようなオープンソースソフトウェアで構成されています。





それぞれ yum で最新版をインストールしていました。さらにウノウではメーリングリストを使っているのですが、メーリングリストの配送プログラムには mailman を使っています。mailman も yum で最新版をインストールしました。



さてスパムメールですが、よくメーリングリスト宛にたくさん送られてくるのに対して個人宛にはまったく送られてきません。



そこで、メーリングリストプログラムでメールの配送前にスパム対策を施そうと、まずはオープンソースで使えるスパムフィルターを探してみました。



次の三つのスパムフィルターが見つかりました。


それぞれのスパムフィルターの特徴は、次の通りです。



SpamAssassin


おそらく世界で一番有名なスパムフィルターだと思います。Perl で書かれており、デーモンとしても動作します。

bsfilter


Ruby で書かれているスパムフィルター。作者が日本人のため、日本語に標準で対応しています。



bogofilter


C 言語で書かれているスパムフィルター。C 言語のため高速に動作する。



すべてのスパムフィルターを使うとメールの配送が遅れてしまう予感がしたので、まずはどのスパムフィルターを使うと効果的か自分のメール環境で試してみました。



それぞれのスパムフィルターを試すために、インストールと設定をしました。



SpamAssassin



  1. # yum -y install spamassassin

  2. 設定ファイル (/etc/mail/spamassassin/local.cf) を日本語対応のファイルに置き換える(*1)

  3. # chkconfig spamassassin on

  4. # /etc/init.d/spamassassin start



(*1) Tokyo Linux Entertainment Community様にて配布されている定義ファイルが便利です。



bsfilter


パッケージはないため、ホームページから最新版をダウンロードして展開します。



bogofilter


日本語に対応させるため、kakasi もあわせてインストールします。



  1. # yum install bogofilter

  2. # 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 でのスパム対策方法について書きたいと思います。