SpamAssassinを使用してメールサーバー側でメールに対するスパムチェックを行う。
メールサーバー(Postfix)とSpamAssassinとの連携はmilter-managerとspamass-milterを利用して行なう。
ここでは、自宅サーバーに構築したメールサーバーに外部から送られてきたメールのスパムチェックを行ない、スパムメールであると判断した場合、受信メールサーバーがIMAPの場合はProcmailを使用してスパムメール専用のメールボックスへ配送するようにし、受信メールサーバーがPOPの場合はメールソフトで振分けられるようにメール件名に「***SPAM***」という文字列を付加するようにする。
※メールサーバーを導入済であること
EPELリポジトリ導入(EPEL)を参照してEPELリポジトリを導入する |
[root@localhost ~]# yum -y install spamassassin spamass-milter-postfix ← SpamAssassin・spamass-milterインストール |
[root@localhost ~]# systemctl start spamassassin ← SpamAssassin起動 |
[root@localhost ~]# systemctl enable spamassassin ← SpamAssassin自動起動設定 |
SpamAssassinの初期設定では日本語のスパムメールに対応していないため、Web上で公開されている日本語のスパムメールに対応したSpamAssassin設定ファイルをセットアップする。
[root@localhost ~]# vi /etc/mail/spamassassin/v310.pre ← v310.pre編集 |
# TextCat - language guesser # loadplugin Mail::SpamAssassin::Plugin::TextCat ← 行頭の#を削除してコメント解除(TextCatプラグイン有効化) ※SpamAssassin設定ファイルok_languagesオプションを有効にするため |
[root@localhost ~]# vi /etc/cron.daily/spamassassin-update ← SpamAssassin設定ファイル日次最新化スクリプト作成 |
#!/bin/bash # SpamAssassin設定ファイル最新版ダウンロード cd /etc/mail/spamassassin wget -qN http://www.flcl.org/~yoh/user_prefs # 設定ファイル更新時のみSpamAssassin再起動 diff user_prefs user_prefs.org > /dev/null 2>&1 if [ $? -ne 0 ]; then cp user_prefs local.cf # スパム判断したメールを添付形式にしないように設定 echo "report_safe 0" >> local.cf # スパム判断したメールの件名に「***SPAM***」を付加するように設定※受信メールサーバーがPOPの場合のみ echo "rewrite_header Subject ***SPAM***" >> local.cf # SpamAssassin再起動 if [ -f /etc/rc.d/init.d/spamassassin ]; then /etc/rc.d/init.d/spamassassin restart > /dev/null else systemctl restart spamassassin > /dev/null fi fi cp user_prefs user_prefs.org |
[root@localhost ~]# chmod +x /etc/cron.daily/spamassassin-update ← SpamAssassin設定ファイル日次最新化スクリプトへ実行権限付加 |
[root@localhost ~]# /etc/cron.daily/spamassassin-update ← SpamAssassin設定ファイル日次最新化スクリプト実行 |
[root@localhost ~]# vi /etc/cron.d/sa-update ← SpamAssassinルール自動更新cron設定ファイル編集 |
10 4 * * * root /usr/share/spamassassin/sa-update.cron 2>&1 | tee -a /var/log/sa-update.log ← 行頭の#を削除(コメント解除) |
※下記はCRONからArgument "1.39_01" isn't numeric in subroutine entry at /usr/bin/sa-update line 81.というエラーメールが送られてくる場合の対処
[root@localhost ~]# vi /usr/lib/perl5/vendor_perl/5.8.8/Archive/Tar.pm ← Tar.pm編集 |
$VERSION = "1.39_01"; $VERSION = eval $VERSION; ← 追加 |
[root@localhost ~]# systemctl start spamass-milter ← spamass-milter起動 |
[root@localhost ~]# systemctl enable spamass-milter ← spamass-milter自動起動設定 |
[root@localhost ~]# curl -s https://packagecloud.io/install/repositories/milter-manager/repos/script.rpm.sh | bash ← milter-manager_reposリポジトリ追加 |
[root@localhost ~]# yum -y install milter-manager ← milter-managerインストール |
[root@localhost ~]# systemctl start milter-manager ← milter-manager起動 |
[root@localhost ~]# systemctl enable milter-manager ← milter-manager自動起動設定 |
[root@localhost ~]# vi /etc/milter-manager/defaults/redhat.conf ← milter-manager設定ファイル編集 |
[ "spamass-milter", [ #"Remote Network", ← 行頭に#を追加してコメントアウト(ローカルからのメールもスパムチェックを行う)※Fetchmailで取り込んだメールのスパムチェックを行う場合のみ "Unauthenticated", "No Stress", ], ], |
[root@localhost ~]# systemctl restart milter-manager ← milter-manager再起動 |
[root@localhost ~]# vi /etc/postfix/main.cf ← Postfix設定ファイル編集 |
下記を追加 milter_protocol = 6 milter_default_action = tempfail milter_mail_macros = {auth_author} {auth_type} {auth_authen} smtpd_milters = unix:/var/run/milter-manager/milter-manager.sock |
[root@localhost ~]# usermod -G milter-manager -a postfix ← milter-managerグループにpostfixユーザーを追加 |
[root@localhost ~]# systemctl reload postfix ← Postfix設定反映 |
[root@localhost ~]# usermod -G postfix -a milter-manager ← postfixグループにmilter-managerユーザーを追加 |
[root@localhost ~]# systemctl restart milter-manager ← milter-manager再起動 |
[root@localhost ~]# vi /etc/procmailrc ← procmail設定ファイル作成 |
SHELL=/bin/bash PATH=/usr/bin:/bin DROPPRIVS=yes MAILDIR=$HOME/Maildir DEFAULT=$MAILDIR/ LOGFILE=$HOME/.procmail.log # ログ出力先 VERBOSE=ON # 詳細ログ出力 # SpamAssassinにより判定されたSpam-Levelが一定値(ここでは20)以上の場合は削除 # ※必要なメールが削除されてしまう可能性があることに留意すること :0 * ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* /dev/null |
[root@localhost ~]# vi /etc/logrotate.d/procmail ← procmailログローテーション設定ファイル作成 |
/home/*/.procmail.log { missingok nocreate notifempty } |
[root@localhost ~]# vi /etc/postfix/main.cf ← Postfix設定ファイル編集 |
# The mailbox_command parameter specifies the optional external # command to use instead of mailbox delivery. The command is run as # the recipient with proper HOME, SHELL and LOGNAME environment settings. # Exception: delivery for root is done as $default_user. # # Other environment variables of interest: USER (recipient username), # EXTENSION (address extension), DOMAIN (domain part of address), # and LOCAL (the address localpart). # # Unlike other Postfix configuration parameters, the mailbox_command # parameter is not subjected to $parameter substitutions. This is to # make it easier to specify shell syntax (see example below). # # Avoid shell meta characters because they will force Postfix to run # an expensive shell process. Procmail alone is expensive enough. # # IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN # ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER. # #mailbox_command = /some/where/procmail #mailbox_command = /some/where/procmail -a "$EXTENSION" mailbox_command = /usr/bin/procmail ← 追加(Procmailと連携するようにする) |
[root@localhost ~]# systemctl reload postfix ← Postfix設定反映 |
SpamAssassinによりメールヘッダにスパムメールの印を付けられたメールはスパム専用メールボックスへ、その他のメールは通常どおりのメールボックスへ配送するようにする。
既存ユーザーについては、メールボックスにスパム専用メールボックスを追加する。
また、新規ユーザーについては、ユーザー追加時に自動でスパム専用メールボックスが作成されるようにする 。
【既存ユーザー対処】 |
[root@localhost ~]# vi spamfolder-create ← スパム専用メールボックス作成スクリプト作成 |
#!/bin/bash for user in `ls /home` do id -u $user > /dev/null 2>&1 if [ $? -eq 0 ] && [ ! -d /home/$user/Maildir/.Spam/new ]; then mkdir -p /home/$user/Maildir/.Spam/new mkdir -p /home/$user/Maildir/.Spam/cur mkdir -p /home/$user/Maildir/.Spam/tmp chmod -R 700 /home/$user/Maildir/.Spam chown -R $user. /home/$user/Maildir/.Spam echo $user fi done |
[root@localhost ~]# sh spamfolder-create ← スパム専用メールボックス作成スクリプト実行 |
user ・ ・ ・ user |
[root@localhost ~]# rm -f spamfolder-create ← スパム専用メールボックス作成スクリプト削除 |
【新規ユーザー対処】 |
[root@localhost ~]# mkdir -p /etc/skel/Maildir/.Spam/{new,cur,tmp} ← 新規ユーザー追加時に自動でスパム専用メールボックス作成(1/2) |
[root@localhost ~]# chmod -R 700 /etc/skel/Maildir/.Spam ← 新規ユーザー追加時に自動でスパム専用メールボックス作成(2/2) |
SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送するようにする。
[root@localhost ~]# vi /etc/procmailrc ← procmail設定ファイル編集 |
以下を最後尾へ追加 |
# SpamAssassinがスパム判定したメールはスパム専用メールボックス(/home/xxxx/Maildir/.Spam)へ配送 |
:0 |
*^X-Spam-Flag: YES $HOME/Maildir/.Spam/ |
自分自身に空メールを送ってみて、受信したメールのヘッダに以下のメッセージが付加されていること
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on hoge.com
自分自身にテストスパムメール(メール本文が「XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X」のメール)を送ってみて、受信メールサーバー別に以下のようになること
※テストスパムメールはスパムスコアが高く、/etc/procmailrcの「SpamAssassinにより判定されたSpam-Levelが一定値(ここでは20)以上の場合は削除」のルールを有効にしているとサーバー側で削除されてしまうので、Spamフォルダへの配送を確認する際は当該ルールを一時的にコメントアウトしてから確認すること
【受信メールサーバーがPOPの場合】
メール件名に「***SPAM***」が付加されてSpamフォルダへ配送されていること
【受信メールサーバーがIMAPの場合】
Spamフォルダへ配送されていること
SpamAssassinが誤って正常メールをスパムメールと判断したり、逆にスパムメールを正常メールと判断してしまった場合、以後の誤認識を防止するためにSpamAssassinに学習をさせ、チェック精度を上げる。
ここでは、受信トレイの既読メールを正常メールとして、Spamフォルダの既読メールをスパムメールとして、定期的にSpamAssassinに学習させるようにする。
※SpamAssassinが誤って配送したメールは、ユーザー自身の操作により正常メールなら受信トレイへ、スパムメールならSpamフォルダへ移動しておくこと
(放置しておくと正常メールをスパムメールとして学習したり、逆にスパムメールを正常メールとして学習してしまう)
[root@localhost ~]# yum -y install tmpwatch ← tmpwatchインストール※古いスパムメールを削除するため |
[root@localhost ~]# vi /etc/cron.daily/spamassassin-learn ← SpamAssassin日次学習スクリプト作成 |
#!/bin/bash PATH=/usr/sbin:/usr/bin:/bin for user in `ls /home/` do # 正常メール学習 # 正常メールをSpamAssassinに学習させる hammail=/home/$user/Maildir/cur [ -d "$hammail" ] && \ su $user -s "/bin/bash" -c "sa-learn --ham $hammail | \ logger -p mail.info -t 'sa-learn for $user'" hammail=/home/$user/Maildir/.Trash/cur [ -d "$hammail" ] && \ su $user -s "/bin/bash" -c "sa-learn --ham $hammail | \ logger -p mail.info -t 'sa-learn for $user'" # スパムメール spammail=/home/$user/Maildir/.Spam/cur # スパムメール学習 if [ -d "$spammail" ]; then # スパムメールをSpamAssassinに学習させる su $user -s "/bin/bash" -c "sa-learn --spam $spammail | \ logger -p mail.info -t 'sa-learn for $user'" # 受信後一ヶ月経過したスパムメールを削除 tmpwatch -m 720 $spammail fi done |
[root@localhost ~]# chmod +x /etc/cron.daily/spamassassin-learn ← SpamAssassin日次学習スクリプトに実行権限付加 |
※スパムメール学習結果のログは/var/log/maillogに記録される