構(gòu)建Linux系統(tǒng)下的安全Postfix電子郵件服務(wù)
Postfix是一個由IBM資助、由Wietse Venema負(fù)責(zé)開發(fā)的自由軟件工程產(chǎn)物,它的目的就是為用戶提供除Qmail之外的郵件服務(wù)器選擇。Postfix在快速、易于管理和提供盡可能的安全性方面都進(jìn)行了較好的考慮。Postfix是基于半駐留、互操作的進(jìn)程的體系結(jié)構(gòu),每個進(jìn)程完成特定的任務(wù),沒有任何特定的進(jìn)程衍生關(guān)系,使整個系統(tǒng)進(jìn)程得到很好的保護(hù)。同時Postfix也可以和Qmail郵件服務(wù)器保持兼容性以滿足用戶的使用習(xí)慣。
與Qmail相比,Postfix最被人稱道的地方就在于其配置文件的可讀性很高。Postfix的主配置文件是/etc/postfix/main.cf。雖然該配置文件的內(nèi)容比較多,但其中大部分內(nèi)容都是注釋(“#”號開頭的行),真正需要自行定義的參數(shù)并不多。然而,為了對其進(jìn)行安全配置,還是需要針對某些選項進(jìn)行細(xì)心的設(shè)置。
Postfix配置文件
在main.cf文件中,參數(shù)都是以類似變量的設(shè)置方法來設(shè)置的,這些參數(shù)的使用主要包含兩部分的內(nèi)容:
(1)定義和聲明變量:例如definename = good-better-best。等號左邊是變量的名稱,等號右邊是變量的值。
(2)引用變量:可以在變量的前面加上符號“$”來引用該變量,如:myname = $ definename(相當(dāng)于definename = good-better-best)。
需要注意的是:等號兩邊需要有空格字符。此外,如果變量有兩個以上的設(shè)置值,就必須用逗號“,”或者空格符“ ”將它們分開。
在熟悉了上述變量的定義和引用方法后,下面詳細(xì)介紹如何安全、高效地配置Postfix服務(wù)器的相關(guān)選項。
設(shè)置Postfix服務(wù)監(jiān)聽的網(wǎng)絡(luò)接口
默認(rèn)情況下,inet_interfaces參數(shù)的值被設(shè)置為localhost,這表明只能在本地郵件主機(jī)上寄信。如果郵件主機(jī)上有多個網(wǎng)絡(luò)接口,而又不想使全部的網(wǎng)絡(luò)接口都開放Postfix服務(wù),就可以用主機(jī)名指定需要開放的網(wǎng)絡(luò)接口。不過,通常是將所有的網(wǎng)絡(luò)接口都開放,以便接收從任何網(wǎng)絡(luò)接口來的郵件,即將inet_interfaces參數(shù)的值設(shè)置為“all”,如下所示:
inet_interfaces = all
安全設(shè)置可接收郵件的主機(jī)名稱或域名
mydestination參數(shù)非常重要,因為只有當(dāng)發(fā)來的郵件的收件人地址與該參數(shù)值相匹配時,Postfix才會將該郵件接收下來。通過該選項的設(shè)置可以過濾掉許多沒有經(jīng)過認(rèn)證和授權(quán)的郵件,從而節(jié)省服務(wù)器的存儲空間,以及節(jié)省用戶的郵件處理時間。舉一個簡單的例子,用戶可以將該參數(shù)值設(shè)置為如下:
accept_domain = test.net
mydestination = $accept_domain
這就表明無論來信的收件人地址是X@test.net(其中X表示某用戶在test.net域中的郵件賬戶名),Postfix都會接收這些郵件。而除此之外的郵件,Postfix都不會接受。
安全設(shè)置可轉(zhuǎn)發(fā)郵件的網(wǎng)絡(luò)(IP設(shè)置)
有關(guān)安全設(shè)置可轉(zhuǎn)發(fā)郵件的網(wǎng)絡(luò)可以使用mynetworks參數(shù)來設(shè)置??蓪⒃搮?shù)值設(shè)置為所信任的某臺主機(jī)的IP地址,也可設(shè)置為所信任的某個IP子網(wǎng)或多個IP子網(wǎng)(采用“,”或者“ ”分隔)。
比如,用戶可以將mynetworks參數(shù)值設(shè)置為172.168.96.0/24,則表示這臺郵件主機(jī)只轉(zhuǎn)發(fā)子網(wǎng)172.168.96.0/24中的客戶端所發(fā)來的郵件,而拒絕為其他子網(wǎng)轉(zhuǎn)發(fā)郵件:
mynetworks = 172.168.96.0/24
除了mynetworks參數(shù)外,還有一個用于控制網(wǎng)絡(luò)郵件轉(zhuǎn)發(fā)的參數(shù)是mynetworks-style,它主要用來設(shè)置可轉(zhuǎn)發(fā)郵件網(wǎng)絡(luò)的方式。通常有以下三種方式:
(1)class:在這種方式下,Postfix會自動根據(jù)郵件主機(jī)的IP地址得知它所在的IP網(wǎng)絡(luò)類型(即A類、B類或是C類),從而開放的它所在的IP網(wǎng)段。
(2)subnet:這是postfix的默認(rèn)值,Postfix會根據(jù)郵件主機(jī)的網(wǎng)絡(luò)接口上所設(shè)置的IP地址、子網(wǎng)掩碼來得知所要開放的IP網(wǎng)段。
(3)host:在這種方式下,Postfix只會開放本機(jī)。
通常,用戶一般不需要設(shè)置mynetworks-style參數(shù),而直接設(shè)置mynetworks參數(shù)。如果這兩個參數(shù)都進(jìn)行了設(shè)置,那么mynetworks參數(shù)的設(shè)置有效。
設(shè)置可轉(zhuǎn)發(fā)郵件的網(wǎng)絡(luò)(域名設(shè)置)
上面介紹的mynetworks參數(shù)是針對郵件來源的IP來設(shè)置的,而relay_domains參數(shù)則是針對郵件來源的域名或主機(jī)名來設(shè)置的,其實從原理上來說是一致的,不過是區(qū)分了IP地址和域名而已,不過,relay_domains還需要依賴DNS這個基礎(chǔ)設(shè)施。
例如,用戶可以將relay_domains參數(shù)值設(shè)置為test.net,則表示任何由域test.net發(fā)來的郵件都會被認(rèn)為是信任的,Postfix會自動對這些郵件進(jìn)行轉(zhuǎn)發(fā),如下所示:
relay_domains = test.net
那么,要使它能在實際網(wǎng)絡(luò)中更好地轉(zhuǎn)發(fā)郵件,還必須進(jìn)行相應(yīng)的DNS設(shè)置。那么,需要在該網(wǎng)絡(luò)的DNS服務(wù)器上定義了一個主區(qū)域test.net,并在該區(qū)域配置文件中定義了以下記錄:
//定義郵件服務(wù)器的IP地址
patterson.test.net. IN A 172.168.96.254
//定義郵件服務(wù)器的別名
mail.test.net. IN CNAME patterson.test.net.
//定義優(yōu)先級別
test.net. IN MX 10 mail.test.net.
上述記錄只對郵件服務(wù)器進(jìn)行了定義,還有諸如SOA、NS等的定義,在這里就不再贅述。
Postfix使用SMTP安全認(rèn)證
為了避免無限制的轉(zhuǎn)發(fā)情況的出現(xiàn),Postfix默認(rèn)不會對外開放轉(zhuǎn)發(fā)功能,而僅對本機(jī)(localhost)開放轉(zhuǎn)發(fā)功能。但是,在實際應(yīng)用中,必須在Postfix主配置文件中通過設(shè)置mynetworks、relay_domains參數(shù)來開放一些所信任的網(wǎng)段或網(wǎng)域,否則該郵件服務(wù)器幾乎沒有什么用處。在開放了這些所信任的網(wǎng)段或網(wǎng)域后,還可以通過設(shè)置SMTP認(rèn)證,對要求轉(zhuǎn)發(fā)郵件的客戶端進(jìn)行用戶身份(用戶賬戶名與密碼)驗證。只有通過了驗證,才能接收該用戶寄來的郵件并幫助轉(zhuǎn)發(fā)。同樣,Postfix中目前比較常用的SMTP認(rèn)證機(jī)制是通過Cyrus SASL包來實現(xiàn)的。
默認(rèn)情況下,Postfix并沒有啟用SMTP認(rèn)證機(jī)制。要讓Postfix啟用SMTP認(rèn)證,就必須對Postfix的主配置文件/etc/postfix/main.cf進(jìn)行修改。用戶需要在main.cf文件中添加如下有關(guān)SMTP認(rèn)證的設(shè)置部分:
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認(rèn)證方式。默認(rèn)不啟用,這里必須將它啟用,所以要將該參數(shù)值設(shè)置為yes。
(2)smtpd_sasl_local_domain:如果采用Cyrus-SASL版進(jìn)行認(rèn)證,那么這里不做設(shè)置。
(3)smtpd_recipient_restrictions:表示通過收件人地址對客戶端發(fā)來的郵件進(jìn)行過濾。通常有以下幾種限制規(guī)則:
permit_mynetworks:表示只要是收件人地址位于mynetworks參數(shù)中指定的網(wǎng)段就可以被轉(zhuǎn)發(fā)郵件。
permit_sasl_authenticated:表示允許轉(zhuǎn)發(fā)通過SASL認(rèn)證的郵件。
reject_unauth_destination:表示拒絕轉(zhuǎn)發(fā)含未信任的目標(biāo)地址的郵件。
(4)broken_sasl_auth_clients:表示是否兼容非標(biāo)準(zhǔn)的SMTP認(rèn)證。有一些Microsoft的SMTP客戶端采用非標(biāo)準(zhǔn)的SMTP認(rèn)證協(xié)議,只需將該參數(shù)設(shè)置為yes就可解決這類不兼容問題。
(5)smtpd_client_restrictions:表示限制可以向Postfix發(fā)起SMTP連接的客戶端。如果要禁止未經(jīng)過認(rèn)證的客戶端向Postfix發(fā)起SMTP連接,則可將該參數(shù)值設(shè)置為permit_sasl_authenticated。
(6)smtpd_sasl_security_options:用來限制某些登錄的方式。如果將該參數(shù)值設(shè)置為noanonymous,則表示禁止采用匿名登錄方式。
在完成上述設(shè)置后,必須使用命令/etc/init.d/postfix reload重新載入配置文件,或使用命令/etc/init.d/postfix restart重新啟動Postfix服務(wù),以使該配置生效。當(dāng)然,這兩個命令的具體使用需要根據(jù)不同的Linux版本來選用。
此外,由于當(dāng)Postfix要使用SMTP認(rèn)證時,會讀取/usr/lib/sasl2/smtpd.conf文件中的內(nèi)容,以確定所采用的認(rèn)證方式,因此如果要使用saslauthd這個守護(hù)進(jìn)程來進(jìn)行密碼認(rèn)證,就必須確保/usr/lib/sasl2/smtpd.conf文件中的內(nèi)容為:
pwcheck_method: saslauthd