2006-12-21 16:49:35過路人而已

AMaVisd-new 設定

【amavisd-new Installation 部份摘錄】
原作者:
元智大學資訊管理學系曾義峰(s882617@mail.yzu.edu.tw)

Step 1:

# cd /usr/ports/security/amavisd-new/
# make install clean

# cd /usr/local/etc
# cp amavisd.conf-dist amavisd.conf
# chown vscan amavisd.conf
# chmod 750 amavisd.conf

# chown vscan /usr/local/sbin/amavisd
# chmod 750 /usr/local/sbin/amavisd

修改 amavisd.conf 的選項

$mydomain = '[你的FQDN]';
$TEMPBASE = "/tmp";
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;

以下的設定請自行選擇

$virus_admin = "vscan@$mydomain"
$mailfrom_notify_admin = "vscan@$mydomain";
$mailfrom_notify_recip = "vscan@$mydomain";
$mailfrom_notify_spamadmin = "vscan@$mydomain";

# $QUARANTINEDIR = '/var/virusmails';

關於 postfix ,則於 /usr/local/etc/postfix/master.cf 新增二筆

smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes

127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=

<註> 關於 127.0.0.1:10025 的 content_filter 為空白,
是因為若於 postfix 的 main.cf 中,先前已有定義 content_filter 的話,
可能會造成在 local 端無限轉寄給自己,若無限轉寄的情形發生,
postfix 會給出信件的錯誤訊息為「Error: too many hops 」。

<註> 關於 smtp-amavis 中 command 欄的 smtp ,
由於 postfix 1 在 lmtp protocol 有兩個小問題,
若是使用 postfix 2 則可以改為 lmtp ,
而 lmtp 的好處為「This brings multi-session mail transaction capability and per-recipient status responses」- 截取自官方網站,
且可以更改 postfix 的main.cf 中 'max_use' 的參數來限制 session 重覆使用,
官方範例是改為 10 (預設為 100)。smtp-amavis 修改過後如下:
smtp-amavis unix - - n - 2 lmtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes

測試

# /usr/local/sbin/postfix stop
# /usr/local/sbin/postfix start

# su - vscan
# /usr/local/sbin/amavisd debug

開啟另一個(虛擬)終端機,執行:

# telnet localhost 10024
Trying 127.0.0.1...
Connected to localhost.mis.yzu.edu.tw.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
MAIL FROM:<xxx@domain.edu.tw>
250 2.1.0 Sender xxx@domain.edu.tw OK
RCPT TO:<xxx@domain.edu.tw>
250 2.1.5 Recipient xxx@domain.edu.tw OK
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Test 1

Test
.
250 2.6.0 Ok, id=89173-01, from MTA: 250 Ok: queued as 2E0DAEB
RSET
250 2.0.0 Ok RSET
MAIL FROM:<xxx@domain.edu.tw>
250 2.1.0 Sender xxx@domain.edu.tw OK
RCPT TO:<xxx@domain.edu.tw>
250 2.1.5 Recipient xxx@domain.edu.tw OK
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Test 2

X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
250 2.5.0 Ok, but 1 BOUNCE <-- 出現這行表示成功認知此信件可能含有 Virus
QUIT

Step 2:配合 Spamassassin

在新版的 AMaVisd-new 已經將 Spamassassin 整合進來,所以只要用 ports 安裝好 AMaVisd-new ,則 Spamassassin 也已安裝好。
若伺服器不需要 Spamassassin 的功能,則此步驟可以略過,直接至 Step 3。

新增使用者

# pw useradd spam -c "Spam Bayes Learner" -d /var/empty -s /sbin/nologin
# pw useradd notspam -c "Not Spam Bayes Learner" -d /var/empty -s /sbin/nologin

於 /usr/local/etc/mail/spamassassin/local.cf 加入 (若無 local.cf ,則請自行建立)

use_bayes 1
bayes_path /var/amavis/.spamassassin/bayes
auto_learn 1
auto_learn_threshold_nonspam -2
auto_learn_threshold_spam 15
於 /usr/local/etc/amavisd.conf 新增/修改以下相關內容

$max_servers = 2;
$max_requests = 10;
$child_timeout=5*60;

@bypass_virus_checks_acl = qw( . );
@local_domains_acl = ( ".$mydomain" );

$final_spam_destiny = D_PASS;

read_hash(%whitelist_sender, '/var/amavis/whitelist');
read_hash(%blacklist_sender, '/var/amavis/blacklist');
read_hash(%spam_lovers, '/var/amavis/spam_lovers');

# SpamAssassin settings

#$sa_local_tests_only = 1;
$sa_auto_whitelist = 1;
$sa_mail_body_size_limit = 64*1024;
$sa_tag_level_deflt = 4.0;
$sa_tag2_level_deflt = 6.3;
$sa_kill_level_deflt = $sa_tag2_level_deflt;
$sa_spam_subject_tag = '***SPAM*** ';

<註> max_server 及 max_requests 請依照伺服器等級增減,
另 chile_timeout 不得大於 postfix main.cf 的 smtp_data_done_timeout
及 master.cf 中 smtp-amavis 中 smtp_data_done_timeout 的值。

# touch /var/amavis/whitelist
# touch /var/amavis/blacklist
# touch /var/amavis/spam_lovers

# chown vscan /var/amavis/whitelist
# chown vscan /var/amavis/blacklist
# chown vscan /var/amavis/spam_lovers

# echo spam@domain.edu.tw >> /var/amavis/spam_lovers
# echo notspam@domain.edu.tw >> /var/amavis/spam_lovers

於 /usr/local/etc/postfix/main.cf 新增一行

content_filter = smtp-amavis:[127.0.0.1]:10024

撰寫 Bayesian Learning Script

# vi /usr/local/sbin/my-sa-learn.sh

#!/bin/sh

if [ -e /var/mail/spam ]; then
/usr/local/bin/sa-learn --spam -p /var/amavis/.spamassassin/user_prefs --mbox /var/mail/spam
rm /var/mail/spam > /dev/null
fi

if [ -e /var/mail/notspam ]; then
/usr/local/bin/sa-learn --ham -p /var/amavis/.spamassassin/user_prefs --mbox /var/mail/notspam
rm /var/mail/notspam > /dev/null
fi

/usr/local/bin/sa-learn --rebuild -p /var/amavis/.spamassassin/user_prefs

# chmod 700 /usr/local/sbin/my-sa-learn.sh

# crontab -e
5 0 * * * /usr/local/sbin/my-sa-learn.sh
重新啟動

# /usr/local/sbin/postfix stop
# /usr/local/sbin/postfix start

# /usr/local/etc/rc.d/amavisd.sh stop
# /usr/local/etc/rc.d/amavisd.sh start

若是使用 Spamassassin 的 spamd ,則亦需重新啟動。

啟動 AMaVisd 時,請確定是否有正確找到 Anti-Virus 的套件

# cat /var/log/maillog

May 9 15:49:07 std1 amavis[39356]: Found primary av scanner NAI McAfee AntiVirus (uvscan) at /usr/local/bin/uvscan
May 9 15:49:07 std1 amavis[39356]: Found secondary av scanner Clam Antivirus - clamscan at /usr/local/bin/clamscan

<註>以上訊息為已安裝 uvscan 及 clamav 後,AMaVisd 正確找到該套件的。

最後則是測試階段。

測試一陣子後,若覺得SPAM機制很完整後,可以將 amavisd.conf 的 $final_spam_destiny 改成 D_REJECT或 D_DISCARD。

Step 3:其他參考設定

定期清理 mail quere

# vi /usr/local/sbin/my-queue-cleanup.sh

#!/bin/sh
mailq |grep MAILER-DAEMON | awk '{printf $1} {print " deferred"}' | tr -d '*!' | xargs -n 2 postsuper -d

<註> 上列程式為一行。

# chmod 500 /usr/local/sbin/my-queue-cleanup.sh

# crontab -e
0 5 * * * /usr/local/sbin/my-queue-cleanup.sh

另一種方式是比對 spamassassin 或 hits

# vi /usr/local/sbin/my-queue-cleanup.sh

#!/bin/sh
TMPFILE=/tmp/clean.queue.$$
DEFERDIR=/var/spool/postfix/deferred
# collect the filenames
mailq |grep MAILER-DAEMON | cut -f1 -d ' ' > $TMPFILE

for DEFERFILE in `cat $TMPFILE`
do
FILEPATH=`find $DEFERDIR -name $DEFERFILE`
egrep -i 'spamassassin|hits=[0-9]{1,2}.[0-9]' $FILEPATH > /dev/null
if [ $? -eq 0 ]
then
# deferred message is most likely spam
postsuper -d $DEFERFILE deferred
fi
done

rm -f $TMPFILE > /dev/null

增加處理效能

將 /usr/local/etc/amavisd.conf 的 $max_servers 數字加大,預設是 2。
然後將該數字對映到 /usr/local/etc/postfix/master.cf 的 smtp-amavis 。

例:

$max_servers = 4
smtp-amavis unix - - y - 4 smtp(lmtp)

如何簡單停止 AMaVisd

只要將 /usr/local/etc/postfix/main.cf 的

# content_filter = smtp-amavis:[localhost]:10024

註解起來即可,然後重新 reload postfix 。