メールサーバーでスパムチェック(Postfix+SpamAssassin+milter-manager+spamass-milter)

最終更新日: 2021.07.31

■概要

SpamAssassinを使用してメールサーバー側でメールに対するスパムチェックを行う。
メールサーバー(Postfix)とSpamAssassinとの連携はmilter-managerspamass-milterを利用して行なう。
ここでは、自宅サーバーに構築したメールサーバーに外部から送られてきたメールのスパムチェックを行ない、スパムメールであると判断した場合、受信メールサーバーがIMAPの場合はProcmailを使用してスパムメール専用のメールボックスへ配送するようにし、受信メールサーバーがPOPの場合はメールソフトで振分けられるようにメール件名に「***SPAM***」という文字列を付加するようにする。

メールサーバーを導入済であること


■SpamAssassin・spamass-milterインストール

EPELリポジトリ導入(EPEL)を参照してEPELリポジトリを導入する

[root@centos ~]# yum -y install spamassassin spamass-milter-postfix ← SpamAssassin・spamass-milterインストール

■SpamAssassin起動

[root@centos ~]# systemctl start spamassassin ← SpamAssassin起動

■SpamAssassin設定

SpamAssassinの初期設定では日本語のスパムメールに対応していないため、Web上で公開されている日本語のスパムメールに対応したSpamAssassin設定ファイルをセットアップする。
[root@centos ~]# vi /etc/mail/spamassassin/v310.pre ← v310.pre編集
# TextCat - language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat ← 行頭の#を削除してコメント解除(TextCatプラグイン有効化)
※SpamAssassin設定ファイルok_languagesオプションを有効にするため

[root@centos ~]# vi /etc/cron.daily/spamassassin-update ← SpamAssassin設定ファイル日次最新化スクリプト作成
#!/bin/bash

# SpamAssassin設定ファイル最新版ダウンロード
cd /etc/mail/spamassassin

wget -q https://github.com/kittyfreak/spamassassin_user_prefs/archive/refs/heads/main.zip
[ $? -ne 0 ] && exit

unzip main.zip >/dev/null 2>&1
[ $? -ne 0 ] && exit
rm -f main.zip

mv spamassassin_user_prefs-main/user_prefs .
rm -rf spamassassin_user_prefs-main

# 設定ファイル更新時のみ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@centos ~]# chmod +x /etc/cron.daily/spamassassin-update ← SpamAssassin設定ファイル日次最新化スクリプトへ実行権限付加

[root@centos ~]# /etc/cron.daily/spamassassin-update ← SpamAssassin設定ファイル日次最新化スクリプト実行

[root@centos ~]# 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@centos ~]# vi /usr/lib/perl5/vendor_perl/5.8.8/Archive/Tar.pm ← Tar.pm編集
$VERSION                = "1.39_01";
$VERSION                = eval $VERSION; ← 追加

■spamass-milter起動

[root@centos ~]# systemctl start spamass-milter ← spamass-milter起動

[root@centos ~]# systemctl enable spamass-milter ← spamass-milter自動起動設定

■milter-managerインストール※既に導入済の場合は不要

[root@centos ~]# curl -s https://packagecloud.io/install/repositories/milter-manager/repos/script.rpm.sh | bash ← milter-manager_reposリポジトリ追加

[root@centos ~]# yum -y install milter-manager ← milter-managerインストール

■milter-manager起動※既に導入済の場合は不要

[root@centos ~]# systemctl start milter-manager ← milter-manager起動

[root@centos ~]# systemctl enable milter-manager ← milter-manager自動起動設定

■milter-manager設定

[root@centos ~]# vi /etc/milter-manager/defaults/redhat.conf ← milter-manager設定ファイル編集
  [
    "spamass-milter",
    [
      #"Remote Network", ← 行頭に#を追加してコメントアウト(ローカルからのメールもスパムチェックを行う)Fetchmailで取り込んだメールのスパムチェックを行う場合のみ
      "Unauthenticated",
      "No Stress",
    ],
  ],

[root@centos ~]# systemctl restart milter-manager ← milter-manager再起動

■Postfix・milter-manager連携設定※既に導入済の場合は不要

[root@centos ~]# 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@centos ~]# usermod -G milter-manager -a postfix ← milter-managerグループにpostfixユーザーを追加

[root@centos ~]# systemctl reload postfix ← Postfix設定反映

■milter-manager・spamass-milter連携設定

[root@centos ~]# usermod -G postfix -a milter-manager ← postfixグループにmilter-managerユーザーを追加

[root@centos ~]# systemctl restart milter-manager ← milter-manager再起動

■Procmail設定

[root@centos ~]# 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@centos ~]# vi /etc/logrotate.d/procmail ← procmailログローテーション設定ファイル作成
/home/*/.procmail.log {
    missingok
    nocreate
    notifempty
}

■Postfix・Procmail連携設定

[root@centos ~]# 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@centos ~]# systemctl reload postfix ← Postfix設定反映

■スパムメール振分け設定(受信メールサーバーがIMAPの場合のみ)

SpamAssassinによりメールヘッダにスパムメールの印を付けられたメールはスパム専用メールボックスへ、その他のメールは通常どおりのメールボックスへ配送するようにする。

(1)スパム専用メールボックス作成
既存ユーザーについては、メールボックスにスパム専用メールボックスを追加する。
また、新規ユーザーについては、ユーザー追加時に自動でスパム専用メールボックスが作成されるようにする 。
【既存ユーザー対処】
[root@centos ~]# 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@centos ~]# sh spamfolder-create ← スパム専用メールボックス作成スクリプト実行
user
・
・
・
user

[root@centos ~]# rm -f spamfolder-create ← スパム専用メールボックス作成スクリプト削除

【新規ユーザー対処】
[root@centos ~]# mkdir -p /etc/skel/Maildir/.Spam/{new,cur,tmp} ← 新規ユーザー追加時に自動でスパム専用メールボックス作成(1/2)

[root@centos ~]# chmod -R 700 /etc/skel/Maildir/.Spam ← 新規ユーザー追加時に自動でスパム専用メールボックス作成(2/2)

(2)スパムメール振分け設定
SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送するようにする。
[root@centos ~]# vi /etc/procmailrc ← procmail設定ファイル編集
以下を最後尾へ追加
# SpamAssassinがスパム判定したメールはスパム専用メールボックス(/home/xxxx/Maildir/.Spam)へ配送
:0
*^X-Spam-Flag: YES
$HOME/Maildir/.Spam/

■メールソフト設定(受信メールサーバーをPOPにする場合)

SpamAssassinによりメール件名に「***SPAM***」を付けられたメールはスパムメール用フォルダへ保存するようにする

(1)スパムメール用フォルダ作成
Thunderbirdを起動し、メニューの「ファイル」⇒「新規作成」⇒「フォルダー」で「名前」に"Spam"と入力して「フォルダーを作成」ボタン押下



(2)スパムメール振分けルール追加
Thunderbirdを起動し、メニューの「ツール」⇒「メッセージフィルター」で「新規」






「フィルター名」に任意の名前(例:"Spam振り分け")を入力
「すべての条件に一致」を選択
「件名」、「に次を含む」を選択してテキストボックスに"***SPAM***"と入力
「以下の動作を実行する」で「メッセージを移動する」、作成したスパムメール用フォルダを選択
「OK」ボタン押下

■spamass-milter確認

自分自身に空メールを送ってみて、受信したメールのヘッダに以下のメッセージが付加されていること
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on centossrv.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フォルダへ配送されていること

■スパムメール学習(受信メールサーバーがIMAPの場合のみ)

SpamAssassinが誤って正常メールをスパムメールと判断したり、逆にスパムメールを正常メールと判断してしまった場合、以後の誤認識を防止するためにSpamAssassinに学習をさせ、チェック精度を上げる。

ここでは、受信トレイの既読メールを正常メールとして、Spamフォルダの既読メールをスパムメールとして、定期的にSpamAssassinに学習させるようにする。
※SpamAssassinが誤って配送したメールは、ユーザー自身の操作により正常メールなら受信トレイへ、スパムメールならSpamフォルダへ移動しておくこと
(放置しておくと正常メールをスパムメールとして学習したり、逆にスパムメールを正常メールとして学習してしまう)

[root@centos ~]# yum -y install tmpwatch ← tmpwatchインストール※古いスパムメールを削除するため

[root@centos ~]# 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@centos ~]# chmod +x /etc/cron.daily/spamassassin-learn ← SpamAssassin日次学習スクリプトに実行権限付加
※スパムメール学習結果のログは/var/log/maillogに記録される


■関連コンテンツ




▲このページのトップへ戻る

プライバシーポリシー
centossrv.com