[Postfix+MySQL][CentOS] yumでSpamAssassinを導入

[Postfix+MySQL][CentOS] yumでSpamAssassinを導入

SpamAssasinのみをインストールしたくなったのでメールサーバ再構築のついでに試してみる。メールサーバ構築のまとめ でPostfix+MySQL+postfixadminは構築済みとして想定しています。そちらではウィルスチェックも導入しているため今回はスパムチェックのみの導入。

また、学習機能があるようなので試してみる。スパム判定の精度が高まるみたい。

  • .Spam ディレクトリの作成
  • スパムメールの学習
  • 通常のメールの学習

コレに合わせて postfixadmin +procmailな環境でメールディレクトリの自動作成・削除 のメールディレクトリ作成スクリプトに .Spam を作るコマンドを追加。

SpamAssassinのインストール

yum install spamassassin

procmailの設定

  • バーチャルドメインでのメールアカウントを使用。
  • 保存ディレクトリは /mail/domain.tld/user@domain.tld とする。
  • $DOMAINと$USERは Postfixのmaster.cfで取得している。

/etc/procmailrc を新規作成する。SpamAssassinの起動条件は参考ブログより引用。

# vi /etc/procmailrc

SHELL=/bin/bash
PATH=/usr/bin:/bin
DEFAULT=/mail/$DOMAIN/$USER\@$DOMAIN/
LOCKFILE=/mail/procmail.lock
LOGFILE=/mail/procmail.log   # ログ出力先
#VERBOSE=ON   # 詳細ログ出力

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

# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納します
:0
* ^X-Spam-Status: Yes
$DEFAULT/.Spam/

ログの肥大化を防ぐため、ログローテーション設定ファイル新規作成する。

# vi /etc/logrotate.d/procmail

/mail/procmail.log {
    missingok
    nocreate
    notifempty
}

Postfixとprocmailを連携させる

main.cf の設定

# vi /etc/postfix/main.cf

....最終行付近
# virtual_transport = virtual  ←コメントアウト
virtual_transport = procmail  ←追記
procmail_destination_recipient_limit = 1 ←追記

master.cf の設定

# vi /etc/postfix/master.cf

最終行に追記
procmail unix - n n - - pipe
  flags=R user=vuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

SpamAssassin起動

# service spamassassin start

SpamAssassin自動起動設定

# chkconfig spamassassin on

Postfixを再起動して設定を有効化

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

スパムメールの学習

スパムメールの判定制度を上げるために学習する事が出来る。また、迷惑メールではないメールの学習も可能。

スパムメールを学習するコマンド(全てのユーザのSpamフォルダを対象)
# /usr/bin/sa-learn --spam /mail/*/*/.Spam/cur
通常のメールを学習するコマンド(全てのユーザの受信フォルダを対象)
# /usr/bin/sa-learn --ham /mail/*/*/cur

参考ブログではcronに設定していたけど、Spamメールを確認してから手動でコマンドを実行するようにする。~/binにコマンドスクリプトを作成してsudoで実行できるようにしておく。

$ mkdir ~/bin
$ vi ~/bin/spam-learn 
#!/bin/sh

/usr/bin/sa-learn --spam /mail/*/*/.Spam/cur

# スパムメール保存ディレクトリの中身を強制的に消去してよいのなら以下の記述を追加
/bin/rm -f /mail/*/*/.Spam/cur/*
echo 'All Spam Mail Deleted.'

$ chmod 700 ~/bin/spam-learn
$ sudo chown root:root ~/bin/spam-learn

スパムメール学習コマンドを使う時

メーラーでSpamフォルダに迷惑メールしか無いと確認してから以下のコマンドで学習&スパムメール削除

$ sudo spam-learn

入れなおしたらかなりの確率でスパムメールを排除してくれる!

参考: