CentOS7

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

SpamAssassinを使用してメールサーバー側でメールに対するスパムチェックを行う。

メールサーバー(Postfix)SpamAssassinとの連携はmilter-managerspamass-milterを利用して行なう。

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

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

SpamAssassin・spamass-milterインストール

EPELリポジトリ導入(EPEL)を参照してEPELリポジトリを導入する
[root@localhost ~]# yum -y install spamassassin spamass-milter-postfix ← SpamAssassin・spamass-milterインストール

SpamAssassin起動

[root@localhost ~]# systemctl start spamassassin ← SpamAssassin起動
[root@localhost ~]# systemctl enable spamassassin ← 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; ← 追加

spamass-milter起動

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

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

[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インストール

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

[root@localhost ~]# systemctl start milter-manager ← milter-manager起動
[root@localhost ~]# systemctl enable milter-manager ← 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再起動

Postfix・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設定反映

milter-manager・spamass-milter連携設定

[root@localhost ~]# usermod -G postfix -a milter-manager ← postfixグループにmilter-managerユーザーを追加
[root@localhost ~]# systemctl restart milter-manager ← milter-manager再起動

Procmail設定

[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
}

Postfix・Procmail連携設定

[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設定反映

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

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/

spamass-milter確認

自分自身に空メールを送ってみて、受信したメールのヘッダに以下のメッセージが付加されていること

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フォルダへ配送されていること

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

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に記録される


トップ   編集 凍結解除 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-10-28 (月) 08:59:40