垃圾信攻防戰 - SpamAssassin
參考文件
檔案下載
對 SPAM 的攻防,我之前在利用 Postfix 抵擋垃圾信 (new
window) 就有簡單的提過,基本上,使用 postfix 的內建 header_checks 和 body_checks 可以應付一些陽春的垃圾信,最多再使用一些進階的選項來分析連線資訊。不過對於垃圾客的手法越來越新,使用這種手動更新
rule 的使法似乎成果有限而且非常累人,因此,在小弟飽受 SPAM 的威脅之下決定使用 Spamssassin 來抵制 SPAM。
安裝
安裝 HTML::Parser
其實 Spamssassin 是 Perl 的一個模組,當然我是使用 CPAN 這個好東西來安裝我所需要的模組,而在安裝 Spamssassin
之前,需要安裝 Perl 的 HTML::Parser Module。
安裝 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
|