垃圾信攻防戰 - SpamAssassin

參考文件

檔案下載

對 SPAM 的攻防,我之前在利用 Postfix 抵擋垃圾信 (new window) 就有簡單的提過,基本上,使用 postfix 的內建 header_checks 和 body_checks 可以應付一些陽春的垃圾信,最多再使用一些進階的選項來分析連線資訊。不過對於垃圾客的手法越來越新,使用這種手動更新 rule 的使法似乎成果有限而且非常累人,因此,在小弟飽受 SPAM 的威脅之下決定使用 Spamssassin 來抵制 SPAM。

安裝

安裝 HTML::Parser

其實 Spamssassin 是 Perl 的一個模組,當然我是使用 CPAN 這個好東西來安裝我所需要的模組,而在安裝 Spamssassin 之前,需要安裝 Perl 的 HTML::Parser Module。

root # cpan HTML::Parser

安裝 SpamAssassin

當然 SpamAssassin 是主角啦!可以使用 Perl CPAN 來安裝,或是到 這裡 來下載安裝。

root # cpan Mail::SpamAssassin

如此就安裝完畢。

安裝 Mail::SPF::Query

嗯,還需要 Mail::SPF::Query 這個模組,所以就安裝起來吧!

root # cpan Mail::SPF::Query

設定

設定 SpamAssassin 設定檔

SpamAssassin 的設定檔是放在 /etc/mail/SpamAssassin/local.cf 裡面,而且個檔案裡面定義了很多簡查規則,以下,我把最簡單的設定列出來。

#多少分才判為 SPAM
required_hits 5
report_safe 1
#若為 SPAM,是否設修改主旨
rewrite_subject 1
#修改主旨為 (當 rewrite_subject 是 1 的時候才會有用)
rewrite_header Subject [SPAM]

# Encapsulate spam in an attachment
report_safe 1

# Use terse version of the spam report
use_terse_report 1

# Enable the Bayes system
use_bayes 1

# Enable Bayes auto-learning
auto_learn 1

# Enable or disable network checks
skip_rbl_checks 0
use_razor2 1
use_dcc 1
use_pyzor 1

# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - chinese english japanese
ok_languages zh en ja

# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales en ja zh

這樣做,就可以把基本的 SpamAssassin 設定起來。

新增一個 spamfilter 使用者

這個 spamfilter 主要是 spamd 會使用的,所以請建立起來,當然這個帳號是不允許從外面登入的:

root # useradd -s /bin/false spamfilter

編寫 filter script

root # touch /usr/local/sbin/filter.sh
root # vi /usr/local/sbin/filter.sh
#!/bin/bash
exec /usr/bin/spamc -d 127.0.0.1 -f -p 783 -t 30 -e /usr/sbin/sendmail -i "$@"
exit $?
root # chmod 755 /usr/local/sbin/filter.sh

你可以 按這裡 下載 filter.sh。

設定 postfix

再來,我們需要再設定 postfix 一下,讓 postfix 在接收信件時,使用 SpamAssassin 來做信件過瀘。其中會設定到最重要的 /etc/postfix/master.cf 檔,所要請記得要特別小心!

root # vi /etc/postfix/master.cf
~ 略 ~
#修改以下兩個項目
smtp inet n - n - - smtpd -o content_filter=postfixfilter
smtp unix - - n - - smtp -o content_filter=postfixfilter
~ 略 ~
# 在最後一行加入以下句子
postfixfilter unix - n n - - pipe flags=Rq user=spamfilter
 argv=/usr/local/sbin/filter.sh -f ${sender} -- ${recipient}

root #

設定了 master.cf 之後,如果你在 main.cf 有設定其它的垃圾郵件規則的話,像是 header_checks 和 body_checks 的話,就請關閉吧,這種全文分析的工作可以讓 SpamAssassin 來做就可以了。

root # vi /etc/postfix/master.cf
#把 header_checks 和 body_checks 註解起來
#header_checks = regexp:/etc/postfix/header_checks
#body_checks = regxp:/etc/postfix/body_checks
root #

重新啟動 postfix 和 SpamAssassin

root # postfix stop; sleep 3; postfix start
root # service spamassassin start

測試

當然要測試最直接的方法就是使用 telnet

root # telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to mail-test.l-penguin.idv.tw (127.0.0.1).
Escape character is '^]'.
220 l-penguin.idv.tw ESMTP Postfix
MAIL FROM: babiku007@yahoo.com.tw
250 Ok
RCPT TO: someone@your.domain.name
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Test SPAM mail
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
.

250 Ok: queued as 450BFC6249
quit
221 Bye
Connection closed by foreign host.
root #

上面是一封 SPAM body 的測試內容,現在請看一下你的 maillog,就會發現這是一封分數很高的 SPAM。

root # cat /var/log/maillog
1 Dec 4 11:55:56 dns spamd[17862]: connection from mail-test.l-penguin.idv.tw [127.0.0.1] at port 39463
2 Dec 4 11:55:56 dns spamd[17862]: info: setuid to spamfilter succeeded
3 Dec 4 11:55:56 dns spamd[17862]: processing message <20051204035518.450BFC6249@l-penguin.idv.tw> for spamfilter:86.
4 Dec 4 11:55:58 dns spamd[17862]: identified spam (999.6/5.0) for spamfilter:86 in 1.2 seconds, 487 bytes.
5 Dec 4 11:55:58 dns spamd[17862]: result: Y 999 - ALL_TRUSTED,DNS_FROM_RFC_ABUSE,FROM_ENDS_IN_NUMS,GTUBE,NO_REAL_NAME,UNDISC_RECIPS scantime=1.2,size=487,mid=<20051204035518.450BFC6249@l-penguin.idv.tw>,autolearn=disabled
6 Dec 4 11:55:58 dns postfix/pickup[18137]: 251C8C625F: uid=86 from=<babiku007@yahoo.com.tw>
7 Dec 4 11:55:58 dns postfix/cleanup[18169]: 251C8C625F: message-id=<20051204035518.450BFC6249@l-penguin.idv.tw>
8 Dec 4 11:55:58 dns postfix/pipe[18170]: 450BFC6249: to=<someone@your.domain.name>, relay=postfixfilter, delay=40, status=sent (l-penguin.idv.tw)
9 Dec 4 11:55:58 dns postfix/qmgr[18138]: 450BFC6249: removed
10 Dec 4 11:55:58 dns postfix/qmgr[18138]: 251C8C625F: from=<babiku007@yahoo.com.tw>, size=3186, nrcpt=1 (queue active)
11 Dec 4 11:55:58 dns postfix/local[18174]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
12 Dec 4 11:55:58 dns postfix/local[18174]: 251C8C625F: to=<someone@your.domain.name>, relay=local, delay=0, status=sent (delivered to mailbox)
13 Dec 4 11:55:58 dns postfix/qmgr[18138]: 251C8C625F: removed
14 Dec 4 11:55:59 dns postfix/smtpd[18166]: disconnect from mail-test.l-penguin.idv.tw[127.0.0.1]

root #

當你有看到信被打分數,就表示新的垃圾分析有在運作了。

分析

在你的 maillog 裡,會明顯看到這是一封分數高達 999 的 SPAM,現在我們來看看被認定為 SPAM 的信會長什麼樣子,當然以下我以 Openwebmail 來開啟我的信件。

若是為 SPAM,那麼就會在主旨的最前面多出個 [SPAM] 字樣,現在來看看表頭部份。

Return-Path: <babiku007@yahoo.com.tw>
X-Original-To: someone@your.domain.name
Delivered-To: someone@your.domain.name
Received: by l-penguin.idv.tw (Postfix, from userid 86)
id 251C8C625F; Sun, 4 Dec 2005 11:55:58 +0800 (CST)
Received: from localhost by dns.l-penguin.idv.tw
with SpamAssassin (version 3.0.4);
Sun, 04 Dec 2005 11:55:58 +0800
From: babiku007@yahoo.com.tw
To: undisclosed-recipients:;
Subject: [SPAM] Test SPAM mail
Date: Sun, 4 Dec 2005 11:55:18 +0800 (CST)
Message-Id: <20051204035518.450BFC6249@l-penguin.idv.tw>
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.0.4 (2005-06-05) on
dns.l-penguin.idv.tw
X-Spam-Level: **************************************************
X-Spam-Status: Yes, score=999.6 required=5.0 tests=ALL_TRUSTED,
DNS_FROM_RFC_ABUSE,FROM_ENDS_IN_NUMS,GTUBE,NO_REAL_NAME,UNDISC_RECIPS
autolearn=disabled version=3.0.4
X-Spam-Report:
* 0.2 NO_REAL_NAME From: does not include a real name
* 0.5 FROM_ENDS_IN_NUMS From: ends in numbers
* 1.4 UNDISC_RECIPS Valid-looking To "undisclosed-recipients"
* -2.8 ALL_TRUSTED Did not pass through any untrusted hosts
* 1000 GTUBE BODY: Generic Test for Unsolicited Bulk Email
* 0.4 DNS_FROM_RFC_ABUSE RBL: Envelope sender in abuse.rfc-ignorant.org
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----------=_439268CE.44AD695C"
Status: R

X-Spam-Level 後面接了個很多 "*",每個 * 都表示一個分數,而超過所設定的分數 (本例為 5),那麼就會在 X-Spam-Status 記錄為 Yes,判別為 SPAM。

應用

在使用過 SpamAssassin 之後,小弟本人是非常的建議使用,因為判別的精準度非常高,當然在 User 使用離線軟體 (如 Outlook) 時,再配合其過濾功能 (把 [SPAM] 開頭的信件直接刪除) 就能讓信件看起來更清爽。

後記

小弟在 12/04/2005 完成這篇文章之後,發現收到測試的 SPAM mail 越來越多了,這表示有很多網友觀看小弟的文章,小弟非常高興,但是也希望把 RCPT TO: 這個後面的 mail 改成您自己實際的測試帳號,不然小弟一開信就是一堆 Test SPAM Mail,開始有點吃不消了呢!

Last modified: 09/06/2006
12/04/2005

首頁