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