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