メールサーバーでウイルス&スパムチェック(Postfix+amavisd-new+Clam AntiVirus+SpamAssassin)

最終更新日: 2017.06.17

<<トップページ <<新着情報 <<逆引き集 <<リンク集 <<サイト内検索 <<メルマガ <<Scientific Linuxで自宅サーバー構築 <<Fedoraで自宅サーバー構築

■概要

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

メールサーバーアンチウイルス(Clam AntiVirus)を導入済であること


■SpamAssassin・amavisd-newインストール

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

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

■SpamAssassin起動

[root@centos ~]# systemctl start spamassassin ← SpamAssassin起動※CentOS7の場合
[root@centos ~]# /etc/rc.d/init.d/spamassassin start ← SpamAssassin起動※CentOS6の場合

[root@centos ~]# systemctl enable spamassassin ← SpamAssassin自動起動設定※CentOS7の場合
[root@centos ~]# chkconfig spamassassin on ← SpamAssassin自動起動設定※CentOS6の場合

■SpamAssassin設定

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

[root@centos ~]# vi 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@centos ~]# chmod +x spamassassin-update ← SpamAssassin設定ファイル最新化スクリプトへ実行権限付加

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

[root@centos ~]# mv spamassassin-update /etc/cron.daily/ ← 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; ← 追加

■clamd設定

[root@centos ~]# vi /etc/clamd.d/amavisd.conf ← amavisd用clamd設定ファイル編集
# Run as a selected user (clamd must be started by root).
#User amavis ← 行頭に#を追加してコメントアウト(root権限で走行させる)

[root@centos ~]# grep ^ExcludePath /etc/clamd.d/scan.conf >> /etc/clamd.d/amavisd.conf ← スキャン除外設定をamavisd用clamd設定ファイルへ引継ぎ

[root@centos ~]# sed -i "s/^CONFIG=.*/CONFIG=\/etc\/clamd.d\/amavisd.conf/g" /etc/cron.daily/clamdscan ← ウイルススキャン日次実行スクリプト中のclamd設定ファイル名をamavisd用clamd設定ファイル変更

[root@centos ~]# vi /etc/freshclam.conf ← ウイルス定義ファイル更新設定ファイル編集
# Send the RELOAD command to clamd.
# Default: no
#NotifyClamd /path/to/clamd.conf
#NotifyClamd /etc/clamd.d/scan.conf
NotifyClamd /etc/clamd.d/amavisd.conf ← clamd設定ファイル変更

■clamd再起動

【CentOS7の場合】
[root@centos ~]# systemctl stop clamd.scan ← 起動中clamd停止

[root@centos ~]# systemctl start clamd@amavisd ← amavisd版clamd起動

[root@centos ~]# systemctl disable clamd.scan ← 起動中clamd自動起動設定解除

[root@centos ~]# systemctl enable clamd@amavisd ← amavisd版clamd自動起動設定

【CentOS6の場合】
[root@centos ~]# /etc/rc.d/init.d/clamd stop ← 起動中clamd停止

[root@centos ~]# /etc/rc.d/init.d/clamd.amavisd start ← amavisd版clamd起動

[root@centos ~]# chkconfig clamd off ← 起動中clamd自動起動設定解除

[root@centos ~]# chkconfig clamd.amavisd on ← amavisd版clamd自動起動設定

■amavisd-new設定

[root@centos ~]# vi /etc/amavisd/amavisd.conf
@bypass_spam_checks_maps  = (1);  # controls running of anti-spam code ← 行頭の#を削除してコメント解除(スパムチェックは行なわない)
※スパムチェックはprocmail経由でspamcコマンドで行なう

$mydomain = 'centossrv.com';   # a convenient default for other settings ← ドメイン名変更

$virus_admin               = "virusalert\@$mydomain"; ← ウイルス検知時に管理者(virusalert)宛にメール通知する場合
$virus_admin               = undef; ← ウイルス検知時に管理者(virusalert)宛にメール通知しない場合

$final_bad_header_destiny = D_PASS; ← ヘッダ不良メールを破棄しないようにする

  ### http://www.clamav.net/
  ['ClamAV-clamd',
    \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamd.amavisd/clamd.sock"], ← ソケット名変更(/etc/clamd.d/amavisd.confのLocalSocketオプションに合わせる)
    qr/\bOK$/m, qr/\bFOUND$/m,
    qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],

[root@centos ~]# echo virusalert:root >> /etc/aliases ← virusalert宛メールをrootへ転送する設定を追加

[root@centos ~]# newaliases ← 上記設定反映

■amavisd-new起動

[root@centos ~]# systemctl start amavisd ← amavisd-new起動※CentOS7の場合
[root@centos ~]# /etc/rc.d/init.d/amavisd start ← amavisd-new起動※CentOS6の場合

[root@centos ~]# systemctl enable amavisd ← amavisd-new自動起動設定※CentOS7の場合
[root@centos ~]# chkconfig amavisd on ← amavisd-new自動起動設定※CentOS6の場合

■Procmail設定

[root@centos ~]# vi /etc/procmailrc ← procmail設定ファイル作成
SHELL=/bin/bash
PATH=/usr/bin:/bin
DROPPRIVS=yes
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
SPAM=$MAILDIR/.Spam/
LOGFILE=$HOME/.procmail.log # ログ出力先
VERBOSE=ON # 詳細ログ出力

# SpamAssassinによるスパムチェック
:0fw
|/usr/bin/spamc

# 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設定

(1)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と連携するようにする)

(2)Amavisd連携設定
[root@centos ~]# vi /etc/postfix/master.cf ← Postfix設定ファイル(master)編集
以下を最終行へ追加
smtp-amavis unix -    -    n    -    2  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes

127.0.0.1:10025 inet n    -    n    -    -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000

[root@centos ~]# vi /etc/postfix/main.cf ← Postfix設定ファイル(main)編集
content_filter=smtp-amavis:[127.0.0.1]:10024 ← 最終行へ追加(amavisd-newと連携するようにする)

■Postfix再起動

[root@centos ~]# systemctl restart postfix ← Postfix再起動※CentOS7の場合
[root@centos ~]# /etc/rc.d/init.d/postfix restart ← Postfix再起動※CentOS6の場合

■スパムメール振分け設定(受信メールサーバーが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がスパム判定したメールはスパム専用メールボックスへ配送
:0
*^X-Spam-Flag: YES
$SPAM

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

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

(1)スパムメール用フォルダ作成
Windows Live メールを起動し、「フォルダー」⇒「フォルダーの作成」⇒「フォルダー名」に"Spam"と入力して「OK」ボタン押下



(2)スパムメール振分けルール追加
Windows Live メールを起動し、「フォルダー」⇒「メッセージルール」



「件名に指定した文字列が含まれる場合」をチェック
「指定のフォルダーに移動する」をチェック
「指定した文字列が含まれる」のリンクをクリック



「***SPAM***」と入力して「追加」ボタン押下、「OK」ボタン押下



「指定のフォルダー」のリンクをクリック



「Spam」フォルダを選択して「OK」ボタン押下



「ルールの保存」ボタン押下



「OK」ボタン押下

■amavisd-new確認

自分自身に空メールを送ってみて、受信したメールのヘッダに以下のメッセージが付加されていること
X-Virus-Scanned: amavisd-new at centossrv.com

■ウイルスチェック確認

自分自身にテストウイルスメールメール(メール本文が「X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*」のメール)を送ってみて、メールが届かないこと

メールログ(/var/log/maillog)にウイルスを検知した旨のメッセージ(下記)が記録されていること
Sep 14 14:24:44 centos postfix/smtp[26703]: 5A2FCE74C1: to=, relay=127.0.0.1[127.0.0.1]:10024, delay=2, delays=1.8/0/0.01/0.2, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=25375-03 - INFECTED: Eicar-Test-Signature)

管理者宛にウイルス検知メール(件名が「Content-filter at 〜」のメール)が送られてくること※ウイルス検知時に管理者(virusalert)宛にメール通知するようにamavisd-newを設定している場合

■スパムチェック確認

自分自身にテストスパムメール(メール本文が「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 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 700 spamassassin-learn ← SpamAssassin学習スクリプトに実行権限付加

[root@centos ~]# mv spamassassin-learn /etc/cron.daily/ ← SpamAssassin学習スクリプトを毎日自動実行されるディレクトリへ移動
※スパムメール学習結果のログは/var/log/maillogに記録される






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

LPIロゴ Copyright© 2005-2017 fallenangels, All rights reserved.
ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします