|
參考文件
檔案下載
對 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 1156 dns spamd[17862]: connection from mail-test.l-penguin.idv.tw [127.0.0.1] at port 39463
- 2 Dec 4 1156 dns spamd[17862]: info: setuid to spamfilter succeeded
- 3 Dec 4 1156 dns spamd[17862]: processing message <20051204035518.450BFC6249@l-penguin.idv.tw> for spamfilter:86.
- 4 Dec 4 1158 dns spamd[17862]: identified spam (999.6/5.0) for spamfilter:86 in 1.2 seconds, 487 bytes.
- 5 Dec 4 1158 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 1158 dns postfix/pickup[18137]: 251C8C625F: uid=86 from=<babiku007@yahoo.com.tw>
- 7 Dec 4 1158 dns postfix/cleanup[18169]: 251C8C625F: message-id=<20051204035518.450BFC6249@l-penguin.idv.tw>
- 8 Dec 4 1158 dns postfix/pipe[18170]: 450BFC6249: to=<someone@your.domain.name>, relay=postfixfilter, delay=40, status=sent (l-penguin.idv.tw)
- 9 Dec 4 1158 dns postfix/qmgr[18138]: 450BFC6249: removed
- 10 Dec 4 1158 dns postfix/qmgr[18138]: 251C8C625F: from=<babiku007@yahoo.com.tw>, size=3186, nrcpt=1 (queue active)
- 11 Dec 4 1158 dns postfix/local[18174]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
- 12 Dec 4 1158 dns postfix/local[18174]: 251C8C625F: to=<someone@your.domain.name>, relay=local, delay=0, status=sent (delivered to mailbox)
- 13 Dec 4 1158 dns postfix/qmgr[18138]: 251C8C625F: removed
- 14 Dec 4 1159 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 1158 +0800 (CST)
- Received: from localhost by dns.l-penguin.idv.tw
- with SpamAssassin (version 3.0.4);
- Sun, 04 Dec 2005 1158 +0800
- From: babiku007@yahoo.com.tw
- To: undisclosed-recipients:;
- Subject: [SPAM] Test SPAM mail
- Date: Sun, 4 Dec 2005 1118 +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,開始有點吃不消了呢!
|
|