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

1 views

■概要

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

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

■clamd設定

Clam AntiVirusとPostfixが連携できるようにするため、clamdをソケット通信型で起動するようにする。

[root@ufuso ~]# vi /etc/clamd.conf ← clamd設定ファイル編集
# Path to a local socket file the daemon will listen on.
# Default: disabled (must be specified by a user)
LocalSocket /tmp/clamd

LocalSocket /var/run/clamav/clamd.sock ← clamdソケット名変更

# TCP port address.
# Default: disabled
TCPSocket 3310

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

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

■amavisd-newインストール


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

[root@ufuso ~]# yum -y install amavisd-new ← amavisd-newインストール
Installed:
amavisd-new.x86_64 0:2.6.4-2.el5.rf

Dependency Installed:
arc.x86_64 0:5.21o-1.el5.rf
arj.x86_64 0:3.10.22-1.el5.centos
cabextract.x86_64 0:1.2-1.el5.rf
freeze.x86_64 0:2.5.0-1.2.el5.rf
lha.x86_64 0:1.14i-19.2.2.el5.rf
lzo.x86_64 0:1.08-5.el5.rf
lzop.x86_64 0:1.01-2.el5.rf
ncompress.x86_64 0:4.2.4-47
nomarch.x86_64 0:1.4-1.el5.rf
p7zip.x86_64 0:4.61-1.el5.rf
perl-Archive-Tar.noarch 0:1.30-1.fc6
perl-Archive-Zip.noarch 0:1.16-1.2.1
perl-Compress-Raw-Bzip2.x86_64 0:2.024-1.el5.rf
perl-Compress-Raw-Zlib.x86_64 0:2.024-1.el5.rf
perl-Convert-BinHex.noarch 0:1.119-2.2.el5.rf
perl-Convert-TNEF.noarch 0:0.17-3.2.el5.rf
perl-Convert-UUlib.x86_64 1:1.12-1.el5.rf
perl-Crypt-OpenSSL-RSA.x86_64 0:0.25-1.el5.rf
perl-Digest-SHA.x86_64 0:5.48-1.el5.rf
perl-HTML-Parser.x86_64 0:3.55-1.fc6
perl-HTML-Tagset.noarch 0:3.10-2.1.1
perl-IO-Compress.noarch 0:2.024-1.el5.rf
perl-IO-Socket-INET6.noarch 0:2.51-2.fc6
perl-IO-Socket-SSL.noarch 0:1.01-1.fc6
perl-IO-Zlib.noarch 0:1.04-4.2.1
perl-IO-stringy.noarch 0:2.110-1.2.el5.rf
perl-MIME-tools.noarch 0:5.420-2.el5.rf
perl-Mail-DKIM.noarch 0:0.37-1.el5.rf
perl-MailTools.noarch 0:1.77-1.el5.centos
perl-Net-SSLeay.x86_64 0:1.30-4.fc6
perl-Socket6.x86_64 0:0.19-3.fc6
perl-TimeDate.noarch 1:1.16-5.el5
perl-Unix-Syslog.x86_64 0:1.1-1.el5.rf
perl-libwww-perl.noarch 0:5.805-1.1.1
ripole.x86_64 0:0.2.0-1.2.el5.rf
spamassassin.x86_64 0:3.2.5-1.el5
unrar.x86_64 0:3.9.4-1.el5.rf
zoo.x86_64 0:2.10-2.2.el5.rf

Complete!

■amavisd-new設定


[root@ufuso ~]# vi /etc/amavisd.conf ← amavisd-new設定ファイル編集
@bypass_spam_checks_maps = (1); # controls running of anti-spam code ← 行頭の#を削除してコメント解除

(スパムチェックは行なわない)※スパムチェックはprocmail経由でspamcコマンドで行なう

$mydomain = ‘example.com’; # a convenient default for other settings

$mydomain = ‘ufuso.jp’; # a convenient default for other settings ← ドメイン名変更

#$QUARANTINEDIR = “/var/virusmails”; ← 行頭に#を追加してコメントアウト
(ウィルスメールは隔離しない)

#$virus_admin = “virusalert@$mydomain”; # notifications recip. ← 行頭に#を追加してコメントアウト
(ウィルス検知メールを管理者宛に通知しない)

# ### 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”, “/var/run/clamav/clamd.sock”],
qr/bOK$/, qr/bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
ここまで
### BLOCKED ANYWHERE
# qr’^UNDECIPHERABLE$’, # is or contains any undecipherable components
# qr’^.(exe-ms|dll)$’, # banned file(1) types, rudimentary
 ← 行頭に#を追加してコメントアウト(exeファイルを受信できるようにする場合)
# qr’^.(exe|lha|tnef|cab|dll)$’, # banned file(1) types

■amavisd-new起動


[root@ufuso ~]# /etc/rc.d/init.d/amavisd start ← amavisd-new起動
Mail Virus Scanner (amavisd) を起動中: [ OK ]

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

[root@ufuso ~]# 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@ufuso ~]# /etc/rc.d/init.d/spamassassin start ← SpamAssassin起動
spamd を起動中: [ OK ]

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

[root@ufuso ~]# 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@ufuso ~]# vi /etc/mail/spamassassin/v310.pre ← v310.pre編集※CentOS5の場合
# TextCat – language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat ← 行頭の#を削除してコメント解除(TextCatプラグイン有効化)
※SpamAssassin設定ファイルok_languagesオプションを有効にするため

[root@ufuso ~]# 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

# スパム判断したメールの件名に「***SPAM***」を付加するように設定※受信メールサーバーがPOPの場合のみ
echo “rewrite_header Subject ***SPAM***” >> local.cf

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

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

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

[root@centos ~]# ll /etc/mail/spamassassin ← SpamAssassin設定ファイル確認
合計 916
-rw-r–r– 1 root root 1299 1月 21 2009 init.pre
-rw-r–r– 1 root root 297404 1月 26 23:25 local.cf ← SpamAssassin設定ファイル
-rw-r–r– 1 root root 62 1月 21 2009 spamassassin-default.rc
-rwxr-xr-x 1 root root 35 1月 21 2009 spamassassin-helper.sh
-rw-r–r– 1 root root 55 1月 21 2009 spamassassin-spamc.rc
-rw-r–r– 1 root root 297356 1月 24 16:00 user_prefs
-rw-r–r– 1 root root 297356 1月 26 23:25 user_prefs.org
-rw-r–r– 1 root root 2602 1月 26 23:24 v310.pre
-rw-r–r– 1 root root 1195 1月 21 2009 v312.pre
-rw-r–r– 1 root root 2416 1月 21 2009 v320.pre

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

[root@ufuso ~]# 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@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@ufuso ~]# /etc/rc.d/init.d/postfix restart ← Postfix再起動
Shutting down postfix: [ OK ]
Starting postfix: [ OK ]

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

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

(1)スパム専用メールボックス作成
既存ユーザについては、メールボックスにスパム専用メールボックスを追加する。
また、新規ユーザについては、ユーザ追加時に自動でスパム専用メールボックスが作成されるようにする 。


【既存ユーザ対処】
[root@ufuso ~]# 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@ufuso ~]# sh spamfolder-create ← スパム専用メールボックス作成スクリプト実行

user



user

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

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

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

(2)スパムメール振分け設定
SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送するようにする。
また、未承諾広告メール(件名に「未承諾広告※」が含まれているメール)は自動的に削除するようにする。


[root@ufuso ~]# 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によるスパムチェック
:0fw
|/usr/bin/spamc

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

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

■amavisd-new確認

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

■ウィルスチェック確認

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

■スパムチェック確認

自分自身にテストスパムメール(メール本文が「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@ufuso ~]# 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 |
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’”

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

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

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

※スパムメール学習結果のログは/var/log/maillogに記録される