SpamAssassin出自DebianWiki

SpamAssassin

出自DebianWiki目錄
1 所需套件
2 簡介
3 設定 SpamAssassin
4 設定 SpamAssassin 和 Postfix 搭配使用
4.1 spamd/spamd 模式(一般作法)
4.2 利用 Amavisd-new 來呼叫 SpamAssassin(建議做法)
5 測試 SpamAssassin
6 其它

[編輯]
所需套件

spamassassin (sa)
[編輯]
簡介

SpamAssassin (SA) 是利用 Perl 來進行文字分析以達到過濾垃圾郵件之目的。 它的判斷方式是藉由評分方式 - 若這封郵件符合某種特徵,則加以評分。若總得分高於某項標準,則判定為垃圾郵件。

為了應用於高負載之伺服器上,它也提供了 spamc/spamd 這組以 Client/Server 為架構之程式,如此可以有效降低 SpamAssassin 對系統資源的需求。但 Debian 預設上並不會啟用這個服務。

而我們還可以替而使用 Amavisd-new 來呼叫 SpamAssassin,也就是讓 Amavisd-new 肩負掃毒及過濾垃圾郵件的重責。而在本人的系統中,這個方法比起使用 spamc/spamd 的做法快上了非常多,所以建議採用這種作法。
[編輯]
設定 SpamAssassin

修改 /etc/mail/spamassassin/local.cf 如下,這是 SpamAssassin 的設定檔:
(詳細設定請參考 man Mail::SpamAssassin::Conf)
(修改 /etc/mail/spamassassin/local.cf 後會即時生效,用不著重新啟動 SpamAssassin。)
# This is the right place to customize your installation of SpamAssassin.
#
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.
#
###########################################################################
#
# rewrite_subject 0
# report_safe 1
# trusted_networks 212.17.35.

# 得分多少以上就會被判定為垃圾郵件
required_hits 5.0

# 絕不會被判定為垃圾郵件之列表
# 請自行加以增刪修改!
whitelist_from tetralet@localhost
whitelist_from *@virtual.com

# 在垃圾郵件上之標題上加上註記
rewrite_subject 1

# 要如何處理垃圾郵件。因為郵件還會經過防毒程式的處理,所以必須設定為 0。
# 0:將資訊寫入郵件表頭。
# 1:將垃圾郵件轉為附件。
# 2:將垃圾郵件轉為純文字附件。
report_safe 0

# 在處理垃圾郵件時,在郵件檔頭是否不加註詳細原因?
use_terse_report 0

# 是否使用 Bayesian
use_bayes 1

# Bayesian 之資料庫位置
bayes_path /var/lib/amavis/.spamassassin/bayes

# 是否啟用 Bayesian 自動學習功能?
auto_learn 1

# 略過 RBLs 之檢查
skip_rbl_checks 0

# 是否使用 Razor version 2
use_razor2 1

# 是否使用 DCC (Distributed Checksum Clearinghouse)
use_dcc 1

# 是否使用 Pyzor
use_pyzor 1

# 是否在郵件表頭中加入 DCC 資訊
dcc_add_header 1

# 是否能夠進行 DNS 查詢。直接設定為 yes 將有效加快 amavis 的啟動速度。
# 設定值:(yes|no|test)
dns_available yes

# 檢查是否為由內部網路所寄出的信件。
# 若是,則永遠不判斷為垃圾郵件。(評分減 50 分)
# 其中的 example.net 請替換成您的 Domain Name...
header LOCAL_RCVD Received =~ /.*\(\S+\.example\.net\s+\[.*\]\)/
describe LOCAL_RCVD Received from local machine
score LOCAL_RCVD -50

# 一些自訂的規則
body WINDOWOPEN /window\.open\(/i
describe WINDOWOPEN JavaScript: Windows.Open
score WINDOWOPEN 3.5

# 垃圾郵件計分規則。
## Optional Score Increases
score DCC_CHECK 4.000
score RAZOR2_CHECK 2.500
score BAYES_99 4.300
score BAYES_90 3.500
score BAYES_80 3.000
[編輯]
設定 SpamAssassin 和 Postfix 搭配使用

Postfix 与外部过滤程序的通讯有两种方式:基于命令的过滤(即以下所说的“一般做法”),以及基于守护进程的过滤(即以下的“建议做法”)。

对于前者,Postfix 每处理一封邮件,过滤命令就被启动一次,并且过滤程序还必须调用一次 Sendmail,将完成过滤的邮件送回 Postfix,所以运算成本比较高。

相对于实时地启动外部过滤程序,基于守护进程的过滤显然在I/O与CPU使用方面比较经济,不必每处理一封邮件就多创建一个新的进程,并且基于守护进程的过滤与 Postfix 之间的交互架构也比较先进,双方使用标准的 SMTP 或 LMTP 协议交换邮件。
[編輯]
spamd/spamd 模式(一般作法)

修改 /etc/default/spamassassin,將其中的 ENABLED=0 改為 ENABLED=1,以啟動 spamd:
# /etc/default/spamd.conf
# Duncan Findlay

# WARNING read README.spamd before using. THERE ARE SECURITY RISKS!

# Change to one to enable spamd
ENABLED=1

# Options
# See man spamd for possible options. The -d option is automatically added.
OPTIONS="-c -m 10 -a -H"

# Set nice level of spamd
#NICE="--nicelevel 15"

注:也可以在此使用 -u 參數來指定啟用 SpamAssassin Daemon 的帳號,
但由於 SpamAssassin Daemon 會 su 成 Client 帳號來過濾垃圾郵件,
因而並無此必要...

修改 /etc/postfix/master.cf 如下,告知 Postfix 使用 SpamAssassin 來掃瞄郵件內容:
(其中的 spamassassin 字串可以自訂)
(上略)

# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - n - - smtpd -v
-o content_filter=spamassassin

(下略)

並再修改 /etc/postfix/master.cf,加入以下內容:
(在此是設定 spamassassin 的內容。詳細參數請參考 man spamc 及 man sendmail 之說明。)
注意,一般是以 nobody 身份來啟動 SpamAssassin,但在此例中是以 amavis 的身份來呼叫 SpamAssassin 的!
spamassassin unix - n n - - pipe flags=Rq user=amavis
argv=/usr/bin/spamc -d 127.0.0.1 -f -p 783 -t 30
-e /usr/sbin/sendmail -oi -f ${sender} -- ${recipient}

因為,若以 nobody 身份來啟動 SpamAssassin 時,往往會因為 nobody 的 Home Directory 不存在,因而在 /var/log/mail.log 中將出現類似以下的錯誤訊息:
Oct 30 13:21:47 qemu spamd[788]: info: setuid to nobody succeeded
Oct 30 13:21:47 qemu spamd[788]: Creating default_prefs [/nonexistent/.spamassassin/user_prefs]
Oct 30 13:21:47 qemu spamd[788]: Cannot write to /nonexistent/.spamassassin/user_prefs: No such file or directory
Oct 30 13:21:47 qemu spamd[788]: Couldn't create readable default_prefs for [/nonexistent/.spamassassin/user_prefs]

所以改由以 amavis 身份來啟動 SpamAssassin。

修改完畢後,使用以下指令來啟動 SpamAssassin 並重新啟動 Postfix:
/etc/init.d/spamassassin start

/etc/init.d/postfix restart

在預設上,spamd 會監聽 783 這個 Port。

另外,SpamAssassin 可以使用 sa-learn 指令來學習新的垃圾郵件規則,請參考 AntiSpam with Bayesian Classifier 一章之說明。
[編輯]
利用 Amavisd-new 來呼叫 SpamAssassin(建議做法)

我們可以替而使用 Amavisd-new 來呼叫 SpamAssassin,也就是讓 Amavisd-new 肩負掃毒及過濾垃圾郵件的重責。而在本人的系統中,這個方法比起使用 spamc/spamd 的做法快上了非常多,所以建議採用這種作法。

請修改 /etc/amavis/amavisd.conf 如下:
(注:/etc/amavis/amavisd.conf 的內容很大,以下只節錄必須修改的項目)
# 在 @bypass_spam_checks_acl = qw( . ); 前加上註解,讓 Amavisd-new 啟動 SpamAssassin
# Any setting can be changed with a new assignment, so make sure
# you do not unintentionally override these settings further down!
# @bypass_spam_checks_acl = qw( . ); # No default dependency on spamassassin

# 不要移去 SpamAssassin 所加入的 Headers,但似乎是沒有作用?
#$remove_existing_spam_headers = 0; # leave existing X-Spam* headers alone
$remove_existing_spam_headers = 0; # remove existing spam headers if
# spam scanning is enabled (default)

# 讓 SpamAssassin 可以和外部連線
# $sa_local_tests_only is passed to Mail::SpamAssassin::new as a value
# of the option local_tests_only. See Mail::SpamAssassin man page.
# If set to 1, SA tests are restricted to local tests only, i.e. no tests
# that require internet access will be performed.
#
$sa_local_tests_only = 0; # (default: false)

# 啟用自動的 White List
$sa_auto_whitelist = 1; # turn on AWL (default: false)

# 設定 White List
# 注意:在 /etc/spamassassin/local.cf 所設定的將失去效用!
map { $whitelist_sender{lc($_)}=1 } (qw(
[email protected]
));
# 或指定為某個檔案。注意:這些檔案必須存在,否則 Amavisd-new 將無法啟動!
read_hash(\%whitelist_sender, '/var/lib/amavis/whitelist');
# 指定黑名單
read_hash(\%blacklist_sender, '/var/lib/amavis/blacklist');
# 若收件人名列其中,則不進行垃圾郵件檢測
read_hash(\%spam_lovers, '/var/lib/amavis/spam_lovers');

# 超過某個特定大小的郵件可以不經過 SpamAssassin 的掃瞄
$sa_mail_body_size_limit = 150*1024; # don't waste time on SA is mail is larger
# (less than 1% of spam is > 64k)
# default: undef, no limitations

# 設定評分規則。
# default values, can be overridden by more specific lookups, e.g. SQL
# 超過這個標準者,就在郵件標頭加入 Spam 資訊
$sa_tag_level_deflt = 4.0; # add spam info headers if at, or above that level
# 超過這個標準者,就直接視為垃圾郵件
$sa_tag2_level_deflt = 6.3; # add 'spam detected' headers at that level
# 超過這個標準者,就直接將信件備份後刪除。
$sa_kill_level_deflt = 10 ; # triggers spam evasive actions
# at or above that level: bounce/reject/drop,
# quarantine, and adding mail address extension

# 啟用 SpamAssassin 的 Debug。在正式上線時請記得去掉!
# Turn on SpamAssassin debugging (output to STDERR, use with 'amavisd debug')
$sa_debug = 1; # defaults to false

然後重新啟動 Amavisd-new 即可。

若因任何原因而無法啟動 Amavisd-new, 可以使用以下指令來進行 Debug:
amavisd-new debug-sa
[編輯]
測試 SpamAssassin

在安裝 SpamAssassin 時,也同時會附上測試用的 Spam 範例檔。 您可以用以下指令來測試 SpamAssassin 是否能夠正確運作了:
spamassassin -t < /usr/share/doc/spamassassin/examples/sample-spam.txt

寄封測試用的垃圾郵件吧:
# telnet 127.0.0.1 25
Connected to 127.0.0.1.
Escape character is '^]'.
220 qemu ESMTP Postfix (Debian/GNU)
MAIL FROM:<[email protected]>
250 Ok
RCPT TO:<tetralet>
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Test spam mail (GTUBE)

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
.
250 Ok: queued as 0C3E9C906B
quit
221 Bye
Connection closed by foreign host.

看看這封郵件是否真的被判定為垃圾郵件了:
From [email protected] Fri Oct 22 16:50:46 2004
Return-Path: <[email protected]>
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: by qemu (Postfix, from userid 65534)
id 7ACB8C9073; Fri, 22 Oct 2004 16:50:46 +0800 (CST)
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
by qemu (Postfix) with SMTP id 9D7C0C9063
for <tetralet>; Fri, 22 Oct 2004 16:50:18 +0800 (CST)
Subject: *****SPAM***** Test spam mail (GTUBE)
Message-Id: <20041022085018.9D7C0C9063@qemu>
Date: Fri, 22 Oct 2004 16:50:18 +0800 (CST)
From: [email protected]
To: undisclosed-recipients: ;
X-Spam-DCC: :
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 2.64 (2004-01-11) on qemu
X-Spam-Level: **************************************************
X-Spam-Status: Yes, hits=907.6 required=5.0 tests=GTUBE,MSGID_FROM_MTA_SHORT,
NO_REAL_NAME,RAZOR2_CF_RANGE_51_100,RAZOR2_CHECK,USER_IN_WHITELIST
autolearn=no version=2.64
X-Spam-Report:
* 0.3 NO_REAL_NAME From: does not include a real name
* 1000 GTUBE BODY: Generic Test for Unsolicited Bulk Email
* 1.6 RAZOR2_CF_RANGE_51_100 BODY: Razor2 gives confidence between 51 and 100
* [cf: 100]
* 2.5 RAZOR2_CHECK Listed in Razor2 (http://razor.sf.net/)
* -100 USER_IN_WHITELIST From: address is in the user's white-list
* 3.3 MSGID_FROM_MTA_SHORT Message-Id was added by a relay

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

如果一切沒問題,那就大功告成囉∼∼
[編輯]
其它

另外還有一個名為 Spamstats 的 Perl Script 可以用來分析 /var/log/mail.log 裡的 Spam 資訊。 不妨試用看看!