12.SpamAssassinによるスパムメール対策

 メールサーバ側で迷惑(spam)メール対策を行う方法を紹介する。これにより、クライアント側で行う対策をある程度軽減できる。対策には、SpamAssassinというフリーのspam対策ソフトウェアを利用する。

  1. 導入
  2. 起動前準備・起動
  3. Procmailの設定
  4. Postfix−Procmail連携
  5. 動作確認
  6. SPAMの学習をさせる
  7. 誤認識への対応
  8. 運用について
  9. SpamAssassinのアップデート

12-1 導入

 SpamAssassinはPerlスクリプトだが、Redhat Linux用のパッケージが用意されているので、yumで普通にインストールできる。
 SpamAssassinは、amavisd-newをインストールする際に、一緒にインストールされるので、確認する。

# rpm -q spamassassin
spamassassin-3.1.7-1.el4.rf

 もしインストールされていなかったら、次のようにインストールする。

# yum -y --enablerepo=rpmforge install spamassassin

12-2 起動前準備・起動

 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/amavisd restart

    ※amavisd-newを再起動しないと、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をデーモンとして起動する。ついでに自動起動されるように登録しておく。

# chkconfig spamassassin on
# /etc/rc.d/init.d/spamassassin start

12-3 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

12-4 Postfix−Procmail連携

 PostfixがProcmailと連携するよう、Postfixの設定ファイル /etc/postfix/main.cf をviで開き、次のように修正する。

mailbox_command = /usr/bin/procmail ←コメントを解除し、修正

 修正したら、設定を反映させる。

# /etc/rc.d/init.d/postfix reload

12-5 動作確認

 受信したメールが、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フォルダに自動的に振り分けられることが確認できる。

12-6 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フォルダに振り分けられたメールが全て削除される。

12-7 誤認識への対応

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

12-8 運用について

 メールサーバはPOPとIMAPの2つの形態で運用できる。もちろん両方を同時に利用することもできるが、どちらで運用するべきだろか。

POPの場合

 先にも説明したが、SPAMの振り分けを有効にすると、POPでは通常のメールしか受信できず、spamフォルダを利用することが出来ない。そのため、spamフォルダにはSPAMメールがたまり続けてしまう。よって、サーバ側で一定時間ごとにspamフォルダ内のメールを削除しなければならない。

 しかし、誤ってSPAMと認識されてしまったメールがあった場合、受信することが出来ないため、問答無用で削除されてしまう。

 また、SPAMと認識されなかったメールをSPAMとして認識させたくても、spamフォルダを利用できないため、学習させることが出来ず、SPAMと認識されてしまったメールを通常のメールとして学習させることも出来ない。

 よって、POPで運用する場合、メールサーバを次のように設定するのが良いだろう。

IMAPの場合

 IMAPは、サーバに格納されているメールデータをクライアントPCから参照するだけなので、spamフォルダも利用できる。そのため、誤認識したメールを正しいフォルダに入れることにより、サーバに学習させることが出来る。

 この場合、注意するべき点は、次の3点である。

  1. メールサーバが学習する前にspamフォルダ内のメールを削除してしまうと、学習できない。
  2. spamフォルダ内を自動的に削除するように設定すると、メールチェックしていない間に届いたメールが誤認識により削除される可能性がある。
  3. 自動削除をしないと、人によってはspamフォルダ内のメールを放置してしまうため、メールサーバ内にSPAMメールがたまり続けてしまう。

 また、Outlook ExpressでIMAPを使う場合、通常のローカルフォルダとは違うツリーが作成されてしまうし、ツールボタンも変わる。

 メールのチェックも、「送受信」ボタンは意味を成さず、画面を更新することによってメールの確認が出来る。この辺り(操作性が変わってしまう)が、パソコンにあまり詳しくない人には難しいかもしれない。

まとめ

 このように、POPを使う場合、IMAPを使う場合で考え方がずいぶん違うことが分かる。よーく考えて

を決めよう。

12-9 SpamAssassinのアップデート

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


[ Back ]