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の設定ファイルを作成する。
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学習スクリプトを作成する。
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 |