メールサーバーでウィルス&スパムチェック(Postfix+amavisd-new+Clam AntiVirus+SpamAssassin) 編 合計:
昨日:
今日:
更新日:2008/6/2
<<ホームへ戻る


Clam AntiVirusSpamAssassinを使用してメールサーバー側でメールに対するウィルスチェックとスパムチェックを行う。
なお、メールサーバー(Postfix)とClam AntiVirus、SpamAssassinとの連携はamavisd-newを利用して行なう。

【前提条件】メールサーバー(postfix)、ウィルスソフト(clamav)が構築済みであること。

 
◆clamavのインストール <<TOP

メール毎のチェックを行うため、常駐型のclamavを導入する。

最新版は、ダウンロードサイトより確認する。

[root@server ~]# wget http://downloads.sourceforge.net/clamav/clamav-0.93.tar.gz?modtime=1208196272&big_mirror=0
         ↑ clamavのダウンロード

[root@server ~]# tar zxvf clamav-0.93.tar.gz ← 解凍

[root@server ~]# cp clamav-0.93/contrib/init/RedHat/clamd /etc/rc.d/init.d/
         ↑ 起動スクリプトを所定のディレクトリにコピーする

[root@server ~]# rm -rf clamav-0.93 ← 展開したディレクトリ削除

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

[root@server ~]#
      
 
◆clamdの設定 <<TOP

 

[root@server ~]# vi /usr/local/etc/clamd.conf ← 設定ファイルの変更

# 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: yes
#FixStaleSocket yes
FixStaleSocket yes ← clamd が異常終了したときなどに残るソケットファイルを削除する
   ・
   ・
   ・
"/usr/local/etc/clamd.conf" 352L, 9170C written
[root@server ~]# vi /usr/local/etc/freshclam.conf ← freshclam設定ファイル変更		  
   ・
   ・
   ・
# Send the RELOAD command to clamd.
# Default: no
#NotifyClamd /path/to/clamd.conf
NotifyClamd /usr/local/etc/clamd.conf ← ウィルス更新をclamdに通知する

[root@server ~]# vi freshclam ← ウィルス更新スクリプト作成

#!/bin/sh
/usr/local/bin/freshclam --quiet

"freshclam" [New] 3L, 44C written
[root@server ~]# chmod 700 freshclam ← 実行権限付与

[root@server ~]# mv freshclam /etc/cron.hourly/ ← 1時間ごとに更新を実行するように移動

[root@server ~]# vi /etc/logrotate.d/clamd ← logrotateの作成
/var/log/clamd.log {
    sharedscripts
    postrotate
        /etc/rc.d/init.d/clamd restart > /dev/null || true
    endscript
}

"/etc/logrotate.d/clamd" [New] 7L, 130C written
[root@server ~]# 
		  
 
◆clamdの起動 <<TOP

 

[root@server ~]# /etc/rc.d/init.d/clamd start ← clamdの起動

clamd を起動中:                                            [  OK  ]

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

[root@server ~]# chkconfig --list clamd ← 確認

clamd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

[root@server ~]# 

      
 
◆amavisd-newのインストール <<TOP

yumの標準では、パッケージがありませんのでRPMforge リポジトリをyumに追加する必要がある。

[root@server ~]# wget http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
         ↑ RPMforge リポジトリのダウンロード

[root@server ~]# rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm ← インストール


[root@server ~]# rm -f rpmforge-release-0.3.6-1.el5.rf.i386.rpm ← ダウンロードファイルの削除


[root@server ~]# sed -i 's/enabled = 1/enabled = 0/g' /etc/yum.repos.d/rpmforge.repo
         ↑ 基本リポジトリとの競合を避けるため無効にしておく
[root@server ~]# yum -y --enablerepo=rpmforge install amavisd-new
         ↑ rpmforgeを有効にしてamavisd-newをインストール
[root@server ~]#
 
◆amavisd-new設定 <<TOP

 

[root@server ~]# vi /etc/amavisd.conf ← 設定ファイル編集
   ・ 
   ・
   ・
$max_servers = 2;            # num of pre-forked children (2..30 is common), -m
$daemon_user  = "amavis";     # (no default;  customary: vscan or amavis), -u
$daemon_group = "amavis";     # (no default;  customary: vscan or amavis), -g

$mydomain = 'arisonsvr.org';   # a convenient default for other settings ← ドメイン名を指定
   ・
   ・
   ・
# $MYHOME = '/var/amavis';   # a convenient default for other settings, -H
$TEMPBASE = "$MYHOME/tmp";   # working directory, needs to exist, -T
$ENV{TMPDIR} = $TEMPBASE;    # environment variable TMPDIR, used by SA, etc.
#$QUARANTINEDIR = "/var/virusmails"; ← スパムでも受信するようにコメントアウト
   ・
   ・
   ・
# $timestamp_fmt_mysql = 1; # if using MySQL *and* msgs.time_iso is TIMESTAMP;
#   defaults to 0, which is good for non-MySQL or if msgs.time_iso is CHAR(16)

#$virus_admin               = "virusalert\@$mydomain";  # notifications recip. ← ウィルス検知を通知しない
   ・
   ・
   ・
# $final_virus_destiny      = D_DISCARD;
# $final_banned_destiny     = D_BOUNCE;
# $final_spam_destiny       = D_BOUNCE;
$final_spam_destiny       = D_PASS; ← スパムと判断したメールでも受信する
   ・
   ・
   ・
$MAXLEVELS = 14;
$MAXFILES = 1500;
$MIN_EXPANSION_QUOTA =      100*1024;  # bytes  (default undef, not enforced)
$MAX_EXPANSION_QUOTA = 300*1024*1024;  # bytes  (default undef, not enforced)

#$sa_spam_subject_tag = '***SPAM*** '; ← メール件名に***SPAM***を付加しない
   ・
   ・
   ・
# ### http://www.clamav.net/
# ['ClamAV-clamd',
#   \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
#   qr/\bOK$/, qr/\bFOUND$/,
#   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
   ↓ 以下を追加
 ### http://www.clamav.net/
 ['ClamAV-clamd',
   \&ask_daemon, ["CONTSCAN {}\n", "/tmp/clamd.socket"],
   qr/\bOK$/, qr/\bFOUND$/,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
      
 
◆amavisd-new起動 <<TOP

 

[root@server ~]# /etc/rc.d/init.d/amavisd start ← amavisd-newの起動

Mail Virus Scanner (amavisd) を起動中:                     [  OK  ]

[root@server ~]# chkconfig amavisd on ← 自動起動on
[root@server ~]# chkconfig --list amavisd ← 確認
amavisd 0:off 1:off 2:on 3:on 4:on 5:on 6:off ← ランレベル2〜5のon確認
[root@server ~]#
 
◆SpamAssassin起動 <<TOP

 

[root@server ~]# /etc/rc.d/init.d/spamassassin start
spamd を起動中:                                            [  OK  ]

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

 

[root@server ~]# vi /etc/mail/spamassassin/v310.pre ← v310.preの編集
   ・
   ・
   ・
# TextCat - language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat ← 行頭の#を削除TextCatプラグインの有効化

[root@server ~]# vi spamassassin-update ← 更新用のスクリプト作成
#!/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@server ~]# chmod +x spamassassin-update ← 実行権限付与

[root@server ~]# ./spamassassin-update ← 更新を実行してみる

[root@server ~]# ll /etc/mail/spamassassin ← 確認
合計 1096
-rw-r--r-- 1 root root   1299  1月  8 10:22 init.pre
-rw-r--r-- 1 root root 358535  6月  2 14:12 local.cf
-rw-r--r-- 1 root root     64  1月  8 10:22 spamassassin-default.rc
-rw-r--r-- 1 root root     35  1月  8 10:22 spamassassin-helper.sh
-rw-r--r-- 1 root root     55  1月  8 10:22 spamassassin-spamc.rc
-rw-r--r-- 1 root root 358521  5月 31 22:00 user_prefs
-rw-r--r-- 1 root root 358521  6月  2 14:12 user_prefs.org
-rw-r--r-- 1 root root   2602  6月  2 14:05 v310.pre
-rw-r--r-- 1 root root   1195  1月  8 10:22 v312.pre
-rw-r--r-- 1 root root   2416  1月  8 10:22 v320.pre

[root@server ~]# mv spamassassin-update /etc/cron.daily/ ← 毎日実行するように移動

[root@server ~]# vi /etc/cron.d/sa-update
### OPTIONAL: Spamassassin Rules Updates ###
#
# http://wiki.apache.org/spamassassin/RuleUpdates
# Highly recommended that you read the documentation before using this.
# ENABLE UPDATES AT YOUR OWN RISK.
#
# /var/log/sa-update.log contains a history log of sa-update runs

10 4 * * * root /usr/share/spamassassin/sa-update.cron 2>&1 | tee -a /var/log/sa-update.log
↑ 行頭の#を削除 sa-update.cronの有効化

[root@server ~]#
      
 
◆Postfix設定 <<TOP

 

[root@server ~]# vi /etc/postfix/master.cf ← 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@server ~]# vi /etc/postfix/main.cf ← mainファイルの編集
↓ 以下を最終行に追加
content_filter=smtp-amavis:[127.0.0.1]:10024
      
 
◆postfixの再起動 <<TOP

 

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

[root@server ~]# 
      
 
◆スパムメール振分け設定(受信メールサーバーがIMAPの場合のみ) <<TOP

 

[root@server ~]# mkdir -p /etc/skel/Maildir/.Spam/new ← 新規ユーザ作成時に自動的にスパム用ディレクトリを作成

[root@server ~]# mkdir -p /etc/skel/Maildir/.Spam/cur

[root@server ~]# mkdir -p /etc/skel/Maildir/.Spam/tmp

[root@server ~]# chmod -R 700 /etc/skel/Maildir/.Spam

[root@server ~]# 
      

スパム振り分け設定

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


# 未承諾広告メール削除
:0
* ^Subject:.*iso-2022-jp
* ^Subject:\/.*
* ? echo "$MATCH" | nkf -mwZ2 | 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

[root@server ~]# 
      
 
◆amavisd-new確認 <<TOP
 
受信したメールヘッダーに、X-Virus-Scanned: amavisd-new at arisonsvr.orgと表示されていることを確認する。
 
◆ウィルスチェック <<TOP
 
自分自身にテストウィルスを添付したメールを送ってみて、メールが届かないことを確認する。
 
◆スパムチェック <<TOP
 
 
◆スパムメール学習(受信メールサーバーがIMAPの場合のみ) <<TOP
 
[root@server ~]# vi spamassassin-learn ← スパム学習スクリプトの作成

#!/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@server ~]# chmod 700 spamassassin-learn ← 実行権限付与

[root@server ~]# mv spamassassin-learn /etc/cron.daily/ ← 毎日実行するように移動

[root@server ~]#
      
 
 
◆広告等 <<TOP