企業(yè)開源電子郵件系統(tǒng)安全保障實(shí)戰(zhàn)
企業(yè)開源電子郵件系統(tǒng)簡(jiǎn)介
企業(yè)開源電子郵件系統(tǒng)模型基本可分為郵件傳遞代理 MTA、郵件存儲(chǔ)和獲取代理 MSA 以及郵件客戶代理 MUA 三大模塊,下面就郵件系統(tǒng)的組成作介紹。
郵件傳遞代理(MTA)
企業(yè) Linux 開源系統(tǒng)下的郵件傳遞代理(Mail Transfer Agent)通常使用 Sendmail,該系統(tǒng)幾乎在任何 UNIX 平臺(tái)上都有相應(yīng)的版本。另外,還有 D.J. Bernstein 的 Qmail 以及 Wietse Venema 的 Postfix 系統(tǒng)。它們負(fù)責(zé)接收并轉(zhuǎn)遞郵件。這雖然看起來很簡(jiǎn)單,實(shí)際上設(shè)置可能相當(dāng)復(fù)雜。在郵件策略管理時(shí)需要設(shè)置一系列的路由和偽裝選項(xiàng),而許多功能是由語言編程實(shí)現(xiàn)的,用以過濾或者修改中繼消息的頭信息。此外郵件路由和尋址郵件存儲(chǔ)信箱的過程包含了復(fù)雜的與各種目錄服務(wù)交互操作,這些目錄服務(wù)可能包括 DNS、密碼文件、NIS、LDAP 別名 / 數(shù)據(jù)庫(kù)管理文件,以及各種的通用數(shù)據(jù)庫(kù)系統(tǒng)。
如今的 MTA 還要實(shí)現(xiàn)反垃圾郵件功能,控制郵件頭的 to 和 from 地址格式,達(dá)到允許或者限制特定域名或者地址范圍目的,以上主要是通過修改存取控制表和規(guī)則實(shí)現(xiàn)的。這一過程通常包括查詢數(shù)據(jù)表或者目錄服務(wù),例如 Paul Vixie 的實(shí)時(shí)黑洞列表程序 RBL,郵件濫用預(yù)防系統(tǒng) MAPS,以及同類的 Dorkslayer/ORBS 系統(tǒng)。MTA 一直在不斷增強(qiáng)之中,以實(shí)現(xiàn)加強(qiáng)的策略控制以及反病毒和反蠕蟲等功能。
在大多數(shù)情況下,安裝和設(shè)置 MTA 系統(tǒng)比較容易,不過強(qiáng)大功能的實(shí)現(xiàn)是以高度復(fù)雜性為代價(jià)的。如果用戶所在的機(jī)構(gòu)選擇定制的 MTA 來滿足特定的路由、體系、安全性和反垃圾郵件等要求,就需要更加復(fù)雜的設(shè)置選項(xiàng),配置包括設(shè)計(jì)并處理 MTA 和各種子系統(tǒng)如 LDAP、DNS 服務(wù)器之間的復(fù)雜關(guān)系。
眾多的 MTA 軟件中,最為有影響的應(yīng)該是 Sendmail、Qmail 和 Postfix。Sendmail 是最古老的 MTA 之一,也擁有一批固定的使用者;Qmail 是新生一代的 MTA 代表,其特點(diǎn)是速度快、體積小,并且容易配置安裝。Postfix 起源于 1996 年,它采用模塊化設(shè)計(jì),使用了大量?jī)?yōu)秀的技術(shù),以達(dá)到安全高效的目的。Postfix 發(fā)展到現(xiàn)在已經(jīng)成為功能非常豐富、擴(kuò)展性和安全性非常強(qiáng)的優(yōu)秀 MTA 軟件。
首先談?wù)?Sendmail。MTA 軟件的很多先進(jìn)功能都是在 Sendmail 上最先實(shí)現(xiàn)的。但 Sendmail 也有典型的歷史問題,主要是整個(gè)程序的沒有實(shí)現(xiàn)良好的模塊化,運(yùn)行時(shí)需要 SID 權(quán)限,以及配置文件復(fù)雜難懂。這些是阻礙 Sendmail 更好普及應(yīng)用的一些客觀問題。
接著是 Qmail。Qmail 是新生一代的 MTA 代表,實(shí)現(xiàn)了模塊化設(shè)計(jì),避免了 SID 問題,基本功能齊全,配置較 Sendmail 簡(jiǎn)單,而且用戶也很廣泛。但 Qmail 最近幾年的開發(fā)工作基本停止,補(bǔ)丁程序也相對(duì)零亂,這些都是長(zhǎng)期使用 Qmail 的用戶或者郵件服務(wù)提供商不得不認(rèn)真考慮的問題。另外,Qmail 的擴(kuò)展性并不是很好,經(jīng)常需要補(bǔ)丁來完成功能的擴(kuò)展。
最后介紹 Postfix。Postfix 是新生一代的 MTA 代表,它以速度快、體積小、易配置安裝等特性而著稱。Postfix 在設(shè)計(jì)上可以說是最為優(yōu)美的,其實(shí)現(xiàn)了良好的模塊化,郵件的處理流程是通過調(diào)用各個(gè)功能模塊來完成,在效率、功能、可用性、擴(kuò)展及安全等方面都考慮得比較充分。Postfix 以替代 Sendmail 為目的,并提供了一個(gè)更安全、更高性能的靈活的體系。它同樣也采用模塊化設(shè)計(jì),使用了大量?jī)?yōu)秀的技術(shù),以達(dá)到安全的目的。由于作者的設(shè)計(jì)理念獨(dú)到,經(jīng)過 7、8 年時(shí)間,Postfix 現(xiàn)今已發(fā)展成為功能非常豐富,擴(kuò)展性和安全性強(qiáng)的優(yōu)秀 MTA。
郵件存儲(chǔ)和獲取代理(MSA)
一旦安裝并設(shè)置完成了 MTA,還要對(duì) MSA 系統(tǒng)進(jìn)行同樣的配置過程。如今大多數(shù)機(jī)構(gòu)并不直接將郵件傳送到桌面客戶系統(tǒng),而是將郵件存儲(chǔ)到服務(wù)器,讓用戶通過 POP 或者 IMAP 來讀取各自的郵件。
郵件存儲(chǔ)的管理有許多種協(xié)議,但如今最常用的是 POP3 和 IMAP4。對(duì)于 MTA 來說,由一些程序,或者稱之為 Daemon(守護(hù)進(jìn)程)來實(shí)現(xiàn)相應(yīng)協(xié)議的服務(wù)。大多數(shù) MSA(Mail Submission Agent)可以與通用的 MTA 交互,此外這些系統(tǒng)還包含加鎖或者其他安全機(jī)制,使得多個(gè) MSA 可以并行工作而不發(fā)生沖突。
這意味著一些用戶可以通過 POP 協(xié)議獲取郵件、同時(shí)其余一些用戶可以使用 IMAP 協(xié)議,而另外一些用戶可以登錄系統(tǒng),使用本地郵件客戶代理例如 Pine、Mutt 或者 Elm 處理郵件。單獨(dú)用戶也可以從一種存取協(xié)議切換到另一種,而并不需要系統(tǒng)管理員的干預(yù)。在一個(gè)已經(jīng)安裝了 Linux 系統(tǒng)機(jī)器上設(shè)置 POP 服務(wù)相當(dāng)容易,甚至不需要什么操作。通常 POP Daemon 在最初的 Linux 操作系統(tǒng)安裝時(shí)已經(jīng)設(shè)立,IMAP 也是如此。POP 將郵件轉(zhuǎn)遞到客戶端并從服務(wù)器上移除,而 IMAP 允許用戶將郵件存貯在服務(wù)器端的文件夾中,而客戶端的拷貝是緩存或者工作副本,這樣做需要更多的服務(wù)器存儲(chǔ)空間,卻可以讓 IT 部門集中在服務(wù)器端進(jìn)行備份和恢復(fù),并讓客戶端保持相當(dāng)?shù)撵`活性和安全性。IMAP 也可以設(shè)置成像 POP 那樣在客戶端讀取后就刪除服務(wù)器端的郵件,從操作上講,兩者并沒有什么不同。
郵件客戶代理(MUA)
郵件客戶代理 MUA(Mail User Agent)種類繁多,而且層出不窮。這些代理大都符合 POP 和 IMAP 協(xié)議。這也包括微軟的 Outlook 系列、Foxmail 等。在 Linux 下,許多人使用 Fetchmail 抓取郵件并保存在本地郵箱。然后使用任何一種郵件客戶代理 MUA,比如 Elm、Pine、Mutt、MH/exmh、EMACS 的 Rmail,Vmail、Mh-e、Gnus 以及大量的帶有 GUI 界面的如 Balsa、Mahogany 等來處理郵件。也有眾多 Linux 用戶選擇使用 Netscape Communicator 內(nèi)置的郵件客戶端。
電子郵件傳輸協(xié)議原理
SMTP(Simple Mail Transfer Protocol)協(xié)議是為了保證電子郵件的可靠和高效傳送。TCP/IP 協(xié)議的應(yīng)用層中包含有 SMTP 協(xié)議,但事實(shí)上其與傳輸系統(tǒng)和機(jī)制無關(guān),僅要求一個(gè)可靠的數(shù)據(jù)流通道。該協(xié)議可以工作在 TCP 上,也可以工作在 NCP、NITS 等協(xié)議上。在 TCP 上,其使用端口 25 進(jìn)行傳輸。SMTP 的一個(gè)重要特點(diǎn)是可以在可交互的通信系統(tǒng)中轉(zhuǎn)發(fā)郵件。
SMTP 提供了一種郵件傳輸?shù)臋C(jī)制,當(dāng)接收方和發(fā)送方都在一個(gè)網(wǎng)絡(luò)上時(shí),可以把郵件直傳給對(duì)方;當(dāng)雙方不在同一個(gè)網(wǎng)絡(luò)上時(shí),需要通過一個(gè)或幾個(gè)中間服務(wù)器轉(zhuǎn)發(fā)。SMTP 首先由發(fā)送方提出申請(qǐng),要求與接收方 SMTP 建立雙向的通信渠道,接收方可以是最終收件人也可以是中間轉(zhuǎn)發(fā)的服務(wù)器。接收方服務(wù)器確認(rèn)可以建立連接后,雙發(fā)就可以開始通信。
發(fā)送方 SMTP 向接收方發(fā)出 MAIL 命令,告知發(fā)送方的身份;如果接收方接受,就會(huì)回答 OK。發(fā)送方再發(fā)出 RCPT 命令,告知收件人的身份,接收方 SMTP 確認(rèn)是否接收或轉(zhuǎn)發(fā),如果同意就回答 OK;接下來就可以進(jìn)行數(shù)據(jù)傳輸了。通信過程中,發(fā)送方 SMTP 與接收方 SMTP 采用對(duì)話式的交互方式,發(fā)送方提出要求,接收方進(jìn)行確認(rèn),確認(rèn)后才進(jìn)行下一步的動(dòng)作。整個(gè)過程由發(fā)送方控制,有時(shí)需要確認(rèn)幾次才可以(如圖 1 所示)。
圖 1. SMTP 協(xié)議工作流程
為了保證回復(fù)命令的有效,SMTP 要求發(fā)送方必須提供接收方的服務(wù)器及郵箱。郵件的命令和答復(fù)有嚴(yán)格的語法定義,并且回復(fù)具有相應(yīng)的數(shù)字代碼。所有的命令由 ASCII 碼組成。命令代碼是大小寫無關(guān)的,如 MAIL 和 mail、mAIL 都是等效的。
目前使用的 SMTP 協(xié)議是存儲(chǔ)轉(zhuǎn)發(fā)協(xié)議,意味著其允許郵件通過一系列的服務(wù)器發(fā)送到最終目的地。服務(wù)器在一個(gè)隊(duì)列中存儲(chǔ)到達(dá)的郵件,等待發(fā)送到下一個(gè)目的地。下一個(gè)目的地可以是本地用戶,或者是另一個(gè)郵件服務(wù)器,如圖 2 所示。如果下游的服務(wù)器暫時(shí)不可用,MTA 就暫時(shí)在隊(duì)列中保存信件,并在以后嘗試發(fā)送。
圖 2. SMTP 存儲(chǔ) - 轉(zhuǎn)發(fā)工作流程
SMTP 定義了 15 個(gè)命令,分別是:HELO、MAIL FROM、RCPT TO、DATA、RSET、SEND FROM、SOML FROM、SAML FROM、VRFY、EXPN、HELP、NOOP、QUIT、TURN。其中 SMTP 工作的基本的命令有 7 個(gè):HELO、MAIL FROM、RCPT TO、DATA、REST、NOOP 和 QUIT。
下面分別對(duì)這些命令進(jìn)行介紹。
HELO:發(fā)送方問候接收方,后面是發(fā)件人的服務(wù)器地址或標(biāo)識(shí)。接收方回答 OK 時(shí)標(biāo)識(shí)自己的身份。問候和確認(rèn)過程表明兩臺(tái)機(jī)器可以進(jìn)行通信,同時(shí)狀態(tài)參量被復(fù)位,緩沖區(qū)被清空。
MAIL FROM:這個(gè)命令用來開始傳送郵件,其后面跟隨發(fā)送方郵件地址(返回郵件地址)。也用來當(dāng)郵件無法送達(dá)時(shí),發(fā)送失敗通知。為保證郵件的成功發(fā)送,發(fā)送方的地址應(yīng)是被對(duì)方或中間轉(zhuǎn)發(fā)方同意接受的。這個(gè)命令會(huì)清空有關(guān)的緩沖區(qū),為新的郵件做準(zhǔn)備。
RCPT TO:這個(gè)命令告訴接收方收件人的郵箱。當(dāng)有多個(gè)收件人時(shí),需要多次使用該命令,每次只能指明一個(gè)人。如果接收方服務(wù)器不同意轉(zhuǎn)發(fā)這個(gè)地址的郵件,其必須報(bào) 550 錯(cuò)誤代碼通知發(fā)送方。如果服務(wù)器同意轉(zhuǎn)發(fā),其要更改郵件發(fā)送路徑,把最開始的目的地(該服務(wù)器)換成下一個(gè)服務(wù)器。
DATA:接收方把該命令之后的數(shù)據(jù)作為發(fā)送的數(shù)據(jù)。數(shù)據(jù)被加入數(shù)據(jù)緩沖區(qū)中,以單獨(dú)一行是“.”的行結(jié)束數(shù)據(jù)。結(jié)束行對(duì)于接收方同時(shí)意味立即開始緩沖區(qū)內(nèi)的數(shù)據(jù)傳送,傳送結(jié)束后清空緩沖區(qū)。如果傳送接受,接收方回復(fù) OK。
REST:這個(gè)命令用來通知接收方復(fù)位,所有已存入緩沖區(qū)的收件人數(shù)據(jù),發(fā)件人數(shù)據(jù)和待傳送的數(shù)據(jù)都必須清除,接收方必須回答 OK。
NOOP:這個(gè)命令不影響任何參數(shù),只是要求接收放回答 OK,不會(huì)影響緩沖區(qū)的數(shù)據(jù)。
QUIT:SMTP 要求接收方必須回答 OK,然后中斷傳輸;在收到這個(gè)命令并回答 OK 前,接收方不得中斷連接,即使傳輸出現(xiàn)錯(cuò)誤。發(fā)送方在發(fā)出這個(gè)命令并收到 OK 答復(fù)前,也不得中斷連接。
VERY:用于確認(rèn)接收用戶。
SEND:使接收主機(jī)知道消息必須送到另一個(gè)終端,當(dāng)前傳輸被取消。
HELP:查詢服務(wù)器支持的命令集合。
EXPN:驗(yàn)證給定的郵箱列表是否存在,并擴(kuò)充郵箱列表。
TURN:請(qǐng)求接收主機(jī)向發(fā)送主機(jī)返回消息。
SAML:發(fā)送并郵寄。通知接收主機(jī)消息必須發(fā)送到其他終端和郵箱。#p#
企業(yè)開源電子郵件系統(tǒng)面臨的安全威脅
一般說來,電子郵件系統(tǒng)面臨如下三種安全威脅:
電子郵件系統(tǒng)自身的安全問題:電子郵件系統(tǒng)自身作為一個(gè)網(wǎng)絡(luò)服務(wù)器,存在著配置和誤操作上的安全威脅和隱患,如沒有合理配置服務(wù)器的相關(guān)配置文件中的重要選項(xiàng)等,極有可能造成潛在的安全隱患。另外,電子郵件系統(tǒng)版本的及時(shí)更新與否也影響到其安全;
垃圾郵件問題:垃圾郵件問題是當(dāng)今最讓網(wǎng)絡(luò)用戶頭疼的頑疾之一。許多不請(qǐng)自來的垃圾郵件不但占據(jù)網(wǎng)絡(luò)帶寬,也極大地消耗了郵件服務(wù)器的存儲(chǔ)資源,給用戶帶來非常大的不便。如何應(yīng)對(duì)該問題,是電子郵件系統(tǒng)面臨的最大的挑戰(zhàn);
開放性中繼的安全問題:正如本文前面部分所談到的 open relay 的原理,如果設(shè)置不合理,將直接引起電子郵件系統(tǒng)的濫用,甚至?xí)蔀槔]件的溫床,它可以說是電子郵件系統(tǒng)中的“定時(shí)炸彈”。
實(shí)戰(zhàn)安全配置 Sendmail 電子郵件服務(wù)器
sendmail.cf 是 Sendmail 的配置文件。一般來說在安裝了 Linux 系統(tǒng)之后,將自動(dòng)生成一個(gè)適合本系統(tǒng)使用的 sendmail.cf 文件,而且在 sendmail.8.9.3/cf 目錄下還有許多適應(yīng)各種系統(tǒng)的 sendmail.cf 的文件樣本,根據(jù)文件名也可以判斷出它們所適用的場(chǎng)合。可以選擇它們替換原有的 sendmail.cf 文件,也就是說,將它們復(fù)制到 /etc 目錄中去,覆蓋掉原來的 sendmail.cf 文件。而且 Sendmail 還提供了一個(gè) sendmail.cf 的生成器 m4,其通過一系列的人機(jī)對(duì)話來生成一個(gè)用戶定制的 sendmail.cf 文件。具體的用法可以閱讀 m4 的幫助文檔,在此就不再詳述。
配置文件 sendmail.cf 中的信息仍舊是以行為單位。如果行首的第一個(gè)字符為“#”,則表示該行為注釋,如果第一個(gè)字符為空格則表示該行為上一行的延續(xù)。此外,行首的第一個(gè)字符均為命令,但是命令同變量或值之間沒有間隔。這種格式便于 Sendmail 進(jìn)行分析,但很難閱讀。下面介紹 sendmail.cf 配置文件中的命令。
- D(定義宏)
命令 D 定義宏并為其賦值。當(dāng)宏被定義之后,其就負(fù)責(zé)提供提供其存儲(chǔ)的值給 sendmail.cf 文件中其他的命令使用或者直接提供給 Sendmail 使用。宏的名字可以是任何單字符,小寫的用于 Sendmail 內(nèi)部宏,用戶創(chuàng)建的宏只能使用大寫字母作為名字。一些 Sendmail 的內(nèi)部宏也在 sendmail.cf 文件里定義。例如下面兩行定義了宏 D 和內(nèi)部宏 n:
DDcs.mit.edu DnMAILER-DEAMON
則宏 D 的值為 cs.mit.edu,宏 n 的值為 MAILER-DEAMON。要使用宏的值時(shí),必須在宏的名字前面加上符號(hào)“$”,以這種形式來引用其值。例如:
#my official host name Dj$w.$D
如果宏 w 的值為主機(jī)名 moon,此時(shí)宏 j 的值就為 moon.cs.mit.edu,這便是本主機(jī)的全稱名(FQDN)。
- C 與 F(定義類)
命令 C 與 F 都是用來定義 Sendmail 的類。所謂類,實(shí)際上就是由處理方式相同的多個(gè)變量組成的數(shù)組。與宏一樣,類也使用單字符名字,大小寫規(guī)則也一樣。類可以定義在一行之中,也可以分多行定義,例如,下面的示范為內(nèi)部類 w 賦值為系統(tǒng)的主機(jī)名,而系統(tǒng)可以有多個(gè)名字:
Cwmoon sun Cwearth Cwlocalhost
命令 F 是從文件中獲取類的值,例如,可以把 moon、sun、earth 保存在 sendmail.cw 之中,然后用 F 命令便可以實(shí)現(xiàn)同上述命令完全相同的結(jié)果:
Fw/etc/sendmail.cw
對(duì)類的引用與宏的引用完全一樣,事實(shí)上宏就是一種類。兩者唯一的區(qū)別在于:宏只能有一個(gè)唯一的值,而類可以有多個(gè)值,當(dāng)然也可以只有一個(gè)值。
- O(設(shè)置選項(xiàng))
命令 O 是為 Sendmail 的選項(xiàng)賦值,賦給選項(xiàng)的值可以是字符串、整數(shù)或布爾值,所有的選項(xiàng)值都是直接由 Sendmail 來使用。注意:這里所說的選項(xiàng)與 Sendmail 使用的命令行參數(shù)不一樣。通常情況下,不需要修改這些選項(xiàng)。
- T(定義可信任的用戶)
命令 T 用來定義一組用戶列表,這組用戶可以使用 Sendmail 命令帶 -f 參數(shù)來修改用戶發(fā)出的郵件地址。一般情況下,包含 root、daemon 和 uucp。管理員最好不要隨意添加其他的用戶,否則這種權(quán)限在某些用戶手中可能會(huì)對(duì)系統(tǒng)安全構(gòu)成威脅??尚湃蔚挠脩艨梢栽谝恍谢蚨嘈兄卸x,但是被定義的用戶必須是 /etc/passwd 中的合法用戶。默認(rèn)是:
Troot Tdaemon Tuucp
- P(設(shè)置優(yōu)先級(jí))
Sendmail 使用命令 P 定義不同的優(yōu)先級(jí)來處理進(jìn)入出局緩沖區(qū)的電子郵件。命令 P 定義的值越高,則優(yōu)先級(jí)也越高,缺省的優(yōu)先級(jí)為 0。負(fù)優(yōu)先級(jí)的電子郵件是不產(chǎn)生錯(cuò)誤信息的,因此在批量發(fā)送郵件是應(yīng)該定義較底的優(yōu)先級(jí)。常用的優(yōu)先級(jí)為:
Pfirst-class=0 Pspecial-delivery=100 Plist=30 Pbulk=-60 Pjunk=-100
如果用戶在發(fā)送郵件是要指定優(yōu)先級(jí),則需要在郵件的首部中添加 Precedence,例如:
Precedence:bulk
- K(關(guān)鍵文件聲明)
特殊的映射可以定義成:Kmapname mapclass arguments。其中,mapname 是可重寫規(guī)則中使用這個(gè)映射的句柄,mapclass 是映射類型的名字,arguments 的解釋依賴與映射類型,通常是包含映射的文件名。
- V(配置版本級(jí)別)
提供與老版本配置文件的兼容性能。
- M(定義郵件傳輸程序)
命令 M 定義郵件傳輸程序(mailer)的規(guī)格 / 詳細(xì)參數(shù),其形式為:Mname,[field=value]。
Sendmail 并不是直接發(fā)送各種各樣的電子郵件,它首先將要發(fā)送的郵件分類,然后交給相應(yīng)的 mailer 來發(fā)送,本身只發(fā)送基于 SMTP/TCP/IP 的郵件。其中,[IPC] 表示使用 Sendmail 通過 SMTP 來傳送郵件。關(guān)于 IPC mailer,在 Sendmail 的文檔里有一段特殊的解釋:當(dāng)規(guī)則集 0 解析到 IPC mailer 時(shí)會(huì)處理一些特殊的過程。比如直接用 IP 地址發(fā)送郵件可以用 [128.32.149.78] 的形式,若用 [ucbvax.berkeley.edu] 將會(huì)被作為字符串傳遞,用這樣的方法用戶可以構(gòu)造一個(gè)特殊的郵件地址,使自己的郵件按指定的路線發(fā)送,而通常用戶是不關(guān)心也不知道自己郵件的發(fā)送路線的。
- H(定義郵件的首部格式)
命令 H 定義 Sendmail 命令插進(jìn)電子郵件首部的行的格式。
- R(定義重寫規(guī)則)
重寫規(guī)則是 Sendmail 配置文件的核心內(nèi)容,每一個(gè)重寫規(guī)則由命令 R 定義,其形式如下:
Rpattern transformation comment
命令 R 中的字段由制表符進(jìn)行分隔,系統(tǒng)處理時(shí)忽略注釋字段(comment),模式字段(pattern)與改寫字段(transformation)為該命令的核心。重寫規(guī)則將輸入地址與模式進(jìn)行匹配,如果匹配,則將該地址用規(guī)則中改寫字段的規(guī)則重寫為新的格式。每一個(gè)規(guī)則都可以多次處理同一地址,這是因?yàn)榈刂吩谥貙懼螅砸俅瓮撃J竭M(jìn)行匹配,如果仍舊匹配則再次改寫,直到不再匹配為止(使用“$:”可以避免無限循環(huán))。
- S(設(shè)置重寫規(guī)則集)
規(guī)則集是一組可以用數(shù)字來引用的相關(guān)重寫規(guī)則。命令 S 是規(guī)則集的開始并賦予其一個(gè)數(shù)字以便由郵件傳輸程序來調(diào)用。規(guī)則集可以被看作用來處理電子郵件地址的子程序或函數(shù)。具有特殊功能并可由 sendmail 直接調(diào)用的規(guī)則集有 5 個(gè):
規(guī)則集 3:為最大最復(fù)雜的規(guī)則集,也是用于地址的第一個(gè)規(guī)則集。它將地址轉(zhuǎn)化為正規(guī)形式,如:user@host.domain。 規(guī)則集 0:應(yīng)用于傳輸郵件的地址。必須在規(guī)則集 3 之后使用,并僅用于實(shí)際郵件傳輸中接收者的地址。其可以將地址解析成(mailer,host,user)的形式,由郵件傳輸者、接收方主機(jī)和接收用戶的名字組成。 規(guī)則集 1:應(yīng)用于消息中所有發(fā)送者地址。 規(guī)則集 2:應(yīng)用于消息中所有接收者地址。 規(guī)則集 4:應(yīng)用于消息中所有地址并將內(nèi)部地址格式轉(zhuǎn)化為外部地址格式。
安全配置 sendmail.mc 文件
Sendmail 的配置十分復(fù)雜,其配置文件是 sendmail.cf,位于 /etc/mail 目錄下。由于 sendmail.cf 的語法深?yuàn)W難懂,很少有人會(huì)直接去修改該文件來對(duì) Sendmail 服務(wù)器進(jìn)行配置。我們一般通過 m4 宏處理程序來生成所需的 sendmail.cf 文件。創(chuàng)建的過程中還需要一個(gè)模板文件,系統(tǒng)默認(rèn)在 /etc/mail 目錄下有一個(gè) sendmail.mc 模板文件。
用 m4 宏編譯工具創(chuàng)建 sendmail.cf 文件比較方便,而且不容易出錯(cuò),更可以避免某些帶有安全漏洞或者過時(shí)的宏所造成的破壞。一個(gè) sendmail.mc 模板的大致內(nèi)容如下:
pert(-1)dnl …… include('/usr/share/sendmail-cf/m4/cf.m4')dnl VERSIONID('setup for Red Hat)dnl OSTYPE('Linux')dnl …… dnl # dnl define('SMART_HOST','smtp.your.provider') dnl # define('confDEF_USER_ID',''8:12'')dnl define('confTRUSTED_USER', 'smmsp')dnl dnl define( ′ confAUTO_REBUILD ′ )dnl ……
下面介紹 ndmail.mc 模板的語法組成:
- dnl:用來注釋各項(xiàng),同時(shí) dnl 命令還用來標(biāo)識(shí)一個(gè)命令的結(jié)束。
- pert(-1):位于 mc 模板文件的頂部,目的是讓 m4 程序輸出時(shí)更加精簡(jiǎn)一些。
- OSTYPE ('OperationSystemType'):定義使用的操作系統(tǒng)類型,顯然這里應(yīng)該用 Linux 代替 OperationSystemType,注意要用一個(gè)反引號(hào)和一個(gè)正引號(hào)把對(duì)應(yīng)的操作系統(tǒng)類型括起來。
- define:定義一些全局設(shè)置,對(duì)于 Linux 系統(tǒng),設(shè)置了 OSTYPE 之后,可以定義下面的一些全局參數(shù),如果不定義,就使用默認(rèn)值。下面給出例子:define('ALIAS_FILE','/etc/aliases'):定義別名文件 (alia file) 的保存路徑,默認(rèn)是 /etc/aliases。Define('STATUS_FILE', '/etc/mail/statistics'):定義 sendmail 的狀態(tài)信息文件。
因此,用戶可以根據(jù)簡(jiǎn)單、直觀的 sendmail.mc 模板來生成 sendmail.cf 文件,而無須直接編輯 sendmail.cf 文件??梢灾苯油ㄟ^修改 sendmail.mc 模板來達(dá)到定制 sendmail.cf 文件的目的。這里介紹創(chuàng)建 sendmail.cf 文件的步驟:
(1)備份原有 sendmail.cf 文件:
#cp /etc/mial/sendmail.cf /etc/mail/sendmail.cf.BAK
?。?)生成 sendmail.cf 文件,根據(jù) sendmail.mc 模板文件產(chǎn)生 sendmail.cf 配置文件,并導(dǎo)出到 /etc/mail/ 目錄下:
#m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
?。?)重啟 Sendmail 服務(wù):
#service sendmail restart
在該文件中,有 6 個(gè)非常重要的參數(shù)需要進(jìn)行仔細(xì)的設(shè)置,因?yàn)樗鼈儗?duì) Sendmail 服務(wù)器的性能以及應(yīng)對(duì)拒絕服務(wù)攻擊方面具有很大的影響:
ConfCONNECTION_RATE_THROTTLE:該參數(shù)表示服務(wù)器能夠接受的最大連接數(shù)量。一般情況下 Sendmail 不會(huì)對(duì)其進(jìn)行限制。但是如果不設(shè)置,將會(huì)可能使得服務(wù)器的性能“透支”,建議設(shè)置為:Define(’ confCONNECTION_RATE_THROTTLE ’ , 5); ConfMAX_MESSAGE_SIZE:該參數(shù)表示單個(gè)消息可接受數(shù)據(jù)的最大限度(以字節(jié)為單位),此參數(shù)設(shè)置可以過濾一些異常的攜帶大附件的郵件,從而減輕服務(wù)器的傳輸壓力和存儲(chǔ)空間壓力,建議設(shè)置為:Define(’ ConfMAX_MESSAGE_SIZE ’ , 10000000); ConfMIN_FREE_BLOCKS:此參數(shù)定義服務(wù)器保留的用于接收郵件的空閑塊的最小數(shù)量,一般定義為 100 即可,即:Define(’ ConfMIN_FREE_BLOCKS ’ , 100); ConfMAX_DAEMON_CHILDREN:此參數(shù)定義服務(wù)器主進(jìn)程能夠派生的子進(jìn)程的最大數(shù)量,一般不宜過大,設(shè)定為 10 即可,即:Define(’ ConfMAX_DAEMON_CHILDREN ’ , 10); ConfMAX_HEADER_LENGTH:該參數(shù)定義消息頭的最大限度(以字節(jié)為單位),定義該參數(shù)可以過濾部分黑客攻擊,建議設(shè)置為:Define(’ ConfMAX_HEADER_LENGTH ’ , 16000); ConfMAX_RCPTS_PER_MESSAGE:設(shè)定郵件最大接收者的數(shù)量,對(duì)該參數(shù)進(jìn)行限定可以過濾大量的垃圾郵件,因?yàn)槔]件一般都具有巨大數(shù)量的接收者。建議設(shè)置為:Define(’ ConfMAX_RCPTS_PER_MESSAGE ’ , 100)。
#p#
實(shí)戰(zhàn)安全配置使用 Qmail 郵件服務(wù)器
Qmail 的配置文件是由多個(gè)文件組成的,不是集中在一個(gè)文件中。每個(gè)文件控制相應(yīng)部分的功能和屬性,一個(gè)可執(zhí)行程序可能有多個(gè)配置文件控制,所有的配置文件共同決定了 Qmail 運(yùn)行的實(shí)現(xiàn)和模式。這些配置文件都在 Qmail 的 control 目錄中,即位于 /var/qmail/control 目錄中。合理設(shè)定如下選項(xiàng),可以有效地增強(qiáng) Qmail 服務(wù)器的安全性能。
(1)badmailfrom
這個(gè)配置文件是控制郵件系統(tǒng)拒絕接收的郵件地址和郵件域,主要是為了防止垃圾郵件。如果一個(gè)郵件地址或者郵件域被列入到這個(gè)文件中,系統(tǒng)就會(huì)拒絕接收這個(gè)郵件地址發(fā)來的郵件,或者拒絕郵件域下所有郵件地址發(fā)來的郵件。不過這個(gè)配置文件只是一般的垃圾郵件防范手段,對(duì)于比較全面的垃圾郵件過濾技術(shù)還要靠第三方軟件來實(shí)現(xiàn)。該文件的格式如下:
example@deny.com // 拒絕這個(gè)地址發(fā)來的郵件
@deny.com // 拒絕這個(gè)郵件域下的所有帳號(hào)發(fā)來的郵件
?。?)concurrencylocal
這個(gè)文件定義了 Qmail 可以同時(shí)投遞的本地郵件的個(gè)數(shù)。這個(gè)參數(shù)的缺省值是 10,也就是說系統(tǒng)允許同時(shí)有 10 個(gè)郵件在本地投遞。 concurrencylocal 這個(gè)參數(shù)的最大值是由編譯時(shí)的 conf-spawn 參數(shù)來決定的,缺省值是 120,最大值是 255。該值應(yīng)該設(shè)置恰當(dāng),設(shè)得過大或者過小會(huì)浪費(fèi)或者損失 Qmail 服務(wù)器的性能。
?。?)concurrencyremote
這個(gè)參數(shù)定義了 Qmail 可以同時(shí)投遞的遠(yuǎn)端郵件的個(gè)數(shù),這個(gè)參數(shù)的缺省值是 20。這個(gè)參數(shù)的最大值也是由 conf-spawn 來決定的。設(shè)置的重要性如同選項(xiàng)(2)所示。
?。?)databyes
它定義了 qmail-smtpd 所允許接收的郵件的最大字節(jié)數(shù)。
這個(gè)參數(shù)的缺省值為 0,表示對(duì)接收郵件的字節(jié)數(shù)沒有限制。如果要限制最大的接收為 10M,操作如下:
echo 10485760 > /var/qmail/control/databytes
這是任何大于 10M 的郵件都會(huì)被拒絕。這個(gè)參數(shù)最好合理設(shè)置,以避免惡意的對(duì)你服務(wù)器發(fā)送大量的超大郵件,產(chǎn)生郵件服務(wù)器負(fù)荷過大,甚至系統(tǒng)崩潰的危險(xiǎn)。
(5)me
這個(gè)配置文件是 Qmail 系統(tǒng)十分重要的一個(gè)文件,如果這個(gè)文件不存在,Qmail 系統(tǒng)將無法運(yùn)行。 me 是用來定義本地郵件服務(wù)器的主機(jī)名的。有多個(gè)配置文件是和 me 有關(guān)聯(lián)的。如果那些配置文件不存在,系統(tǒng)默認(rèn)會(huì)從 me 中讀取參數(shù)值的。me 這個(gè)配置文件一般都是在 Qmail 系統(tǒng)安裝時(shí)使用 configure-fast 來創(chuàng)建的。
(6)queuelifetime
這個(gè)配置文件是定義一個(gè)郵件在郵件隊(duì)列中存活的時(shí)間。
缺省值為 7 天(604800s),這個(gè)期限掉了以后 qmail-send 將會(huì)進(jìn)行最后一次的投遞嘗試,如果投遞失敗,該郵件將會(huì)從郵件隊(duì)列中刪除。
?。?)rcphosts
這個(gè)配置文件也是 Qmail 一個(gè)十分重要的文件,這個(gè)文件是定義系統(tǒng)允許轉(zhuǎn)發(fā)郵件的郵件域。 如果這個(gè)文件不存在或者為空,你的系統(tǒng)將會(huì)接收 Internet 上所有的域的郵件轉(zhuǎn)發(fā),即你的系統(tǒng)是 Open relay(存在被惡意用戶作為垃圾郵件發(fā)送服務(wù)器的危險(xiǎn)!?。。?。配置文件 rcpthosts 最多可以支持 50 個(gè)主機(jī)名和域名。如果超個(gè)這個(gè)數(shù)字,就需要保存到他的擴(kuò)充配置文件 morercphosts 中,然后使用 Qmail 的命令程序 qmail-newmrh (該文件一般在 /var/qmail/bin 目錄下)來生成二進(jìn)制的 morercpthosts.cdb 文件,這樣 qmail-smtpd 才可以從這個(gè)二進(jìn)制文件中讀取信息。
?。?)virtualdomains
這也是 Qmail 的一個(gè)非常重要的配置文件,它定義了 Qmail 的虛擬郵件域,Qmail 結(jié)合 vpopmail 的虛擬域管理功能可以定義多個(gè)虛擬郵件域。
總結(jié)
本文作為本系列的第一部分,詳細(xì)介紹了企業(yè)開源電子郵件系統(tǒng)的安全原理及 Sendmail、Qmail 安全防護(hù)實(shí)戰(zhàn)。第二部分將詳細(xì)介紹 Postfix 的安全防護(hù)實(shí)戰(zhàn),以及如何進(jìn)行企業(yè)垃圾郵件防范。
關(guān)于作者
李洋,博士,現(xiàn)任某大型金融公司信息安全顧問,多年來一直從事信息安全方面的研發(fā)和管理工作,具有豐富的互聯(lián)網(wǎng)、電信網(wǎng)和金融行業(yè)信息安全管理、咨詢和研發(fā)經(jīng)驗(yàn)。目前關(guān)注開源系統(tǒng)安全、云安全、虛擬化安全等。