SpamAssassinのスパム対策

メールサーバ側で迷惑スパムメール対策を行う方法を紹介します。このスパム対策よりクライアント側のOutlookExpressでメール受信等でスパムメールがある程度軽減できると思います。対策には、SpamAssassin というフリーのソフトで「SpamAssassin」ソフトウェアを利用してみます。
SpamAssassinは、PerlスクリプトでCGIの使用ですが、Redhat、FedoraCoreのLinux用のrpmパッケージが用意されていますので、yumで普通にインストールできます。
SpamAssassinは、amavisd-newをインストールする際に、一緒にインストールされますので確認してみます。

#] rpm -qa | grep spamassassin
spamassassin-3.1.7-1.el4.rf
もしインストールされていなかったら、次のようにインストールする。
#] yum -y --enablerepo=rpmforge install spamassassin
SpamAssassinの初期設定では、日本語のスパムメールに対応していないため対応させるためは、TLEC で公開されている日本語のスパムメールに対応したSpamAssassin用のルールファイルをセットアップする。

 1.SpamAssassin用ルールファイル更新スクリプトを作成する。
#] vi /root/spamassassin-update.sh
 2.以下のコードを入力し、保存する。
#] #!/bin/sh
# TLEC(http://tlec.linux.or.jp/) ←最新のルートファイルをダウンロード
cd /etc/mail/spamassassin
wget -qN http://tlec.linux.or.jp/docs/user_prefs
cp user_prefs local.cf
/etc/rc.d/init.d/spamassassin restart
※spamassassinを再起動しないと、local.cfの変更が有効にならない
 3.作成したファイルに実行権を付ける。
#] chmod 700 /root/spamassassin-update.sh
 4.スクリプトを実行する。
#] /root/spamassassin-update.sh
 5.SpamAssassin用ルールファイルが作成されたか、確認する。
#] ls -al /etc/mail/spamassassin/
合計 404
drwxr-xr-x 2 root root 4096 12月 26 09:50 .
drwxr-xr-x 3 root root 4096 12月 24 16:00 ..
-rw-r--r-- 1 root root 935 11月 9 12:53 init.pre
-rw-r--r-- 1 root root 184500 12月 26 09:51 local.cf ←ここが追加
-rw-r--r-- 1 root root 62 11月 9 12:53 spamassassin-default.rc
-rwxr-xr-x 1 root root 35 11月 9 12:53 spamassassin-helper.sh
-rw-r--r-- 1 root root 55 11月 9 12:53 spamassassin-spamc.rc
-rw-r--r-- 1 root root 184500 12月 25 13:00 user_prefs
 6.一定期間ごとに更新するよう、cronに登録する。これにより、常に最新のスパム情報を取得できる。
#] crontab -e
00 04 * * * /root/spamassassin-update.sh
以上の設定が終わったら、SpamAssassinをデーモンとして起動する。ついでに自動起動されるように登録しておきます。
#] service spamassassin start
#] chkconfig spamassassin on


Procmailの設定

Sendmailでは、デフォルトでProcmailが使用できますのでSpamAssassinによりメールヘッダにスパムメールの印を付けられたメールはスパムメール用メールボックスへ、それ以外のメールは通常通り各ユーザのメールボックスへと配送するよう、Procmailの設定を行います。
Procmailはデフォルトで /etc/procmailrc というファイルを見に行くため、そのファイルを作成する。

 1.
Procmailの設定ファイルを作成する。
#] vi /etc/procmailrc
 2.以下のコードを入力し、保存する。
PATH=/bin:/usr/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
SPAM=$MAILDIR/.spam/
#LOCKFILE=$HOME/.lockmail ←# Maildir形式の場合はコメントアウトする(パフォーマンスが下がる)
#LOGFILE=$HOME/procmail.log ←# ログ出力先
#VERBOSE=ON ←# 詳細ログ出力

# メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動する
:0fw
*!^X-Spam.*
|spamassassin

# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納する
#:0
#*^X-Spam-Status: Yes
#$SPAM
次に、スパムメール用メールボックスを作成する。

 1.
rootユーザ用のスパムメール用メールボックスを、次のように作成する。
#] mkdir /root/Maildir/.spam
#] chmod 700 /root/Maildir/.spam/
#] echo spam >> /root/Maildir/.subscriptions
 2.他のユーザ(ActiveDirectoryに登録されていて、メールを利用するユーザ)は、ユーザディレクトリが作成されたとき(初めてPOP/SMTP認証を行ったとき)に自動的にスパムメール用メールボックスが作成されるようにする。
#] mkdir -p /etc/skel/Maildir/.spam
#] chmod -R 700 /etc/skel/Maildir/
#] echo spam >> /etc/skel/Maildir/.subscriptions
#] chmod 600 /etc/skel/Maildir/.subscriptions ons


動作確認

Outlook Express
で受信したメールが、SpamAssassinを経由しているかどうか確認する。自分宛にメールを送信し、受信したメールのヘッダ情報を見ればよい。Outlook Expressなどで自分宛に送ったメールは、受信トレイをクリックして送ったメールをクリックしてメールを開き、ファイル → プロパティ → 詳細を表示させると、ヘッダ部分の下の方に「X-Spam-xxxxxxxx」という項目が見つけこの項目があればOKです。

次に、スパムメールを判断するかを確認する。サーバ上で次のコマンドを実行し、任意のアカウントに直接スパムメールを送る。

受信したメールのヘッダ情報を見ると、「X-Spam-Status: Yes」という記述を見つけることができる。

このステータスが「Yes」になっていると、スパムメールと判断したことになる。
スパムメールと判断したメールをサーバ側で削除(実際には.spamディレクトリに移動)させるには、Procmailの設定ファイル /etc/procmailrc をviで開き、最終行3行のコメントアウトを解除する。
#] vi /etc/procmailrc
# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納する
:0
*^X-Spam-Status: Yes
$SPAM
修正後、SpamAssassinを再起動すると、設定が有効になる。
#] /etc/rc.d/init.d/spamassassin restart
再起動後、スパムメールのチェックをもう一度行う。サーバ側でスパムメールの振り分けを行うため、Outlook Expressで受信できなくなったことが確認できる。
IMAPに対応したメーラーを使うと、spamフォルダに自動的に振り分けられることが確認できる。


SPAMの学習

spamフォルダには、spamassassinがSPAMと判断したメールが自動的に格納されるが、SPAMと判断しなかったメールは通常のメールとして受信することになります。
SPAMの振り分けを有効にした場合、POPでは通常のメールしか受信できないが、IMAPに対応したサーバーを使うと、spamフォルダの中を見ることができる。
 そこで、SPAMと判断されなかったメールをspamフォルダにメーラー側で移動させ、そのメールがSPAMであることをspamassassinに学習させることにより、SPAMの検出率を上げることが出来る。
 1.
SPAM学習スクリプトを作成する。
#] vi /root/sa-learn.sh
 2.以下のコードを入力し、保存する。
  • #!/bin/sh

    # spamフォルダ内のメールをSPAMとして学習させる
    /usr/bin/sa-learn --spam /home/*/Maildir/.spam/cur
    # curフォルダ内のメールを通常のメールとして学習させる
    /usr/bin/sa-learn --ham /home/*/Maildir/cur

    # spamフォルダ内のメールを削除するなら、以下のコメントを解除する
    #/bin/rm -f /home/*/Maildir/.spam/cur/*
  • 作成したファイルに実行権を付ける。
  •  3.作成したファイルに実行権を付ける。
    #] chmod 700 /root/sa-learn.sh
     4.スクリプトを実行して確認する。
    #] /root/sa-learn.sh
    Learned from 0 message(s) (43 message(s) examined). ←43個のメールをSPAMとして学習
    Learned from 0 message(s) (6 message(s) examined). ←6つのメールを普通のメールとして学習
     5.一定期間ごとに学習させるよう、cronに登録する。
    #] crontab -e
    00 02 * * * /root/sa-learn.sh
    この例では、夜中の2時に学習を行い、最終行のコメントを外していれば、spamフォルダに振り分けられたメールが全て削除される。


    誤認識への対応

    SPAMの学習をさせていても、どうしてもSPAM判定してしまうメールアドレスがある場合、whitelistに登録して、SPAMではないメールとして認識させればよい。
    whitelistは通常、各ユーザディレクトリにあるuser_prefファイルか、全ユーザ共通の/etc/mail/spamassassin/local.cfファイルに記述する。しかし私のやり方ではlocal.cfは毎日更新されてしまうため、local.cfに直接記述することはできない。
    よって、次のようにwhitelistを管理することにした。
     1.whitelistファイルの作成
    例えば/root/whitelistというファイルを作成し、SPAM判定してほしくないメールアドレスを次のように記述する。
    whitelist_from SPAM判定してほしくないメールアドレス1
    whitelist_from SPAM判定してほしくないメールアドレス2
          ・
          ・
          ・
     2.local.cfにwhitelistファイルの内容が追加されるように設定
    /etc/mail/spamassassin/local.cfファイルはトップのSpamAssassinのスパム対策により、1日1回更新される。よって、このスクリプトファイル(/root/spamassassin-update.sh)を次のように修正し、更新されたlocal.cfファイルの末尾にwhitelistの内容が追加されるようにする。
    #!/bin/sh

    # TLEC(http://tlec.linux.or.jp/) ←最新のルートファイルをダウンロード
    cd /etc/mail/spamassassin
    wget -qN http://tlec.linux.or.jp/docs/user_prefs
    cp user_prefs local.cf
    cat /root/whitelist >> local.cf
    /etc/rc.d/init.d/spamassassin restart
    確認のため、スクリプトを実行し、local.cfファイルにwhitelistの内容が追加されているかを確認する。
    #] /root/spamassassin-update.sh
    #] tail -10 /etc/mail/spamassassin/local.cf

    戻 る