メールサーバ側で迷惑(spam)メール対策を行う方法を紹介する。これにより、クライアント側で行う対策をある程度軽減できる。対策には、SpamAssassinというフリーのspam対策ソフトウェアを利用する。
SpamAssassinはPerlスクリプトだが、Redhat Linux用のパッケージが用意されているので、yumで普通にインストールできる。
SpamAssassinは、amavisd-newをインストールする際に、一緒にインストールされるので、確認する。# rpm -q spamassassin
spamassassin-3.1.7-1.el4.rfもしインストールされていなかったら、次のようにインストールする。
# yum -y --enablerepo=rpmforge install spamassassin
SpamAssassinの初期設定では、日本語のスパムメールに対応していない。対応させるため、TLECで公開されている日本語のスパムメールに対応したSpamAssassin用のルールファイルをセットアップする。
- SpamAssassin用ルールファイル更新スクリプトを作成する。
# vi /root/spamassassin-update.sh
- 以下のコードを入力し、保存する。
#!/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/amavisd restart※amavisd-newを再起動しないと、local.cfの変更が有効にならない
- 作成したファイルに実行権を付ける。
# chmod 700 /root/spamassassin-update.sh
- スクリプトを実行する。
# /root/spamassassin-update.sh
- 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- 一定期間ごとに更新するよう、cronに登録する。これにより、常に最新のスパム情報を取得できる。
# crontab -e
00 04 * * * /root/spamassassin-update.sh以上の設定が終わったら、SpamAssassinをデーモンとして起動する。ついでに自動起動されるように登録しておく。
# chkconfig spamassassin on
# /etc/rc.d/init.d/spamassassin start
SpamAssassinによりメールヘッダにスパムメールの印を付けられたメールはスパムメール用メールボックスへ、それ以外のメールは通常通り各ユーザのメールボックスへ配送するよう、Procmailの設定を行う。
Procmailはデフォルトで /etc/procmailrc というファイルを見に行くため、そのファイルを作成する。
- Procmailの設定ファイルを作成する。
# vi /etc/procmailrc
- 以下のコードを入力し、保存する。
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次に、スパムメール用メールボックスを作成する。
- rootユーザ用のスパムメール用メールボックスを、次のように作成する。
# mkdir /root/Maildir/.spam
# chmod 700 /root/Maildir/.spam/
# echo spam >> /root/Maildir/.subscriptions- 他のユーザ(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
PostfixがProcmailと連携するよう、Postfixの設定ファイル /etc/postfix/main.cf をviで開き、次のように修正する。
mailbox_command = /usr/bin/procmail ←コメントを解除し、修正
修正したら、設定を反映させる。
# /etc/rc.d/init.d/postfix reload
受信したメールが、SpamAssassinを経由しているかどうか確認する。自分宛にメールを送信し、受信したメールのヘッダ情報を見ればよい。Outlook Expressなどで受信したメールを開き、メールのプロパティを表示させると、ヘッダ部分に「X-Spam-xxx」という項目が見つかる。この項目があれば成功。
次に、スパムメールを判断するかを確認する。サーバ上で次のコマンドを実行し、任意のアカウントに直接スパムメールを送る。
# echo "XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X"|mail 任意のアカウント
実行後、Outlook Expressでそのメールを受信してみる。SPAMメールの振り分けは無効にしてあるので、受信はできるはず。
受信したメールのヘッダ情報を見ると、「X-Spam-Status: Yes」という記述を見つけることができる。
このステータスが「Yes」になっていると、スパムメールと判断したことになる。
スパムメールと判断したメールをサーバ側で削除(実際には.spamディレクトリに移動)させるには、Procmailの設定ファイル /etc/procmailrc をviで開き、最終行3行のコメントアウトを解除する。# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納する
:0
*^X-Spam-Status: Yes
$SPAM修正後、SpamAssassinを再起動すると、設定が有効になる。
# /etc/rc.d/init.d/spamassassin restart
再起動後、スパムメールのチェックをもう一度行う。サーバ側でスパムメールの振り分けを行うため、Outlook Expressで受信できなくなったことが確認できる。
IMAPに対応したメーラーを使うと、spamフォルダに自動的に振り分けられることが確認できる。
spamフォルダには、spamassassinがSPAMと判断したメールが自動的に格納されるが、SPAMと判断しなかったメールは通常のメールとして受信することになる(当たり前だが)。
SPAMの振り分けを有効にした場合、POPでは通常のメールしか受信できないが、IMAPに対応したメーラーを使うと、spamフォルダの中を見ることができる。
そこで、SPAMと判断されなかったメールをspamフォルダにメーラー側で移動させ、そのメールがSPAMであることをspamassassinに学習させることにより、SPAMの検出率を上げることが出来る。
- SPAM学習スクリプトを作成する。
# vi /root/sa-learn.sh
- 以下のコードを入力し、保存する。
#!/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/*- 作成したファイルに実行権を付ける。
# chmod 700 /root/sa-learn.sh
- スクリプトを実行して確認する。
# /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つのメールを普通のメールとして学習- 一定期間ごとに学習させるよう、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ファイルは12-2の設定により、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/amavisd restart確認のため、スクリプトを実行し、local.cfファイルにwhitelistの内容が追加されているかを確認する。
# /root/spamassassin-update.sh
# tail -10 /etc/mail/spamassassin/local.cf
メールサーバはPOPとIMAPの2つの形態で運用できる。もちろん両方を同時に利用することもできるが、どちらで運用するべきだろか。
POPの場合
先にも説明したが、SPAMの振り分けを有効にすると、POPでは通常のメールしか受信できず、spamフォルダを利用することが出来ない。そのため、spamフォルダにはSPAMメールがたまり続けてしまう。よって、サーバ側で一定時間ごとにspamフォルダ内のメールを削除しなければならない。
しかし、誤ってSPAMと認識されてしまったメールがあった場合、受信することが出来ないため、問答無用で削除されてしまう。
また、SPAMと認識されなかったメールをSPAMとして認識させたくても、spamフォルダを利用できないため、学習させることが出来ず、SPAMと認識されてしまったメールを通常のメールとして学習させることも出来ない。
よって、POPで運用する場合、メールサーバを次のように設定するのが良いだろう。
- SPAMの学習機能は使えないため、設定しない。
- 多少の誤認識(特にSPAMと認識されてしまったメールをどうするか)に目をつむるなら、サーバ側で対策を行う。誤認識を認めないなら、サーバ側での対策は諦める。
IMAPの場合
IMAPは、サーバに格納されているメールデータをクライアントPCから参照するだけなので、spamフォルダも利用できる。そのため、誤認識したメールを正しいフォルダに入れることにより、サーバに学習させることが出来る。
この場合、注意するべき点は、次の3点である。
- メールサーバが学習する前にspamフォルダ内のメールを削除してしまうと、学習できない。
- spamフォルダ内を自動的に削除するように設定すると、メールチェックしていない間に届いたメールが誤認識により削除される可能性がある。
- 自動削除をしないと、人によってはspamフォルダ内のメールを放置してしまうため、メールサーバ内にSPAMメールがたまり続けてしまう。
また、Outlook ExpressでIMAPを使う場合、通常のローカルフォルダとは違うツリーが作成されてしまうし、ツールボタンも変わる。
メールのチェックも、「送受信」ボタンは意味を成さず、画面を更新することによってメールの確認が出来る。この辺り(操作性が変わってしまう)が、パソコンにあまり詳しくない人には難しいかもしれない。
まとめ
このように、POPを使う場合、IMAPを使う場合で考え方がずいぶん違うことが分かる。よーく考えて
- POPで運用?IMAPで運用?両方使えるようにする?
- SPAMの振り分けを有効にする?しない?
- SPAMの学習をさせる?させない?
を決めよう。
SpamAssassinはClamAntiVirusをインストールした際に、一緒にインストールされたものである。よって、これも通常のyumによるアップデートでは更新されない。
ClamAntiVirusをアップデートしたら、SpamAssassinも一緒にアップデートしておこう。# yum -y --enablerepo=rpmforge spamassassin
SpamAssassinには設定ファイルがないので、再起動だけでよい。念のため、メールサーバも再起動しておこう。
# /etc/rc.d/init.d/spamassassin restart
# /etc/rc.d/init.d/postfix restart