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

最終更新日: 2009.12.29

<<トップページ <<新着情報 <<質問掲示板 <<アンケート <<リンク集 <<サイト内検索 <<管理人へメール <<Fedoraで自宅サーバー構築

■概要

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

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


■clamd設定

Clam AntiVirusとsendmailが連携できるようにするため、clamdをソケット通信型で起動するようにする。
[root@centos ~]# vi /etc/clamd.conf ← clamd設定ファイル編集
# Path to a local socket file the daemon will listen on.
# Default: disabled
#LocalSocket /var/run/clamav/clamd.sock
LocalSocket /var/run/clamav/clamd.sock ← 追加(clamdをソケット通信にする)

# TCP port address.
# Default: disabled
TCPSocket 3310
↓
#TCPSocket 3310 ← 行頭に#を追加してコメントアウト(clamdのTCP通信を無効化)

[root@centos ~]# /etc/rc.d/init.d/clamd restart ← clamd再起動
Stopping Clam AntiVirus Daemon:                            [  OK  ]
Starting Clam AntiVirus Daemon:                            [  OK  ]

■clamav-milterインストール

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

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

■sendmail設定

[root@centos ~]# vi /etc/mail/sendmail.mc ← sendmail.mc編集
以下を最終行へ追加
INPUT_MAIL_FILTER(`clamav', `S=local:/var/clamav/clmilter.socket, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clamav')

[root@centos ~]# m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf ← sendmail.mcよりsendmail.cf作成

■sendmail再起動

[root@centos ~]# /etc/rc.d/init.d/sendmail restart ← sendmail再起動
sendmail を停止中:                                         [  OK  ]
sm-client を停止中:                                        [  OK  ]
sendmail を起動中:                                         [  OK  ]
sm-client を起動中:                                        [  OK  ]

■clamav-milter起動

[root@centos ~]# /etc/rc.d/init.d/clamav-milter start ← clamav-milter起動
Starting Clamav Milter Daemon:                             [  OK  ]

[root@centos ~]# chkconfig clamav-milter on ← clamav-milter自動起動設定

[root@centos ~]# chkconfig --list clamav-milter ← clamav-milter自動起動設定確認
clamav-milter   0:off   1:off   2:on    3:on    4:on    5:on    6:off

■SpamAssassinインストール

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

■SpamAssassin設定

SpamAssassinの初期設定では日本語のスパムメールに対応していないため、TLECで公開されている日本語のスパムメールに対応したSpamAssassin設定ファイルをセットアップする。
また、受信メールサーバーがPOPの場合(IMAPサービスが未起動の場合)はスパム判断したメールの件名に「*****SPAM*****」の文字列を付加するように設定する。
[root@centos ~]# 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
cp user_prefs local.cf

# スパム判断したメールを添付形式にしないように設定
echo "report_safe 0" >> local.cf

# 受信メールサーバーがPOPの場合(IMAPサービスが未起動の場合)はメール件名に「*****SPAM*****」の文字列を付加するように設定
if [ -z "$(/usr/sbin/lsof -i:imap)" ] && [ -z "$(/usr/sbin/lsof -i:imaps)" ]; then
    echo "rewrite_header Subject *****SPAM*****" >> local.cf
fi

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

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

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

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

■SpamAssassin自動起動設定

※SpamAssassinはspamassassin-updateの実行で既に起動済
[root@centos ~]# chkconfig spamassassin on ← SpamAssassin自動起動設定

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

■spamassassin-milterインストール

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

■spamassassin-milter設定

[root@centos ~]# vi /etc/sysconfig/spamass-milter ← spamass-milter設定ファイル編集
### Default parameter for spamass-milter is -f (work in the background)
### you may add another parameters here, see spamass-milter(1)
#EXTRA_FLAGS="-m -r 15"
EXTRA_FLAGS="" ← 追加(SpamAssassinによる件名の書き換え許可、スコア15以上のメール受信拒否の無効化)

■spamassassin-milter起動

[root@centos ~]# /etc/rc.d/init.d/spamass-milter start ← spamass-milter起動
Starting Spamassassin sendmail milter (spamass-milter):    [  OK  ]

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

[root@centos ~]# chkconfig --list spamass-milter ← spamass-milter自動起動設定確認
spamass-milter  0:off   1:off   2:on    3:on    4:on    5:on    6:off

■sendmail設定

[root@centos ~]# vi /etc/mail/sendmail.mc ← sendmail.mc編集
INPUT_MAIL_FILTER(`clamav', `S=local:/var/clamav/clmilter.socket, F=, T=S:4m;R:4m')dnl
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass.sock, F=, T=C:15m;S:4m;R:4m;E:10m') ← 追加(SpamAssassinと連携)
define(`confINPUT_MAIL_FILTERS', `clamav')

define(`confINPUT_MAIL_FILTERS', `spamassassin,clamav')dnl ← 変更(SpamAssassinとの連携を追加)

[root@centos ~]# m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf ← sendmail.mcよりsendmail.cf作成

■sendmail再起動

[root@centos ~]# /etc/rc.d/init.d/sendmail restart ← sendmail再起動
sendmail を停止中:                                         [  OK  ]
sm-client を停止中:                                        [  OK  ]
sendmail を起動中:                                         [  OK  ]
sm-client を起動中:                                        [  OK  ]

■スパムメール振分け設定(受信メールサーバーが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 ]; 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 ← 新規ユーザ追加時に自動でスパム専用メールボックス作成(1/4)

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

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

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

(2)スパムメール振分け設定
SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送するようにする。
また、未承諾広告メール(件名に「未承諾広告※」が含まれているメール)は自動的に削除するようにする。
[root@centos ~]# vi /etc/procmailrc ← procmail設定ファイル編集
SHELL=/bin/bash
PATH=/usr/bin:/bin
DROPPRIVS=yes
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
SPAM=$MAILDIR/.Spam/
#LOGFILE=$MAILDIR/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がスパム判定したメールはスパム専用メールボックスへ配送
: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」フォルダが表示されていること

■ウィルスチェック確認

(1)正常メール確認
自分自身にメールを送ってみて、受信したメールのヘッダに以下のメッセージが付加されていること
X-Virus-Scanned: ClamAV version 0.87.1, clamav-milter version 0.87 on linux.centossrv.com

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

■スパムチェック確認

(1)正常メール確認
自分自身にメールを送ってみて、受信したメールのヘッダに以下のメッセージが付加されていること
X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on linux.centossrv.com

(2)スパムメール確認
自分自身にテストスパムメール(メール本文が「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@centos ~]# vi spamassassin-learn ← SpamAssassin学習スクリプト作成
#!/bin/bash

PATH=/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 | \
        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 | \
        logger -p mail.info -t 'sa-learn for $user'"
    fi
done

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

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



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

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