1 views

実現する機能

Clam AntiVirusSpamAssassinを使用してメールサーバー側でメールに対するウィルスチェックとスパムチェックを行います。

メールサーバー(Postfix)とClam AntiVirus、SpamAssassinとの連携はamavisd-newを利用して行い、自宅サーバーに構築したメールサーバーに外部から送られてきたメール及び内部から送り出すメールのウィルスチェックを実施、ウィルスを検出したらメールを破棄するようにします。

外部から送られてきたメールについてはスパムチェックも行ない、スパムメールであると判断した場合、受信メールサーバーがIMAPの場合はProcmailを使用してスパムメール専用のメールボックスへ配送するようにし、受信メールサーバーがPOPの場合はメールソフトで振分けられるようにメール件名に「***SPAM***」という文字列を付加します。

事前準備

メールサーバーアンチウィルス(Clam AntiVirus)rpmforgeのリポジトリが導入済であること

Postfix+Clam AntiVirus+SpamAssassinの導入手順

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

[root@ufuso ~]# vi /etc/clamd.conf ← clamd設定ファイル編集
# TCP port address.
# Default: no
#TCPSocket 3310 ← 行頭に#を追加してコメントアウト(clamdのTCP通信を無効化)

[root@ufuso ~]# /etc/rc.d/init.d/clamd restart ← clamd再起動

Stopping Clam AntiVirus Daemon:                            [  OK  ]
Starting Clam AntiVirus Daemon:                            [  OK  ]

(2)amavisd-newインストール

[root@ufuso ~]#  yum --enablerepo=rpmforge -y install amavisd-new ← amavisd-
newインストール
Installed:
  amavisd-new.x86_64 0:2.8.0-1.el6.rf                                

Dependency Installed:
  altermime.x86_64 0:0.3.10-1.el6.rf                                 
  arc.x86_64 0:5.21p-1.el6.rf                                        
  arj.x86_64 0:3.10.22-2.el6.rf                                      
  cabextract.x86_64 0:1.4-1.el6.rf                                   
  freeze.x86_64 0:2.5.0-3.el6.rf                                     
  lha.x86_64 0:1.14i-19.2.2.el6.rf                                   
  ncompress.x86_64 0:4.2.4-54.el6_2.1                                
  nomarch.x86_64 0:1.4-1.el6.rf                                      
  p7zip.x86_64 0:9.20.1-1.el6.rf                                     
  perl-Archive-Tar.x86_64 0:1.58-130.el6_4                           
  perl-Archive-Zip.noarch 0:1.30-2.el6                               
  perl-BerkeleyDB.x86_64 0:0.43-1.el6.rf                             
  perl-Compress-Raw-Zlib.x86_64 1:2.020-130.el6_4                    
  perl-Compress-Zlib.x86_64 0:2.020-130.el6_4                        
  perl-Convert-BinHex.noarch 0:1.119-10.1.el6                        
  perl-Convert-TNEF.noarch 0:0.18-1.el6.rf                           
  perl-Convert-UUlib.x86_64 1:1.34-1.el6.rf                          
  perl-Crypt-OpenSSL-Bignum.x86_64 0:0.04-8.1.el6                    
  perl-Crypt-OpenSSL-RSA.x86_64 0:0.25-10.1.el6                      
  perl-Crypt-OpenSSL-Random.x86_64 0:0.04-9.1.el6                    
  perl-Digest-HMAC.noarch 0:1.01-22.el6                              
  perl-Digest-SHA.x86_64 1:5.47-130.el6_4                            
  perl-Digest-SHA1.x86_64 0:2.12-2.el6                               
  perl-Encode-Detect.x86_64 0:1.01-2.el6                             
  perl-HTML-Parser.x86_64 0:3.64-2.el6                               
  perl-HTML-Tagset.noarch 0:3.20-4.el6                               
  perl-IO-Compress-Base.x86_64 0:2.020-130.el6_4                     
  perl-IO-Compress-Zlib.x86_64 0:2.020-130.el6_4                     
  perl-IO-Socket-INET6.noarch 0:2.56-4.el6                           
  perl-IO-Socket-SSL.noarch 0:1.31-2.el6                             
  perl-IO-Zlib.x86_64 1:1.09-130.el6_4                               
  perl-IO-stringy.noarch 0:2.110-10.1.el6                            
  perl-MIME-tools.noarch 0:5.427-4.el6                               
  perl-Mail-DKIM.noarch 0:0.37-2.el6                                 
  perl-MailTools.noarch 0:2.04-4.el6                                 
  perl-Net-DNS.x86_64 0:0.65-4.el6                                   
  perl-Net-LibIDN.x86_64 0:0.12-3.el6                                
  perl-Net-SSLeay.x86_64 0:1.35-9.el6                                
  perl-Net-Server.noarch 0:0.99-1.el6.rf                             
  perl-NetAddr-IP.x86_64 0:4.027-7.el6                               
  perl-Package-Constants.x86_64 1:0.02-130.el6_4                     
  perl-Socket6.x86_64 0:0.23-3.el6                                   
  perl-Test-Mock-LWP.noarch 0:0.05-1.el6.rf                          
  perl-Test-MockObject.noarch 0:1.09-3.1.el6                         
  perl-Time-HiRes.x86_64 4:1.9721-130.el6_4                          
  perl-TimeDate.noarch 1:1.16-11.1.el6                               
  perl-UNIVERSAL-can.noarch 0:1.15-1.el6                             
  perl-UNIVERSAL-isa.noarch 0:1.03-1.el6                             
  perl-URI.noarch 0:1.40-2.el6                                       
  perl-Unix-Syslog.x86_64 0:1.1-1.el6.rf                             
  perl-libwww-perl.noarch 0:5.833-2.el6                              
  procmail.x86_64 0:3.22-25.1.el6                                    
  ripole.x86_64 0:0.2.0-1.2.el6.rf                                   
  spamassassin.x86_64 0:3.3.1-2.el6                                  
  unrar.x86_64 0:4.2.3-1.el6.rf                                      
  zoo.x86_64 0:2.10-2.2.el6.rf                                       

Complete!

(3)amavisd-new設定


[root@ufuso ~]# vi /etc/amavisd.conf ← amavisd-new設定ファイル編集 # COMMONLY ADJUSTED SETTINGS: $undecipherable_subject_tag = ''; ← 追加(パスワード付ZIPファイル受信時 メール件名に「***UNCHECKED***」と付加されないようにする) # @bypass_virus_checks_maps = (1); # controls running of anti-virus code @bypass_spam_checks_maps = (1); # controls running of anti-spam code ← 行頭 の#を削除して有効化(スパムチェックは行なわない) ※スパムチェックはprocmail経由でspamcコマンドで行なう # $bypass_decode_parts = 1; # controls running of decoders&dearchivers $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 = ‘ufuso.dip.jp’; # a convenient default for other settings  ← example.comをufuso.dip.jpにドメイン名変更 # $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"; ← 行頭に#を付加し、ウィルスメールは隔離 しない ### BLOCKED ANYWHERE # qr'^UNDECIPHERABLE$', # is or contains any undecipherable components # qr'^\.(exe-ms|dll)$', # banned file(1) types, rudimentary  ← 行頭に#を付加しexeファイルを受信できるようにする # qr'^\.(exe|lha|cab|dll)$', # banned file(1) types

(4)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自動起動設定

(5)SpamAssassin起動

※SpamAssassinはamavisd-newと一緒にインストールされている

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

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

(6)SpamAssassin設定
SpamAssassinの初期設定では日本語のスパムメールに対応していないため、TLECで公開されている日本語のスパムメールに対応したSpamAssassin設定ファイルをセットアップします。

[root@ufuso ~]# vi /etc/mail/spamassassin/v310.pre ← v310.pre編集
# TextCat – language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat ← 行頭の#を削除してコメント解除
(TextCatプラグイン有効化)
※SpamAssassin設定ファイルok_languagesオプションを有効にするため
[root@ufuso ~]# 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再起動
    /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@ufuso ~]# mv spamassassin-update /etc/cron.daily/ ← SpamAssassin設定ファ
イル最新化スクリプトを毎日自動実行されるディレクトリへ移動

(7)Postfix設定

[root@ufuso ~]# vi /etc/postfix/main.cf  ← Postfix設定ファイル編集
# 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と連携するようにする

[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 # 詳細ログ出力

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

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

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


[root@ufuso ~]# vi /etc/logrotate.d/procmail  ← procmailログローテーション設定
ファイル作成

/home/*/Maildir/.procmail.log {
    missingok
    nocreate
    notifempty
}

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

(8)Postfix再起動

[root@ufuso ~]# /etc/rc.d/init.d/postfix restart ← Postfix再起動
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ]

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

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

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

【既存ユーザ対処】
[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)

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

(11)ウィルスチェック確認
自分自身にテストウィルスを添付したメールを送ってみて、メールが届かないことを確認します。

(12)スパムチェック確認
自分自身にテストスパムメール(メール本文が「XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X」のメール)を送ってみて、受信メールサーバー別に以下のようになることを確認してください。
※テストスパムメールはスパムスコアが高く、/etc/procmailrcの「SpamAssassinにより判定されたSpam-Levelが一定値(ここでは20)以上の場合は削除」のルールを有効にしているとサーバー側で削除されてしまうので、Spamフォルダへの配送を確認する際は当該ルールを一時的にコメントアウトしてから確認してください。
【受信メールサーバーがPOPの場合】
メール件名に「***SPAM***」が付加されてSpamフォルダへ配送されていること
【受信メールサーバーがIMAPの場合】
Spamフォルダへ配送されていること

spam01

(13)スパムメール学習(受信メールサーバーが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に記録される

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください