1. 程式人生 > >Postfix 安全防護實戰及垃圾郵件防範

Postfix 安全防護實戰及垃圾郵件防範

電子郵件系統已成為現代企業必不可少的網路基礎設施,開源電子郵件系統也逐漸成為企業構建應用時的首選。然而,如何確保電子郵件系統安全,抵禦垃圾郵件、 郵件病毒等安全威脅是企業在應用構建過程中需要著重解決的問題。本系列的第一部分介紹了企業開源電子郵件系統原理及 Sendmail、Qmail 郵件服務安全防護實戰,本文將詳細介紹 Postfix 的安全防護實戰,以及如何進行企業垃圾郵件防範。

實戰構建安全 Postfix 電子郵件伺服器

Postfix 是一個由 IBM 資助、由 Wietse Venema 負責開發的自由軟體工程產物,它的目的就是為使用者提供除 Qmail 之外的郵件伺服器選擇。Postfix 在快速、易於管理和提供儘可能的安全性方面都進行了較好的考慮。Postfix 是基於半駐留、互操作的程序的體系結構,每個程序完成特定的任務,沒有任何特定的程序衍生關係,使整個系統程序得到很好的保護。同時 Postfix 也可以和 Qmail 郵件伺服器保持相容性以滿足使用者的使用習慣。

與 Qmail 相比,Postfix 最被人稱道的地方就在於其配置檔案的可讀性很高。Postfix 的主配置檔案是 /etc/postfix/main.cf。雖然該配置檔案的內容比較多,但其中大部分內容都是註釋(“#”號開頭的行),真正需要自行定義的引數並不 多。然而,為了對其進行安全配置,還是需要針對某些選項進行細心的設定。

在 main.cf 檔案中,引數都是以類似變數的設定方法來設定的,這些引數的使用主要包含兩部分的內容:

(1)定義和宣告變數:例如 definename = good-better-best。等號左邊是變數的名稱,等號右邊是變數的值。

(2)引用變數:可以在變數的前面加上符號“$”來引用該變數,如:myname = $ definename(相當於 definename = good-better-best)。

需要注意的是:等號兩邊需要有空格字元。此外,如果變數有兩個以上的設定值,就必須用逗號“,”或者空格符“ ”將它們分開。

在熟悉了上述變數的定義和引用方法後,下面詳細介紹如何安全、高效地配置 Postfix 伺服器的相關選項。

設定 Postfix 服務監聽的網路介面

預設情況下,inet_interfaces 引數的值被設定為 localhost,這表明只能在本地郵件主機上寄信。如果郵件主機上有多個網路介面,而又不想使全部的網路介面都開放 Postfix 服務,就可以用主機名指定需要開放的網路介面。不過,通常是將所有的網路介面都開放,以便接收從任何網路介面來的郵件,即將 inet_interfaces 引數的值設定為“all”,如下所示:

inet_interfaces = all

安全設定可接收郵件的主機名稱或域名

mydestination 引數非常重要,因為只有當發來的郵件的收件人地址與該引數值相匹配時,Postfix 才會將該郵件接收下來。通過該選項的設定可以過濾掉許多沒有經過認證和授權的郵件,從而節省伺服器的儲存空間,以及節省使用者的郵件處理時間。舉一個簡單的 例子,使用者可以將該引數值設定為如下:

accept_domain = test.net 
mydestination = $accept_domain

這就表明無論來信的收件人地址是 [email protected](其中 X 表示某使用者在 test.net 域中的郵件賬戶名),Postfix 都會接收這些郵件。而除此之外的郵件,Postfix 都不會接受。

安全設定可轉發郵件的網路(IP 設定)

有關安全設定可轉發郵件的網路可以使用 mynetworks 引數來設定。可將該引數值設定為所信任的某臺主機的 IP 地址,也可設定為所信任的某個 IP 子網或多個 IP 子網(採用“,”或者“ ”分隔)。

比如,使用者可以將 mynetworks 引數值設定為 172.168.96.0/24,則表示這臺郵件主機只轉發子網 172.168.96.0/24 中的客戶端所發來的郵件,而拒絕為其他子網轉發郵件:

mynetworks = 172.168.96.0/24

除了 mynetworks 引數外,還有一個用於控制網路郵件轉發的引數是 mynetworks-style,它主要用來設定可轉發郵件網路的方式。通常有以下三種方式:

  • class:在這種方式下,Postfix 會自動根據郵件主機的 IP 地址得知它所在的 IP 網路型別(即 A 類、B 類或是 C 類),從而開放的它所在的 IP 網段。
  • subnet:這是 postfix 的預設值,Postfix 會根據郵件主機的網路介面上所設定的 IP 地址、子網掩碼來得知所要開放的 IP 網段。
  • host:在這種方式下,Postfix 只會開放本機。

通常,使用者一般不需要設定 mynetworks-style 引數,而直接設定 mynetworks 引數。如果這兩個引數都進行了設定,那麼 mynetworks 引數的設定有效。

設定可轉發郵件的網路(域名設定)

上面介紹的 mynetworks 引數是針對郵件來源的 IP 來設定的,而 relay_domains 引數則是針對郵件來源的域名或主機名來設定的,其實從原理上來說是一致的,不過是區分了 IP 地址和域名而已,不過,relay_domains 還需要依賴 DNS 這個基礎設施。

例如,使用者可以將 relay_domains 引數值設定為 test.net,則表示任何由域 test.net 發來的郵件都會被認為是信任的,Postfix 會自動對這些郵件進行轉發,如下所示:

relay_domains = test.net

那麼,要使它能在實際網路中更好地轉發郵件,還必須進行相應的 DNS 設定。那麼,需要在該網路的 DNS 伺服器上定義了一個主區域 test.net,並在該區域配置檔案中定義了以下記錄:

// 定義郵件伺服器的 IP 地址
 patterson.test.net. IN  A  172.168.96.254 
 // 定義郵件伺服器的別名
 mail.test.net. IN CNAME  patterson.test.net. 
 // 定義優先級別
 test.net. IN MX  10 mail.test.net.

上述記錄只對郵件伺服器進行了定義,還有諸如 SOA、NS 等的定義,在這裡就不再贅述。

Postfix 使用 SMTP 安全認證

如同前面所述的 Qmail 伺服器面臨的郵件轉發的問題,在 Postfix 伺服器中同樣也存在。為了避免這種情況的出現,Postfix 預設不會對外開放轉發功能,而僅對本機(localhost)開放轉發功能。但是,在實際應用中,必須在 Postfix 主配置檔案中通過設定 mynetworks、relay_domains 引數來開放一些所信任的網段或網域,否則該郵件伺服器幾乎沒有什麼用處。在開放了這些所信任的網段或網域後,還可以通過設定 SMTP 認證,對要求轉發郵件的客戶端進行使用者身份(使用者賬戶名與密碼)驗證。只有通過了驗證,才能接收該使用者寄來的郵件並幫助轉發。同樣,Postfix 中目前比較常用的 SMTP 認證機制是通過 Cyrus SASL 包來實現的。

預設情況下,Postfix 並沒有啟用 SMTP 認證機制。要讓 Postfix 啟用 SMTP 認證,就必須對 Postfix 的主配置檔案 /etc/postfix/main.cf 進行修改。使用者需要在 main.cf 檔案中新增如下有關 SMTP 認證的設定部分:

smtpd_sasl_auth_enable = yes 
smtpd_sasl_local_domain = ''
smtpd_recipient_restrictions = permit_mynetworks 
permit_sasl_authenticated, reject_unauth_destination 
broken_sasl_auth_clients=yes 
smtpd_client_restrictions = permit_sasl_authenticated 
smtpd_sasl_security_options = noanonymous

其中,每個選項的具體含義如下:

(1)smtpd_sasl_auth_enable:指定是否要啟用 SASL 作為 SMTP 認證方式。預設不啟用,這裡必須將它啟用,所以要將該引數值設定為 yes。

(2)smtpd_sasl_local_domain:如果採用 Cyrus-SASL 版進行認證,那麼這裡不做設定。

(3)smtpd_recipient_restrictions:表示通過收件人地址對客戶端發來的郵件進行過濾。通常有以下幾種限制規則:

permit_mynetworks:表示只要是收件人地址位於 mynetworks 引數中指定的網段就可以被轉發郵件。
permit_sasl_authenticated:表示允許轉發通過 SASL 認證的郵件。
reject_unauth_destination:表示拒絕轉發含未信任的目標地址的郵件。
(4)broken_sasl_auth_clients:表示是否相容非標準的 SMTP 認證。有一些 Microsoft 的 SMTP 客戶端採用非標準的 SMTP 認證協議,只需將該引數設定為 yes 就可解決這類不相容問題。

(5)smtpd_client_restrictions:表示限制可以向 Postfix 發起 SMTP 連線的客戶端。如果要禁止未經過認證的客戶端向 Postfix 發起 SMTP 連線,則可將該引數值設定為 permit_sasl_authenticated。

(6)smtpd_sasl_security_options:用來限制某些登入的方式。如果將該引數值設定為 noanonymous,則表示禁止採用匿名登入方式。

在完成上述設定後,必須使用命令 /etc/init.d/postfix reload 重新載入配置檔案,或使用命令 /etc/init.d/postfix restart 重新啟動 Postfix 服務,以使該配置生效。當然,這兩個命令的具體使用需要根據不同的 Linux 版本來選用。

此外,由於當 Postfix 要使用 SMTP 認證時,會讀取 /usr/lib/sasl2/smtpd.conf 檔案中的內容,以確定所採用的認證方式,因此如果要使用 saslauthd 這個守護程序來進行密碼認證,就必須確保 /usr/lib/sasl2/smtpd.conf 檔案中的內容為:

pwcheck_method: saslauthd

實戰電子垃圾郵件防範

防治垃圾郵件的主流策略和技術

電子郵件的廉價和操作簡便在給人們帶來巨大便利的同時,也誘使有些人將它作為大量散發自己資訊的工具,最終導致了網際網路世界中垃圾郵件的泛 濫。垃圾郵件問題已經極大地消耗了網路資源,並給人們帶來了極大的不便。據中國網際網路協會(ISC)反垃圾郵件狀況調查顯示,中國郵件使用者平均每人每天收 到郵件 17 封,佔收到郵件總數的 70% 以上。

目前,垃圾電子郵件已成為人們最頭疼的問題之一。在 Linux 作業系統平臺中,反擊和過濾垃圾電子郵件是一件很重要的工作。下面介紹一些在 Linux 中廣泛使用的防垃圾郵件技術。

SMTP 使用者認證技術

目前常見並十分有效的方法是,在郵件傳送代理 MTA 上對來自本地網路以外的網際網路的發信使用者進行 SMTP 認證,僅允許通過認證的使用者進行遠端轉發。這樣既能夠有效避免郵件傳送代理伺服器為垃圾郵件傳送者所利用,又為出差在外或在家工作的員工提供了便利。如果 不採取 SMTP 認證,那麼在不犧牲安全的前提下,設立面向網際網路的 Web 郵件閘道器也是可行的。此外,如果 SMTP 服務和 POP3 服務整合在同一伺服器上,在使用者試圖發信之前對其進行 POP3 訪問驗證(POP before SMTP)就是一種更加安全的方法,但在應用的時候要考慮到當前支援這種認證方式的郵件客戶端程式還不多。

逆向 DNS 解析

無論哪一種認證,其目的都是避免郵件傳送代理伺服器被垃圾郵件傳送者所利用,但對於傳送到本地的垃圾郵件仍然無可奈何。要解決這個問題,最 簡單有效的方法是對傳送者的 IP 地址進行逆向名字解析。通過 DNS 查詢來判斷髮送者的 IP 與其聲稱的名字是否一致,例如,其聲稱的名字為 mx.hotmail.com,而其連線地址為 20.200.200.200,與其 DNS 記錄不符,則予以拒收。這種方法可以有效過濾掉來自動態 IP 的垃圾郵件,對於某些使用動態域名的傳送者,也可以根據實際情況進行遮蔽。但是上面這種方法對於藉助 Open Relay 的垃圾郵件依然無效。對此,更進一步的技術是假設合法的使用者只使用本域具有合法網際網路名稱的郵件傳送代理伺服器傳送電子郵件。例如,若發件人的郵件地址為 [email protected],則其使用的郵件傳送代理伺服器的 Internet 名字應具有 yahoo.com 的字尾。這種限制並不符合 SMTP 協議,但在多數情況下是切實有效的。需要指出的是,逆向名字解析要進行大量的 DNS 查詢。

實時黑名單過濾

以上介紹的防範措施對使用自身合法域名的垃圾郵件仍然無效。對此比較有效的方法就是使用黑名單服務了。黑名單服務是基於使用者投訴和取樣積累 而建立的、由域名或 IP 組成的資料庫,最著名的是 RBL、DCC 和 Razor 等,這些資料庫儲存了頻繁傳送垃圾郵件的主機名字或 IP 地址,供 MTA 進行實時查詢以決定是否拒收相應的郵件。但是,目前各種黑名單資料庫難以保證其正確性和及時性。例如,北美的 RBL 和 DCC 包含了我國大量的主機名字和 IP 地址,其中有些是早期的 Open Relay 造成的,有些則是由於誤報造成的。但這些問題遲遲得不到糾正,在一定程度上阻礙了我國與北美地區的郵件聯絡,也妨礙了我國的使用者使用這些黑名單服務。

白名單過濾

白名單過濾是相對於上述的黑名單過濾來說的。其建立的資料庫的內容和黑名單的一樣,但其性質是:庫中存在的都是合法的,不應該被阻斷。同 樣,該過濾方法存在的缺點與黑名單類似,也是更新和維護難以達到實時,一些正常的、不為系統白名單所收集的郵件有可能被阻斷。從應用的角度來說,在小範圍 內使用白名單是比較成功的。

內容過濾

即使使用了前面諸多環節中的技術,仍然會有相當一部分垃圾郵件漏網。對此情況,目前最有效的方法是基於郵件標題或正文的內容過濾。其中比較 簡單的方法是,結合內容掃描引擎,根據垃圾郵件的常用標題語、垃圾郵件受益者的姓名、電話號碼、Web 地址等資訊進行過濾。更加複雜但同時更具智慧性的方法是,基於貝葉斯(Bayes)概率理論的統計方法所進行的內容過濾,該演算法最早由 Paul Graham 提出(http://www.paulgraham.com/spam.html),並使用他自己設計的 Arc 語言實現。這種方法的理論基礎是通過對大量垃圾郵件中常見關鍵詞進行分析後得出其分佈的統計模型,並由此推算目標郵件是垃圾郵件的可能性。這種方法具有一 定的自適應、自學習能力,目前已經得到了廣泛的應用。最有名的垃圾郵件內容過濾是 SpamAssassin(將在後面詳細介紹),其使用 Perl 語言實現,集成了以上兩種過濾方法,可以與當前各種主流的 MTA 整合使用。內容過濾是以上所有各種方法中耗費計算資源最多的,在郵件流量較大的場合,需要配合高效能伺服器使用。另外,當前也有很多學者將人工神經網路、 支援向量機、Winnow 演算法等及其學習的方法引入到內容過濾垃圾郵件的研究中來,並且取得了很好的效果。

配置 Sendmail 防範垃圾郵件

Sendmail 是 Red Hat Linux 以及大多數類 UNIX 作業系統的郵件傳送代理,因此它是目前配置最廣泛的郵件伺服器。下面以 Red Hat Enterprise Linux 6 使用的 Sendmail 為例,介紹應對垃圾郵件的幾種具體方法。其他開源郵件伺服器防範垃圾郵件的配置,也可以參考本節的介紹進行配置。

關閉 Sendmail 的 Relay 功能

所謂 Relay 就是指別人能使用提供該功能的 SMTP 郵件伺服器給任何人發信,這樣別有用心的垃圾傳送者就可以使用這臺郵件伺服器大量傳送垃圾郵件,而最後別人投訴的不是垃圾傳送者,而是這臺伺服器,因此必 須關閉 Relay 這項功能。其方法就是,到 Linux 伺服器的 /etc/mail 目錄編輯 access 檔案,去掉“*relay”之類的設定,只留“localhost relay”和“127.0.0.1 relay”兩條即可。最後特別注意,修改 access 檔案後還要使用命令使修改生效:

#makemap hash access.db < access

在 Sendmail 中新增 RBL 功能

RBL(Realtime Blackhole List)是實時黑名單。國外有一些機構提供 RBL 服務,常用的 RBL 伺服器地址有 relays.ordb.org、dnsbl.njabl.org、bl.spamcop.net、sbl.spamhaus.org、 dun.dnsrbl. net 和 dnsbl.sorbs.net。查詢和刪除 RBL 中的 IP 地址可以到 http://openrbl.org/ 和 http://ordb.org。RBL 將收集到的專發垃圾郵件的 IP 地址加入他們的黑名單,只要在 Sendmail 中加入 RBL 認證功能,就會使郵件伺服器在每次收信時都自動到 RBL 伺服器上去查實,如果信件來源於黑名單,則 Sendmail 會拒收郵件,從而使使用者少受垃圾郵件之苦。在 Sendmail 中新增 RBL 認證,需要對 sendmail.mc 新增以下內容:

FEATURE(`dnsbl',`relays.ordb.org',` ″ Email blocked using ORDB.org - see ″')

最後執行“m4 sendmail.mc>sendmail.cf”和“service sendmail restart”兩條命令,使有關 Sendmail 的修改生效。

伺服器使用 SpamAssasin 防治垃圾郵件

SpamAssasin 是一個郵件過濾器,它部署在郵件伺服器端,可以使用一系列的機制來確認垃圾郵件,這些機制包括:文字分析、Bayesian (貝葉斯判決規則)過濾、DNS 資料塊列表,以及合作性的過濾資料庫。SpamAssasin 並不能刪除垃圾郵件,但它卻可以阻止垃圾郵件。究其原因,主要在於它有如下一些特性:

  • 適用範圍廣:SpamAssasin 使用大量的本地和網路的測試來確認垃圾郵件特徵。這使得垃圾郵件製造者在明確其製造的資訊的可工作性時增加了難度。
  • 自由軟體,應用廣泛:與其它流行的開源軟體一樣,愛好者可以廣泛的應用和修改、釋出,應用前景很好。
  • 易於擴充套件:SpamAssasin 將反垃圾測試和配置資訊儲存在純文字中,這使得配置和增加新的規則相當容易。
  • 靈活性:SpamAssasin 將其邏輯封裝在一個設計精良的、抽象化的 API 中,因此它可被整合到電子郵件資料流中的任何地方。SpamAssasin 可被用於多種電子郵件系統中,其中包括:Procmail、Sendmail、Postfix、Qmail 等。
  • 易於配置:SpamAssasin 幾乎不需要使用者的配置。使用者不必用郵件帳戶或郵件列表的成員資格詳細資訊來不斷地更新 SpamAssasin 配置。一旦分類,站點和使用者規則就可以被運用於垃圾郵件。而且規則可以適用於郵件伺服器,並且在以後又可以使用使用者自己的郵件使用者代理應用程式。

SpamAssasin 包括 spamd 守護程序和 spamc 客戶端。雖然它包括 SpamAssasin 實用工具,但 SpamAssasin 文件建議使用 spamc 而非 SpamAssasin 來過濾郵件,因為 spamc 比 SpamAssasin 載入得更快。當 SpamAssasin 單獨工作時,spamc 呼叫 spamd。spamd 守護程序派生子程序 ; 當 spamd 執行時,ps 除了顯示 spamd 父程序外還顯示幾個 spamd 子程序:

# ps -ef | grep spam 
 root 4254 1 0 14:17 ? 00:00:02 /usr/bin/spamd -d -c -m5 -H -r ... 
 root 4256 4254 0 14:17 ? 00:00:00 spamd child 
 root 4257 4254 0 14:17 ? 00:00:00 spamd child 
 root 4689 4662 0 16:48 pts/1 00:00:00 grep --color=auto spam

spamc 實用工具是一個過濾器:它從標準輸入讀取每個電子郵件,傳送電子郵件到 spamd 進行處理,並把修改後的電子郵件寫入到標準輸出。spamd 守護程序使用多種技術來識別垃圾郵件:

  • Headeranalysis(標題分析):檢查疑似垃圾郵件的標題,有些垃圾郵件被人採用某種技巧處理後,可能會被誤認為是合法的電子郵件。
  • Text analysis(文字分析):檢查電子郵件正文中的垃圾郵件特徵。
  • Blacklists(黑名單):檢查名單,看看發件人是否在現有垃圾郵件傳送者列表中。
  • Database(資料庫):檢查針對 Vipul ’ s Razor(razor.sourceforge.net)的郵件簽名,它是一個垃圾郵件跟蹤資料庫。

可以設定郵件伺服器上的 SpamAssassin,以使它處理傳遞到本地系統的所有電子郵件,然後再發送到使用者。另外,每個使用者可以從他們的郵件客戶端執行 SpamAssassin。無論哪種方式,本地系統必須執行 spamd,並且必須通過這個守護程序使用 spamc 過濾每封電子郵件。

安裝 SpamAssasin

可以在網站上 http://spamassassin.apache.org/downloads.cgi 下載 SpamAssasin 的最新版本進行安裝,目前其最新版本為 3.3.2,具體的安裝步驟如下所示:

(1)解壓縮軟體包

#tar xzvf Mail-SpamAssassin-3.3.2.tar.gz

(2)進入目錄進行安裝

#./configure 
 #make & make install

配置與啟動 SpamAssasin

就像大多數 Linux 應用程式一樣,SpamAssasin 需要對配置檔案的編輯。這個配置檔案的路徑是:/etc/mail/spamassassin/local.cf。

SpamAssassin 在許多位置可查詢配置檔案,詳細資訊請參閱 SpamAssassin 手冊。最容易使用的配置檔案是 /etc/mail/spamassassin/local.cf,可以編輯這個檔案來全域性配置 SpamAssassin。使用者可以覆蓋這些全域性選項並在 ~/.spamassassin/user_prefs 檔案中新增自己的選項。可以把本節討論的選項放在這些檔案中的任何一個。

例如,可以配置 SpamAssassin 來重寫評級為垃圾郵件的郵件主題行。配置檔案中的 rewrite_header 關鍵字可控制這種行為。跟隨這個關鍵字的 Subject 字告訴 SpamAssassin 重寫主題行。從以下行刪除 # 就可以啟用這種行為:

# rewrite_header Subject *****SPAM*****

required_score 關鍵字指定:SpamAssassin 認為它是垃圾郵件之前一封電子郵件必須獲得的最低得分。預設值是 5.00。設定此關鍵字到一個更高的數值,就能使 SpamAssassin 把較少的電子郵件標記為垃圾郵件。

required_score 5.00

有時標記為垃圾郵件地址的郵件並不是垃圾郵件,或者來自該地址的郵件並不應該標記為垃圾郵件。使用 whitelist_from 關鍵字可指定不應該被視為垃圾郵件的地址,blacklist_from 用於指定應始終標記為垃圾郵件的地址:

whitelist_from [email protected] 
blacklist_from *@spammer.net

可以在 whitelist_from 和 blacklist_from 行上指定多個地址,並用空格隔開。每個地址可以包含萬用字元。使用 whitelist_from *@example.com 將從 example.com 域傳送電子郵件的每個人列入白名單。可以使用多個 whitelist_from 和 blacklist_from 行。

下面給出了一個配置該檔案的示例:

# How many hits before a message is considered spam. 
 required_score 7.5 
 # Change the subject of suspected spam 
 rewrite_header subject [SPAM] 
 # Encapsulate spam in an attachment (0=no, 1=yes, 2=safe) 
 report_safe 1 
 # Enable the Bayes system 
 use_bayes 1 
 # Enable Bayes auto-learning 
 bayes_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. 
 ok_languages all 
 # Mail using locales used in these country codes will not be marked 
 # as being possibly spam in a foreign language. 
 ok_locales all

其中,主要包括如下幾個重點項需要進行設定:

  • required_score(評價閾值):設定該閾值通常情況下需要根據管理員的長期經驗。閾值越低,就會有更少的郵件通過,因而將正常郵件誤報為垃圾郵件的概率越高;閾值越高,則有可能將更多的垃圾郵件漏報為正常郵件,通常的預設值為 5。
  • Rewrite header Subjects(重寫訊息主題):通過這個選項,使用者可以配置 SpamAssassin 用你選擇的任何物件來編輯電子郵件的主題行。預設值設定為:[SPAM]。
  • bayes_auto_learn(使用自動學習):SpamAssassin 可以通過分析具有一定評價的訊息,去自動化地整理其 Bayes(貝葉斯)資料庫,這個評價強烈地顯示了訊息是垃圾還是非垃圾訊息。
  • Enable or disable network checks(使用網路檢查和檢驗):選擇是否使用將訊息檢查和(Checksum)與已知的垃圾郵件相比較的服務:這些服務有:Vipul's Razor 2.x、 DCC、 Pyzor 等,不過只有當每種服務的客戶端軟體安裝時這些服務才能正常工作。( 即通過 use_razor2, use_dcc, use_pyzor 進行 )。另外,該選項中還包括了 Enable RBL Checks(啟用 RBL 檢查),即選擇 SpamAssassin 是否應使用 RBLS(DNS 黑名單)。這有助於檢測難於檢測的垃圾資訊,但需要消耗一些時間、網路頻寬以及一個可用的 DNS 伺服器。
  • Languages(語言):最後兩種配置是關於語言的,第一個是哪些語言應檢查,預設選項是檢查所有的語言,建議不要修改。

在成功配置好 SpamAssassin 後,需要啟動 SpamAssassin 應用程式。要想執行 SpamAssassin,必須以根使用者身份執行如下的命令:

#/etc/rc.d/init.d/spamassassin start

配置與 sendmail 協同工作

現在 SpamAssassin 已經啟動並正常執行,現在需要設定它與郵件傳輸代理(Mail Delivery Agent)一起工作。本節介紹它與 Sendmail 協同工作的設定,因為 Sendmail 是在 Linux 環境中應用最廣泛的郵件傳輸代理。

使用者需要編輯 /etc/mail/spamassassin/spamc.cf 檔案,並增加如下內容:

:0fw 
 /usr/bin/spamc

現在 Sendmail 被設定為使用 SpamAssassin 來評價和過濾進入的垃圾郵件。

執行 SpamAssasin

隨著 spamd 的執行,向 spamc 傳送一個字串可以檢視其工作原理:

$ echo "hi there" | spamc 
 X-Spam-Checker-Version: SpamAssassin 3.3.2-r929478 (2010-03-31) on sobell.com 
 X-Spam-Flag: YES 
 X-Spam-Level: ****** 
 X-Spam-Status: Yes, score=6.9 required=5.0 tests=EMPTY_MESSAGE,MISSING_DATE, 
 MISSING_HEADERS,MISSING_MID,MISSING_SUBJECT,NO_HEADERS_MESSAGE,NO_RECEIVED, 
 NO_RELAYS autolearn=no version=3.3.2-r929478 
 X-Spam-Report: 
 * -0.0 NO_RELAYS Informational: message was not relayed via SMTP 
 * 1.2 MISSING_HEADERS Missing To: header 
 * 0.1 MISSING_MID Missing Message-Id: header 
 * 1.8 MISSING_SUBJECT Missing Subject: header 
 * 2.3 EMPTY_MESSAGE Message appears to have no textual parts and no 
 * Subject: text 
 * -0.0 NO_RECEIVED Informational: message has no Received headers 
 * 1.4 MISSING_DATE Missing Date: header 
 * 0.0 NO_HEADERS_MESSAGE Message appears to be missing most RFC-822 
 * headers 
 hi there 
 Subject: [SPAM] 
 X-Spam-Prev-Subject: (nonexistent)

它首先會顯示 Yes,即認定該郵件是垃圾郵件。SpamAssassin 使用評級系統,給一封電子郵件分配一個匹配命中數。如果該電子郵件收到的命中數超過所需的數量(預設為 5.0),SpamAssassin 則把它標記為垃圾郵件。字串失敗的原因是多方面的,都會在此狀態行上列舉。

以下列表是由 SpamAssassin 處理的一封真實垃圾郵件。它收到了 24.5 個命中,這幾乎肯定是垃圾郵件。

X-Spam-Status: Yes, hits=24.5 required=5.0 
 tests=DATE_IN_FUTURE_06_12,INVALID_DATE_TZ_ABSURD, 
 MSGID_OE_SPAM_4ZERO,MSGID_OUTLOOK_TIME, 
 MSGID_SPAMSIGN_ZEROES,RCVD_IN_DSBL,RCVD_IN_NJABL, 
 RCVD_IN_UNCONFIRMED_DSBL,REMOVE_PAGE,VACATION_SCAM, 
 X_NJABL_OPEN_PROXY 
 version=2.55 

 X-Spam-Level: ************************ 
 X-Spam-Checker-Version: SpamAssassin 2.55 (1.174.2.19-2003-05-19-exp) 
 X-Spam-Report: This mail is probably spam. The original message has been attached 
 along with this report, so you can recognize or block similar unwanted 
 mail in future. See http://spamassassin.org/tag/ for more details. 
 Content preview: Paradise SEX Island Awaits! Tropical 1 week vacations 
 where anything goes! We have lots of WOMEN, SEX, ALCOHOL, ETC! Every 
 man's dream awaits on this island of pleasure. [...] 
 Content analysis details: (24.50 points, 5 required) 
 MSGID_SPAMSIGN_ZEROES (4.3 points) Message-Id generated by spam tool (zeroes variant) 
 INVALID_DATE_TZ_ABSURD (4.3 points) Invalid Date: header (timezone does not exist) 
 MSGID_OE_SPAM_4ZERO (3.5 points) Message-Id generated by spam tool (4-zeroes variant) 
 VACATION_SCAM (1.9 points) BODY: Vacation Offers 
 REMOVE_PAGE (0.3 points) URI: URL of page called "remove"
 MSGID_OUTLOOK_TIME (4.4 points) Message-Id is fake (in Outlook Express format) 
 DATE_IN_FUTURE_06_12 (1.3 points) Date: is 6 to 12 hours after Received: date 
 RCVD_IN_NJABL (0.9 points) RBL: Received via a relay in dnsbl.njabl.org 
 [RBL check: found 94.99.190.200.dnsbl.njabl.org.] 
 RCVD_IN_UNCONFIRMED_DSBL (0.5 points) RBL: Received via a relay in unconfirmed.dsbl.org 
 [RBL check: found 94.99.190.200.unconfirmed.dsbl.org.] 
 X_NJABL_OPEN_PROXY (0.5 points) RBL: NJABL: sender is proxy/relay/formmail/spam-source 
 RCVD_IN_DSBL (2.6 points) RBL: Received via a relay in list.dsbl.org 
 [RBL check: found 211.157.63.200.list.dsbl.org.] 
 X-Spam-Flag: YES 
 Subject: [SPAM] re: statement

垃圾郵件黑名單

通常情況下,垃圾郵件傳送者都會藉助某些域和使用者會發送垃圾資訊。幸運的是,SpamAssassin 有一個對付已知垃圾郵件製造者的手段。設定黑名單是很簡單的事情。使用者可以向配置檔案 etc/mail/spamassain/local.cf 新增黑名單。黑名單的書寫方式如下所示:

blacklist_from [email protected] 
blacklist_from *@sampledomain.com 
blacklist_from *@sampledomain.com 
blacklist_from *@sampledomain.com

上面的內容相當明顯地向讀者展示瞭如何配置黑名單。使用者既可以配置具體的電子郵件地址(如 [email protected]),也可以配置整個域(如 *@sampledomain.com)。另外,為了使用最新的網路上共享的垃圾郵件過濾資訊,還可以從 http://www.sa-blacklist.stearns.org/sa-blacklist/sa-blacklist.current下載最新的黑名單。不過,這個列表相當龐大,且有可能不會非常適合使用者的需要,因此在下載此列表並新增到使用者的黑名單時還需要進行細緻的過濾和篩選。

總結

本文詳細介紹了 Postfix 的安全防護實戰,以及如何進行企業垃圾郵件防範。至此為止,本系列的 2 篇文章從介紹企業電子郵件面臨的安全威脅、原理出發,通過大量的配置和實戰示例,詳細講述了企業如何對 3 種主流的開源電子郵件系統進行安全加固和配置,以及如何應用 SpamAssassin 進行垃圾郵件防範和治理,希望廣大讀者能從中受益,並應用到日常的資訊保安工作和系統管理工作中。