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

最終更新日: 2008.05.01

<<トップページ <<新着情報 <<質問BBS <<逆引き集 <<アンケート <<リンク集 <<サイト内検索 <<ダウンロード <<管理人へメール <<CentOSで自宅サーバー構築

■概要

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

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


■clamdインストール

メール送受信毎にウィルススキャンするため、性能を考慮して常駐型のclamdを導入する。
※Fedora標準のclamdはバージョンが古いため、既にインストール済の本家版clamdを使用する
[root@fedora ~]# wget http://nchc.dl.sourceforge.net/sourceforge/clamav/clamav-0.91.2.tar.gz ← Clam AntiVirusダウンロード

※最新版のURLはダウンロードページで確認すること

[root@fedora ~]# tar zxvf clamav-0.91.2.tar.gz ← Clam AntiVirus展開

[root@fedora ~]# cp clamav-0.91.2/contrib/init/RedHat/clamd /etc/rc.d/init.d/ ← clamd起動スクリプトを所定のディレクトリへコピー

[root@fedora ~]# rm -rf clamav-0.91.2 ← Clam AntiVirus展開先ディレクトリを削除

[root@fedora ~]# rm -f clamav-0.91.2.tar.gz ← ダウンロードしたファイルを削除

■clamd設定

[root@fedora ~]# vi /usr/local/etc/clamd.conf ← clamd設定ファイル編集
# Comment or remove the line below.
#Example ← 行頭に#を追加(コメントアウト)

# Uncomment this option to enable logging.
# LogFile must be writable for the user running daemon.
# A full path is required.
# Default: disabled
#LogFile /tmp/clamd.log
LogFile /var/log/clamd.log ← ログを記録する

# Log time with each message.
# Default: no
#LogTime yes
LogTime yes ← ログに日時も記録する

# Remove stale socket after unclean shutdown.
# Default: no
#FixStaleSocket yes
FixStaleSocket yes ← clamd強制終了後の再起動不可対処

[root@fedora ~]# vi /usr/local/etc/freshclam.conf ← ウィルスデータベース更新設定ファイル編集
# Send the RELOAD command to clamd.
# Default: no
#NotifyClamd /path/to/clamd.conf
NotifyClamd /usr/local/etc/clamd.conf ← ウィルスデータベース更新をclamdに通知する

[root@fedora ~]# vi freshclam ← ウィルスデータベース更新スクリプト作成
#!/bin/sh
/usr/local/bin/freshclam --quiet

[root@fedora ~]# chmod 700 freshclam ← ウィルスデータベース更新スクリプトに実行権限付加

[root@fedora ~]# mv freshclam /etc/cron.hourly/ ← ウィルスデータベース更新スクリプトを1時間毎に自動実行されるディレクトリへ移動

[root@fedora ~]# vi /etc/logrotate.d/clamd ← clamdログローテーション設定ファイル新規作成
/var/log/clamd.log {
    sharedscripts
    postrotate
        /etc/rc.d/init.d/clamd restart > /dev/null || true
    endscript
}

■clamd起動

[root@fedora ~]# /etc/rc.d/init.d/clamd start ← clamd起動
clamd を起動中:                                            [  OK  ]

[root@fedora ~]# chkconfig --add clamd ← clamd自動起動設定

[root@fedora ~]# chkconfig --list clamd ← clamd自動起動設定確認
clamd           0:off   1:off   2:on    3:on    4:on    5:on    6:off ← ランレベル2〜5のonを確認

■amavisd-newインストール

(1)amavisd-newインストール
[root@fedora ~]# yum -y install amavisd-new ← amavisd-newインストール
※依存関係により大量のパッケージがインストールされる

(2)Fedora標準clamd停止
amavisd-newと一緒にインストールされたFedora標準clamdを停止する。
※amavisd-newがアップデートできなくなってしまうので、Fedora標準clamdは削除しないこと
[root@fedora ~]# /etc/rc.d/init.d/clamd.amavisd stop ← Fedora標準clamd停止
※デフォルトで停止しているが念のため停止する

[root@fedora ~]# chkconfig clamd.amavisd off ← Fedora標準clamd自動起動設定解除
※デフォルトで自動起動設定解除されているが念のため解除する

[root@fedora ~]# chkconfig --list clamd.amavisd ← Fedora標準clamd自動起動設定解除確認
clamd.amavisd   0:off   1:off   2:off   3:off   4:off   5:off   6:off ← 全てのランレベルでoffになっていることを確認

■amavisd-new設定

[root@fedora ~]# vi /etc/amavisd/amavisd.conf ← amavisd-new設定ファイル編集
$mydomain = 'example.com';   # a convenient default for other settings
↓
$mydomain = 'fedorasrv.com';   # a convenient default for other settings ← ドメイン名変更

$final_spam_destiny       = D_DISCARD;
↓
$final_spam_destiny       = D_PASS; ← スパムと判断したメールでも受信する

$final_bad_header_destiny = D_BOUNCE;
↓
$final_bad_header_destiny = D_PASS; ← ヘッダ不正と判断したメールでも受信する
※上記設定は携帯用Webmailシステム(WebMailClient2 for Keitai)で送信したメールが受信拒否されないようにするための対処

#$sa_spam_subject_tag = '***SPAM*** '; ← 行頭に#を追加してコメントアウト※受信メールサーバーがIMAPの場合のみ

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

■amavisd-new起動

[root@fedora ~]# /etc/rc.d/init.d/amavisd start ← amavisd-new起動
amavisd を起動中:                                          [  OK  ]

[root@fedora ~]# chkconfig amavisd on ← amavisd-new自動起動設定

[root@fedora ~]# chkconfig --list amavisd ← amavisd-new自動起動設定確認
amavisd         0:off   1:off   2:on    3:on    4:on    5:on    6:off ← ランレベル2〜5のonを確認

■SpamAssassin起動

※SpamAssassinはamavisd-newと一緒にインストールされている
[root@fedora ~]# /etc/rc.d/init.d/spamassassin start ← SpamAssassin起動
spamd を起動中: [15125] warn: config: created user preferences file: /root/.spamassassin/user_prefs

[root@fedora ~]# chkconfig spamassassin on ← SpamAssassin自動起動設定

[root@fedora ~]# chkconfig --list spamassassin ← SpamAssassin自動起動設定確認
spamassassin    0:off   1:off   2:on    3:on    4:on    5:on    6:off ← ランレベル2〜5のonを確認

■SpamAssassin設定

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

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

# TLEC(http://tlec.linux.or.jp/)よりSpamAssassin設定ファイル最新版ダウンロード
cd /etc/mail/spamassassin
wget -qN http://tlec.linux.or.jp/docs/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

    # SpamAssassin再起動
    /etc/rc.d/init.d/spamassassin restart > /dev/null
fi
cp user_prefs user_prefs.org

# スパム判定スコアをTLEC版SpamAssassin設定ファイルの値に変更
amavisd_conf=`rpm -ql amavisd-new|grep etc|grep amavisd.conf`
required_score=\
`grep required_score /etc/mail/spamassassin/local.cf|awk '{print $2}'`
sa_tag2_level_deflt=\
`grep "\sa_tag2_level_deflt" $amavisd_conf|awk '{print $3}'|tr -d \;`
if [ $required_score != $sa_tag2_level_deflt ]; then
    sed -i "s/sa_tag2_level_deflt.*/sa_tag2_level_deflt = $required_score;/g" \
    $amavisd_conf
    /etc/rc.d/init.d/amavisd restart > /dev/null 2>&1
fi

[root@fedora ~]# chmod +x spamassassin-update ← SpamAssassin設定ファイル最新化スクリプトへ実行権限付加

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

[root@fedora ~]# ll /etc/mail/spamassassin ← SpamAssassin設定ファイル確認
合計 352
-rw-r--r--  1 root root    935  6月 24 04:37 init.pre
-rw-r--r--  1 root root 164329 11月 28 14:01 local.cf ← SpamAssassin設定ファイル
-rw-r--r--  1 root root     62  6月 24 04:37 spamassassin-default.rc
-rwxr-xr-x  1 root root     35  6月 24 04:37 spamassassin-helper.sh
-rw-r--r--  1 root root     55  6月 24 04:37 spamassassin-spamc.rc
-rw-r--r--  1 root root 164315 11月 26 20:00 user_prefs

[root@fedora ~]# mv spamassassin-update /etc/cron.daily/
 ← SpamAssassin設定ファイル最新化スクリプトを毎日自動実行されるディレクトリへ移動

[root@fedora ~]# 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 ← 行頭の#を削除(コメント解除)

■Postfix設定

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

■Postfix再起動

[root@fedora ~]# /etc/rc.d/init.d/postfix restart ← Postfix再起動
postfix を停止中:                                          [  OK  ]
postfix を起動中:                                          [  OK  ]

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

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

(1)スパム専用メールボックス作成
既存ユーザについては、メールボックスにスパム専用メールボックスを追加する。
また、新規ユーザについては、ユーザ追加時に自動でスパム専用メールボックスが作成されるようにする 。
【既存ユーザ対処】
[root@fedora ~]# vi spamfolder-create.sh ← スパム専用メールボックス作成スクリプト作成
#!/bin/bash

for user in `ls /home`
do
    id -u $user > /dev/null 2>&1
    if [ $? -eq 0 ] && [ ! -d /home/$user/Maildir/.Spam ]; 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@fedora ~]# sh spamfolder-create.sh ← スパム専用メールボックス作成スクリプト実行
user
・
・
・
user

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

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

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

[root@fedora ~]# mkdir -p /etc/skel/Maildir/.Spam/tmp ← 新規ユーザ追加時に自動でスパム専用メールボックス作成(3/4)

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

(2)スパムメール振分け設定
SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送するようにする。
また、未承諾広告メール(件名に「未承諾広告※」が含まれているメール)は自動的に削除するようにする。
[root@fedora ~]# 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 # 詳細ログ出力

# 未承諾広告メール削除※システムの文字コードがUTF-8(デフォルト)の場合
:0
* ^Subject:.*iso-2022-jp
* ^Subject:\/.*
* ? echo "$MATCH" | nkf -mwZ2 | sed 's/[[:space:]]//g' | egrep '未承諾広告※'
/dev/null

# 未承諾広告メール削除※システムの文字コードがEUCの場合
:0
* ^Subject:.*iso-2022-jp
* ^Subject:\/.*
* ? echo "$MATCH" | nkf -meZ2 | sed 's/[[:space:]]//g' | egrep '未承諾広告※'
/dev/null

# SpamAssassinによるスパムチェック
# ※fetchmail取り込みメールのスパム検査未実施対処
:0fw
*!^X-Spam-
|/usr/bin/spamc

# SpamAssassinにより判定されたSpam-Levelが一定値(ここでは20)以上の場合は削除
# ※必要なメールが削除されてしまう可能性があることに留意すること
:0
* ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
/dev/null

# SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送
:0
*^X-Spam-Flag: YES
$SPAM

■メールクライアント設定(受信メールサーバーをPOPにする場合)

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

(1)スパムメール用フォルダ作成
Outlook Expressを起動し、「ローカル フォルダ」右クリック⇒「フォルダの作成」⇒「フォルダ名」に"Spam"と入力して「OK」ボタン押下

(2)スパムメール振分けルール追加
Outlook Expressを起動し、「ツール」⇒「メッセージルール」⇒「メール」



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



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



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



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



「OK」ボタン押下



「OK」ボタン押下

■メールクライアント設定(受信メールサーバーをIMAPにする場合)

Spamフォルダを表示する



メールアカウント選択して「IMAPフォルダ」ボタン押下



「リセット」ボタン押下して「Spam」フォルダが表示されること



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



「Spam」フォルダが表示されていること

■amavisd-new確認

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

■ウィルスチェック確認

自分自身にテストウィルスを添付したメールを送ってみて、メールが届かないこと

■スパムチェック確認

自分自身にテストスパムメール(メール本文が「XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X」のメール)を送ってみて、受信メールサーバー別に以下のようになること

【受信メールサーバーがPOPの場合】
メール件名に「***SPAM***」が付加されてSpamフォルダへ配送されていること

【受信メールサーバーがIMAPの場合】
Spamフォルダへ配送されていること

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

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

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

[root@fedora ~]# vi spamassassin-learn ← SpamAssassin学習スクリプト作成
#!/bin/bash

PATH=/usr/sbin:/usr/bin:/bin

for user in `ls /home/`
do
    # 正常メール
    hammail=/home/$user/Maildir/cur

    # 正常メール学習
    if [ -d "$hammail" ]; then
        # 正常メールをSpamAssassinに学習させる
        su $user -s "/bin/bash" -c "sa-learn --ham $hammail 2>&1| \
        logger -p mail.info -t 'sa-learn for $user'"
    fi

    # スパムメール
    spammail=/home/$user/Maildir/.Spam/cur

    # スパムメール学習
    if [ -d "$spammail" ]; then
        # スパムメールをSpamAssassinに学習させる
        su $user -s "/bin/bash" -c "sa-learn --spam $spammail 2>&1| \
        logger -p mail.info -t 'sa-learn for $user'"

        # 受信後一ヶ月経過したスパムメールを削除
        tmpwatch -m 720 $spammail
    fi
done

[root@fedora ~]# chmod 700 spamassassin-learn ← SpamAssassin学習スクリプトに実行権限付加

[root@fedora ~]# mv spamassassin-learn /etc/cron.daily/
 ← SpamAssassin学習スクリプトを毎日自動実行されるディレクトリへ移動



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

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