Postfix sasl身份驗(yàn)證功能
基本的smtp協(xié)議沒有驗(yàn)證用戶身份的能力。雖然信封上的寄件人地址已經(jīng)隱含了發(fā)信者的身份,然而,由于信封地址實(shí)在太容易假造,所以不能當(dāng)成身份憑據(jù)。 為了判斷客戶端是否有權(quán)使用轉(zhuǎn)發(fā)服務(wù)(relay),服務(wù)器端必須確認(rèn)客戶端(寄件人)是否當(dāng)真是對方所自稱的那個(gè)人。在不能以寄件人地址為身份證書的前 提下,smtp勢必需要其他補(bǔ)充機(jī)制,才能驗(yàn)證客戶端的身份。那我們就來看看Postfix sasl身份驗(yàn)證機(jī)制,是如何運(yùn)行的。
從postfix的角度看,它需要扮演兩種角色:當(dāng)它身為smtp server時(shí),需要能夠驗(yàn)證用戶個(gè)人的身份(讓他們能使用smtp server寄出郵件);當(dāng)它身為smtp client時(shí),它需要能夠提供出自己的身份證書給其他mta檢驗(yàn)(以便通過遠(yuǎn)程mta將郵件遞送到最終目的地)。因此,我們也會解釋如何設(shè)定 postfix,使其能通過其他mta的身份驗(yàn)證。
大多數(shù)郵件系統(tǒng)只容許內(nèi)部網(wǎng)絡(luò)上的客戶端使用轉(zhuǎn)發(fā)服務(wù),換言之,ip地址成了客戶端身份的識別 憑據(jù)。然而,并非所有合法用戶都具有固定ip地址。比方說,帶著筆記本電腦出差遠(yuǎn)方的同事,他們可能使用領(lǐng)近isp或飯店旅館提供的臨時(shí)性ip地址;或 者,有些在家工作的用戶,他們位于辦公室之外的網(wǎng)絡(luò),但是需要透過辦公室里的郵件系統(tǒng)來寄信。不管你是否能夠事先知道用戶的ip地址,sasl都能提供可 靠的身份驗(yàn)證。
RFC 2554 “smtp service extension for authentication”制定了如何在基本smtp協(xié)議上增加驗(yàn)證功能的機(jī)制,此機(jī)制使得smtp能使用sasl協(xié)議來驗(yàn)證客戶端身份。我們將示范 如何使用carnegie mellon大學(xué)開發(fā)的cyrus sasl函數(shù)庫來擴(kuò)充postfix,使其具備sasl驗(yàn)證能力。
由于cyrus sasl以“函數(shù)庫”的形式存在,要讓你的postfix支持sasl,你必須在編譯postfix時(shí)就將cyrus sasl函數(shù)庫鏈接進(jìn)去,此外,遠(yuǎn)程用戶也必須設(shè)定他們的mua,使其在通過你的郵件系統(tǒng)轉(zhuǎn)發(fā)郵件時(shí),能送出正確的標(biāo)識信息。
sasl概論
有 許多客戶機(jī)/服務(wù)器協(xié)議沒有驗(yàn)證能力,sasl就是用于加強(qiáng)或增加這類協(xié)議的一種通用方法。當(dāng)你設(shè)定sasl時(shí),你必須決定兩件事;一是用于交換“標(biāo)識信 息”(或稱身份證書)的驗(yàn)證機(jī)制;一是決定標(biāo)識信息存儲方法的驗(yàn)證架構(gòu)。sasl驗(yàn)證機(jī)制規(guī)范client與server之間的應(yīng)答過程以及傳輸內(nèi)容的編 碼法,sasl驗(yàn)證架構(gòu)決定服務(wù)器本身如何存儲客戶端的身份證書以及如何核驗(yàn)客戶端提供的密碼。如果客戶端能成功通過驗(yàn)證,服務(wù)器端就能確定用戶的身份, 并借此決定用戶具有怎樣的權(quán)限。對postfix而言,所謂的“權(quán)限”指的就是轉(zhuǎn)發(fā)服務(wù)的訪問權(quán)。你也可以決定通過驗(yàn)證的用戶在轉(zhuǎn)發(fā)郵件時(shí),是否要使用特 定的寄件人地址。
選擇適當(dāng)?shù)尿?yàn)證機(jī)制
cyrus sasl支持多種驗(yàn)證機(jī)制,至于要使用哪一種驗(yàn)證機(jī)制,客戶端與服務(wù)器雙方必須事先取得共識。以下是一些比較常見的機(jī)制;
plain
plain是最簡單的機(jī)制,但同時(shí)也是最危險(xiǎn)的機(jī)制,因?yàn)樯矸葑C書(登錄名稱與密碼)是以base64字符串格式通過網(wǎng)絡(luò),沒有任何加密保護(hù)措施。因此,使用plain機(jī)制時(shí),你可能會想要結(jié)合tls。
login
login不是其正式支持的機(jī)制,但某些舊版的mua使用這種機(jī)制,所以cyrus sasl讓你可選擇其是否支持login機(jī)制。如果你的用戶仍在使用這類老掉牙的mua,你必須在編譯sasl函數(shù)庫時(shí),指定要包含login的支持。 login的證書交換過程類似plain。
otp
otp是一種使用“單次密碼”的驗(yàn)證機(jī)制。此機(jī)制不提供任何加密保護(hù),因?yàn)闆]必要--每個(gè)密碼都只能使用一次,每次聯(lián)機(jī)都要改用新密碼。smto client必須能夠產(chǎn)生otp證書。
digest-md5
使用這種機(jī)制時(shí),client與server共享同一個(gè)隱性密碼,而且此密碼不通過網(wǎng)絡(luò)傳輸。驗(yàn)證過程是從服務(wù)器先提出challenge(質(zhì)詢)開始, 客戶端使用此challenge與隱性密碼計(jì)算出一個(gè)response(應(yīng)答)。不同的challenge,不可能計(jì)算出相同的response;任何擁 有secret password的一方,都可以用相同的challenge算出相同的response。因此,服務(wù)器只要比較客戶端返回的response是否與自己算 出的response相同,就可以知道客戶端所擁有的密碼是否正確。由于真正的密碼并沒有通過網(wǎng)絡(luò),所以不怕網(wǎng)絡(luò)監(jiān)測。
kerberos
kerberos是一種網(wǎng)絡(luò)型驗(yàn)證協(xié)議。除非你的網(wǎng)絡(luò)已經(jīng)使用kerberos,否則你應(yīng)該用不到kerberos機(jī)制;相對的,如果你的網(wǎng)絡(luò)已經(jīng)架設(shè)了kerberos驗(yàn)證中心,sasl就能完美的將smtp驗(yàn)證整合進(jìn)現(xiàn)有的體系。
anonymous
anonymous機(jī)制對smtp沒有意義,因?yàn)閟mtp驗(yàn)證的用意在于限制轉(zhuǎn)發(fā)服務(wù)的使用對象,而不是為了形成open relay,sasl之所以提供這種機(jī)制,主要是為了支持其他協(xié)議。
當(dāng) 客戶端鏈接到一個(gè)支持sasl的郵件服務(wù)器時(shí),服務(wù)器會以優(yōu)先級列出可用的機(jī)制供客戶端選擇。如果客戶端也支持多鐘機(jī)制,則當(dāng)?shù)谝环N機(jī)制驗(yàn)證失敗時(shí),客戶 端可能會繼續(xù)嘗試第二種機(jī)制,直到通過驗(yàn)證或是所有機(jī)制都失敗為止。如果雙方在一開始就無法協(xié)調(diào)出共同的機(jī)制,驗(yàn)證過程就算失敗。
一旦雙方在使用哪種機(jī)制上達(dá)成共識,就開始進(jìn)行驗(yàn)證過程。實(shí)際的交互過程隨機(jī)制而定,但通常包含一次或多次應(yīng)答過程。驗(yàn)證協(xié)議本身也規(guī)定了應(yīng)答內(nèi)容的編碼格式。
選擇適當(dāng)?shù)尿?yàn)證架構(gòu)
sasl驗(yàn)證架構(gòu)可以使用現(xiàn)有的unix系統(tǒng)密碼,也可用smtp用戶專用密碼文件。如果你的網(wǎng)路上kerberos之類的中間控制式驗(yàn)證構(gòu)架,也可以使用。
哪 一種驗(yàn)證架構(gòu)最適合你,取決于你的服務(wù)器從何、如何取得證書信息。舉例來說,如果smtp與pop/imap的所有用戶的證書數(shù)據(jù)都是儲存在系統(tǒng)密碼文 件,并通過pam來驗(yàn)證,那么sasl就應(yīng)該透過pam來取得證書數(shù)據(jù)。另一方面,如果所有smtp user都只有虛賬戶,你或許應(yīng)該將證書數(shù)據(jù)存放在專用的數(shù)據(jù)庫,并設(shè)定sasl與POP/IMAP server從該數(shù)據(jù)庫取得證書數(shù)據(jù)。
postfix與sasl
在開始使用sasl之前,你應(yīng)該決定好,要采用哪一種機(jī)制與架構(gòu)的組合,因?yàn)槟愕臎Q定將影響編譯、安裝、設(shè)定的過程。首先,你必須先將sasl函數(shù)庫安裝 到你的系統(tǒng)上,或是確定sasl函數(shù)庫的安裝目錄與版本。接著,使用你收集到的sasl安裝信息來設(shè)定postfix的編譯選項(xiàng),然后重新編譯 postfix,使其具備sasl驗(yàn)證能力。某些系統(tǒng)平臺可能已經(jīng)預(yù)先安裝了sasl函數(shù)庫,甚至提供支持sasl的postfix包,不過,大部分預(yù)先 編譯好的postfix包都不支持sasl。因此,如果你使用現(xiàn)成的postfix包,最好先研讀相關(guān)說明文件,或是按照本章“測試驗(yàn)證配置”一節(jié)所說的 測試方法,確認(rèn)你的postfix確實(shí)支持sasl。此外,你也要確認(rèn)你的sasl函數(shù)庫支持客戶端可能使用的每一種驗(yàn)證機(jī)制。比方說,若你的用戶中還有 人使用老版的outlook express,你的sasl函數(shù)庫就必須支持login驗(yàn)證機(jī)制。
cyrus sasl函數(shù)庫的研發(fā)進(jìn)度,目前分為兩條線路,即sasl與saslv2。其中,sasl已經(jīng)逐漸被saslv2所取代。在未來,postfix可能只支 持saslv2,所以本章只討論saslv2。此外,postfix與sasl函數(shù)庫兩者的版本都必須正確,才能組合在一起。
postfix從1.17-20020331實(shí)驗(yàn)版開始支持saslv2函數(shù)庫,在這之前的版本,只能使用saslv1。理論上,最新版的postfix與最新版的cyrus saslv2應(yīng)該可以順利結(jié)合在一起。
postfix的sasl配置
假設(shè)你已經(jīng)安裝好sasl函數(shù)庫,而且postfix也支持sasl,并下定決心要使用哪一種驗(yàn)證機(jī)制與架構(gòu)的組合?,F(xiàn)在,讓我們逐步設(shè)定postfix,使其能夠使用sasl來驗(yàn)證用戶的身份。
設(shè)定驗(yàn)證架構(gòu)
對于每個(gè)使用cyrus sasl函數(shù)庫的應(yīng)用系統(tǒng),cyrus sasl各提供一個(gè)獨(dú)立的配置文件。影響postfix的sasl配置文件是smtpd.conf。此文件通常位于 /usr/local/lib/sasl2/smtpd.conf?;旧希瑂mtpd.conf至少要指出所要使用的驗(yàn)證架構(gòu)。我們打算討論兩種最常用 的架構(gòu):unix系統(tǒng)密碼以及獨(dú)立的sasl專用密碼。
unix系統(tǒng)密碼
通常,讓sasl直接使用現(xiàn)有的系統(tǒng)密碼來驗(yàn)證用戶身份是最方便的。傳統(tǒng)的系統(tǒng)密碼文件應(yīng)該是/etc/passwd,但是講究安全性的現(xiàn)代系統(tǒng)則比較可 能使用/etc/shadow、pam或諸如此類的證書數(shù)據(jù)庫。由于這類密碼文件只有特權(quán)進(jìn)程才能訪問,而postfix卻被刻意設(shè)計(jì)成避開特權(quán)身份,所 以postfix不能直接訪問系統(tǒng)密碼文件。
cyrus函數(shù)庫對于這個(gè)問題的解決辦法,是提供一個(gè)特殊的驗(yàn)證服務(wù)器程序,稱為saslauthd,它能夠代替postfix來取得密碼數(shù)據(jù)。 saslauthd eaemon本身需要特權(quán)身份,不過,由于它是一個(gè)獨(dú)立于postfix之外的進(jìn)程,而且通常不必于外界進(jìn)行網(wǎng)絡(luò)通信,所以安全性的危害已經(jīng)被降到最低。 如果你打算讓sasl使用unix系統(tǒng)密碼,你必須啟動cyrus sasl包隨附的saslauthd daemon。請注意,使用saslauthd來訪問unix系統(tǒng)密碼,表示你只能使用明文密碼,因?yàn)閍salauthd需要實(shí)際密碼才能進(jìn)行核驗(yàn)。
要讓sasl知道postfix將通過saslauthd daemon來訪問證書數(shù)據(jù)庫,你必須將下列內(nèi)容加入smtpd.conf配置文件:
pwcheck_method: saslauthd
cyrus sasl包隨附的saslauthd應(yīng)該會被安裝在$PATH環(huán)境變量所列的某個(gè)目錄下。你必須先在后臺啟動saslauthd daemon,postfix才能使用它來驗(yàn)證客戶端。當(dāng)你啟動saslauthd時(shí),你必須使用-a選項(xiàng)指定密碼系統(tǒng)的類型最常見的類型包括pam、 shadow或getpwent。舉例來說,在一個(gè)使用pam的系統(tǒng)上,你應(yīng)該使用下列命令來啟動saslauthd daemon:
saslauthd -a pam
sasl專用密碼
如果你不想使用系統(tǒng)密碼來驗(yàn)證smtp client,你刻意另外建一個(gè)無關(guān)系統(tǒng)密碼的獨(dú)立賬戶數(shù)據(jù)庫。當(dāng)你的postfix系統(tǒng)純粹用于提供寄信服務(wù),而不用于接收外來郵件,用戶也不用登錄服 務(wù)器系統(tǒng)本身時(shí),使用sasl密碼可能是個(gè)好主意。請將下列內(nèi)容加入你的smtpd.conf配置文件:
pwcheck_method: auxprop
在cyrus的術(shù)語中,auxprop的意義是auxiliary property plug-ins(輔助性的專屬外掛模塊),其作用是使用外部程序來進(jìn)行驗(yàn)證。默認(rèn)的輔助外掛模塊是sasldb(這也是cyrus sasl包隨附的程序之一),它應(yīng)該能滿足postfix的所有需求。關(guān)鍵字auxprop只是要求使用外部的sasl密碼文件。
使用sasl密碼時(shí),不需要用到saslauthd daemon,但是你必須將所有的smtp client賬戶與密碼存放在一個(gè)專用的外部密碼文件中。sasl默認(rèn)使用的密碼文件是/etc/sasldb2。postfix smtp server至少要具備能讀取此文件的權(quán)限;如果你使用cyrus sasl的auto_transition功能,則postfix將需要能夠?qū)懘宋募臋?quán)限;如果你用不到auto_transition功能,最好不要 將寫權(quán)限開放給postfix。
如果還有其他進(jìn)程也需要能夠訪問sasl密碼文件(比方說,pop/imap server),你必須適當(dāng)調(diào)整該文件的擁有權(quán)與訪問權(quán)限,讓相關(guān)進(jìn)程都能訪問它。舉例來說,你可以建立一個(gè)sasl組,并確定postfix與其他需要 訪問該文件的賬戶都隸屬于此組。如果有任何去他進(jìn)程需要更新該文件,則只讀模式可能太嚴(yán)格,而你必須提供寫權(quán)限給必要的進(jìn)程。下列命令將 /etc/sasldb2的訪問模式設(shè)定為440,這使得sasl組的所有成員都能夠讀取該文件,除此之外的其他進(jìn)程則沒有訪問權(quán):
chown postfix:sasl /etc/sasldb2
chmod 440 /etc/sasldb2
cyrus sasl包所提供的saslpasswd2工具,可用來產(chǎn)生、維護(hù)/etc/sasldb2密碼文件。對于每一個(gè)賬戶,你必須提供三項(xiàng)信息:登錄名稱、 sasl網(wǎng)域名稱、密碼。就postfix而言,網(wǎng)域名稱必須與myhostname參數(shù)的值吻合。所以,最保險(xiǎn)的設(shè)定方法,就是利用postconf -h myhostname來決定網(wǎng)域名稱,如下:
saslpasswd2 -c -u `postconf - h myhostname` kdent
-c選項(xiàng)要求saslpasswd2創(chuàng)建(create)一個(gè)賬戶。“-u”選項(xiàng)指出該賬戶所屬的網(wǎng)域,其值直接取自postfix的配置文件。
設(shè)定postfix
所有與sasl密碼驗(yàn)證相關(guān)的postfix參數(shù),全部都是以smtpd_sasl*(關(guān)于smtp server的參數(shù))或smtp_sasl*(關(guān)于smtp client的參數(shù))為前綴。對于服務(wù)器端的配置,你至少需要設(shè)定smtpd_sasl_auth_enable參數(shù),并且將 permit_sasl_authenticated限制條件列在某一個(gè)smtpd_*_restriction的過濾規(guī)則里。
啟用sasl驗(yàn)證
smtpd_sasl_auth_enable參數(shù)決定postfix smtp server是否支持sasl驗(yàn)證:
smtpd_sasl_auth_enable = yes
有些老的mua沒有完全遵守smtp驗(yàn)證協(xié)議。依照規(guī)范說明書的標(biāo)準(zhǔn)規(guī)定,當(dāng)smtp client送出ehlo命令之后,smt server應(yīng)該要列出其驗(yàn)證機(jī)制支持列表,而且此列表是出現(xiàn)在關(guān)鍵字auth與一個(gè)空格之后。
不過,有些mua卻期待收到auth與一個(gè)等號;
postfix容許你接受這種不遵守規(guī)定的行為:
broken_sasl_auth_clients = yes
設(shè)定此參數(shù)之后,postfix會分別以標(biāo)準(zhǔn)與非標(biāo)準(zhǔn)兩種格式來列出它所支持的smtp驗(yàn)證機(jī)制。
由于兩種格式都出現(xiàn)在smtp server的響應(yīng)中,所以既不會影響標(biāo)準(zhǔn)的mua,同時(shí)又能讓那些不標(biāo)準(zhǔn)的mua使用smtp sasl驗(yàn)證。
避免寄件人冒名
當(dāng)客戶端通過postfix寄信時(shí),要如何確定客戶端使用的真實(shí)的寄件人地址?比方說,某人以A身份通過smtp驗(yàn)證,但是卻以B為發(fā)行人地址,要如何避 免這種冒名情況?postfix容許你設(shè)定寄件地址與sasl登錄身份的對應(yīng)關(guān)系。舉例來說,假設(shè)某人的郵件地址是kdent@example.com, 其sasl登錄身份為kdent,如果你希望kdent只能以該地址的名義來發(fā)郵件,而不能使用其他寄件地址,你應(yīng)該將下列對應(yīng)關(guān)系定義在一個(gè)查詢表中:
kdent@example.com kdent
這是一個(gè)普通的postfix查詢表,你可以逐一列出每一個(gè)地址與每一位sasl用戶的對應(yīng)關(guān)系,也可以使用正則表達(dá)式來表示郵件地址的人名部分或網(wǎng)域部分。制作好查詢表之后,請將main.cf的smtpd_sender_login_maps參數(shù)指向此表:
smtpd_sender_login_maps = hash:/etc/postfxi/sasl_senders
下一步是將reject_sender_login_mismatch限制條件納入某個(gè)smtpd_*_restrictions過濾規(guī)則組合里,這樣一 來,如果kdent通過sasl驗(yàn)證,但是他卻試圖以mary@example.com的名義寄出郵件,那么postfix將拒絕幫他寄信。
核準(zhǔn)授權(quán)用戶
如果你的ube過濾規(guī)則里包含了smtpd_recipient_restrictions,你得使postfix準(zhǔn)許通過驗(yàn)證得用戶使用轉(zhuǎn)發(fā)服務(wù),也就是將permit_sasl_authenticated安插在限制條件里得適當(dāng)位置。
設(shè)定驗(yàn)證機(jī)制
當(dāng)客戶端聯(lián)機(jī)到smtp server時(shí),有哪些密碼驗(yàn)證機(jī)制可使用,由smtpd_sasl_security_options參數(shù)決定。完整得機(jī)制選項(xiàng),取決于你得系統(tǒng)上有哪 些機(jī)制可用以及你得sasl函數(shù)庫支持哪些機(jī)制。如果不指定任何選項(xiàng),默認(rèn)值是接受包括明文密碼在內(nèi)得所有可用機(jī)制,但匿名登錄除外。如果使用了 saslauthd daemon,就必須接受明文密碼,所以,默認(rèn)值的設(shè)想是合情合理的。如果你指定了任何選項(xiàng),則默認(rèn)值無效,所以你的選項(xiàng)里必須包含 noanonymous。例如:
smtpd_asal_security_options = noanonymous, noplaintext
#p#
以下是通用的機(jī)制選項(xiàng):
noplaintext
此選項(xiàng)將plaintext密碼驗(yàn)證排除在外。這使得sasl選項(xiàng)challenge/response技術(shù)來使用。如果你的安全政策不容許密碼以明文形 式流經(jīng)網(wǎng)絡(luò),那就指定noplaintext選項(xiàng)吧,但是這也表示你不能使用saslauthd。
noactive
此選項(xiàng)將可能遭受“主動攻擊”的密碼機(jī)制排除在外。在“主動攻擊”中,攻擊者想辦法將他們安插到client與server之間,所以,某些類型的主動攻 擊又被稱為"中間人攻擊“。攻擊者可以讀取或改變數(shù)據(jù),讓client或server誤以為數(shù)據(jù)真的是對方送過來的。
nodictionary
此選項(xiàng)將可能遭受”字典攻擊“的密碼機(jī)制排除在外。在”字典攻擊“中,攻擊者使用預(yù)編的密碼數(shù)據(jù)庫,逐一測試哪個(gè)密碼”恰好“能闖入你的系統(tǒng)。這類密碼數(shù) 據(jù)庫通常由城市、團(tuán)隊(duì)、寵物、常見人名、字典詞匯,加上各種明顯的詞匯變化等組成,所以稱為”字典攻擊“。
noanonymous
排除匿名登錄。smtp驗(yàn)證的最主要目的,就是要確認(rèn)用戶的身份,所以”匿名登錄“對smtp server是沒有意義的。postfix的默認(rèn)行為是禁止匿名登錄。如果你指定了其他選項(xiàng),你必須明確設(shè)定noanonymous。
mutual auth
要求使用互證機(jī)制--client與server雙方都要提供證明自己身份的證據(jù)。
設(shè)定步驟匯整
在postfix系統(tǒng)中添加sasl功能所涉及的步驟有點(diǎn)繁復(fù)??偨Y(jié)本章前述的知識,以下是我們整理出來的設(shè)定步驟:
1、決定你打算支持的驗(yàn)證機(jī)制與架構(gòu)。
2、安裝sasl函數(shù)庫,并重新編譯postfix,使其包含sasl。或者取得已經(jīng)內(nèi)含sasl的postfix包,以及相關(guān)的sasl驗(yàn)證機(jī)制。
3、重新安裝postfix
4、創(chuàng)建/usr/local/lib/sasl2/smtpd.conf配置文件,將pwcheck_method參數(shù)設(shè)定為saslauthd(如果使用sasl saslauthd與系統(tǒng)密碼的話)或auxprop(如果使用sasl的專屬密碼文件的話)。
5、如果你選擇的驗(yàn)證架構(gòu)是unix系統(tǒng)密碼,請啟動saslauthd daemon,并且指出你的系統(tǒng)所用的驗(yàn)證方式;否則,使用saslpasswd2命令在你的系統(tǒng)上創(chuàng)建smtp client的賬戶與密碼。
6、編輯main.cf,啟動sasl驗(yàn)證功能,并指出驗(yàn)證方式?;镜脑O(shè)定至少需要下列兩項(xiàng)參數(shù):
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authicated, reject_unauth destination
7、重新加載postfix,使我們在main.cf配置文件所做的改變生效:
postfix reload
測試sasl驗(yàn)證配置
經(jīng)過重重難關(guān)之后完成安裝,要如何要確定所有步驟都沒有出錯(cuò),證明postfix確實(shí)真的已依照我們的要求來進(jìn)行驗(yàn)證?等到用戶旅行到外地了以后,看看他 們會不會打長途電話回來抱怨,肯定不是好辦法。最好的辦法,是直接觀察smtp server的交互情況,實(shí)際體驗(yàn)驗(yàn)證過程,并立刻查閱日志文件留下的線索。
要想聯(lián)機(jī)到smtp server,最容易的方法是使用telnet工具程序,然后與服務(wù)器進(jìn)程smtp對話。最容易測試的plain機(jī)制,如果你禁用這項(xiàng)機(jī)制,建議你暫時(shí)先啟用它,等完成測試實(shí)驗(yàn)之后再關(guān)掉它。
先讓我們了解plain機(jī)制的細(xì)節(jié),然后再開始動手做實(shí)驗(yàn)。plain機(jī)制要求你在auth命令之后提供一個(gè)身份標(biāo)識串,此字符串編碼成base64格 式。構(gòu)成此字符串的各項(xiàng)數(shù)據(jù)的次序是“登錄身份”,其后跟著一個(gè)null字符,然后是“密碼擁有者的身份”,再跟一個(gè)null字符,最后是“密碼”本身。 通常,“登錄身份”與“密碼擁有者的身份”是相同的。舉例來說,假設(shè)用戶kdnet的密碼為rumpelstiltskin,而且其登錄身份與密碼擁有者 身份相同,那么,他的身份標(biāo)識符串是“kdent\okdent\orumpelistiltskin”(編碼前的格式)。
麻煩之處,在于如何將標(biāo)識符串編碼成base64格式且不包含字符串末端的CR字符。如果你的系統(tǒng)上有mmcncode與printf命令,這步驟應(yīng)該不 難。printf命令能顯出指定格式的字符串,但是不會像echo之類的命令那樣,自動在字符串末端補(bǔ)一個(gè)換行字符。mmencode命令能將輸入字符串 編碼成各種mime格式,且其默認(rèn)格式正好是我們所需要的base64。
所以,我們可用下列命令來產(chǎn)生base64格式的標(biāo)識符串:
printf 'kdent\0kdent\0rumpelstiltskin' | mmencode
某些系統(tǒng)平臺的printf可能不能正確地處理字符串中間地null字符(\0),要想知道自己系統(tǒng)上地printf有沒有這個(gè)毛病,只要看base64編碼結(jié)果是否比原字符串短。如果你地printf有問題,不妨使用echo -n來代替printf。
smtp客戶端驗(yàn)證
本章前半段地討論,著重于postfix如何扮演smtp驗(yàn)證地服務(wù)器端角色--驗(yàn)證遠(yuǎn)程mua或mta地身份,借此判斷對方是否有權(quán)使用轉(zhuǎn)發(fā)服務(wù)。現(xiàn) 在,我們要換個(gè)角度,討論postfix如何扮演客戶端角色--提出自己地身份證明,借此獲得遠(yuǎn)程mta地轉(zhuǎn)發(fā)服務(wù)地使用權(quán)。
首先,你得提供一個(gè)密碼文件給postfix,其中包含能通過遠(yuǎn)程服務(wù)器得證書數(shù)據(jù)。此密碼文件得每一筆記錄,各包含一個(gè)代表遠(yuǎn)程服務(wù)器的網(wǎng)域以及一組能通過該服務(wù)器驗(yàn)證的賬戶與密碼,格式如下:
destination username:password
當(dāng)postfix要寄出一封郵件時(shí),它先檢查收件地址的網(wǎng)域部分,如果不能在密碼文件中找到完全相符的destination,再尋找打算聯(lián)機(jī)的主機(jī)名 稱。這種檢查過程使得postfix可以輕易連接共享相同賬戶數(shù)據(jù)庫的多個(gè)mx主機(jī)。決定密碼文件位置的參數(shù)是 smtp_sasl_password_maps。
決定客戶端行為的是smtp_sasl_security_options參數(shù),其設(shè)定方法與服務(wù)器端的smtpd_sasl_security_options參數(shù)相同,所以不再贅述。如果你沒指定任何選項(xiàng),則默認(rèn)行為是容許系統(tǒng)上所有能找到的機(jī)制,唯獨(dú)匿名登錄除外。
smtp客戶端驗(yàn)證的設(shè)定過程
讓我們舉個(gè)例子來示范要如何設(shè)定postfix,才能使其在通過遠(yuǎn)程系統(tǒng)轉(zhuǎn)發(fā)郵件時(shí),提出自己的身份證明。在這個(gè)例子中,假設(shè)我們有一組可以通過ora.com網(wǎng)域的所有服務(wù)器主機(jī)的賬戶以及一組可以通過mail.postfix.org主機(jī)的賬戶。
1、創(chuàng)建/etc/postfix/sasl_passwd密碼文件,并填入我們擁有的賬戶與密碼,例如:
ora.com kdent:rumpelstiltskin
mail.postfix.org kyle:quixote
2、使用postmap產(chǎn)生數(shù)據(jù)庫文件:
postmap /etc/postfix/sasl_passwd
3、編輯main.cf配置文件,啟動客戶端驗(yàn)證功能。請注意,這次要設(shè)定的參數(shù)是smtp_sasl_auth_enable,而不是 smtpd_sasl_auth_enable(后者用于啟動服務(wù)器端驗(yàn)證)。接著,在smtp_sasl_password_maps參數(shù)中指出密碼文 件的位置:
smtp_asal_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
4、重新加載postfix,使我們所做的改變生效:
postfix reload
現(xiàn)在,每當(dāng)postfix smtp client試圖通過/etc/postfix/sasl_passwd所列的任何網(wǎng)域或主機(jī)來轉(zhuǎn)發(fā)郵件時(shí),它就會提供對應(yīng)的驗(yàn)證書籍。比方說,如果你的 postfix smtp client聯(lián)機(jī)到mail.ora.com服務(wù)器,則它會使用kden與rumpelstiltskin這組賬戶與密碼。
通過文章的介紹,我們知道把Postfix sasl身份驗(yàn)證機(jī)制會好,那以后就不用發(fā)愁郵件的安全性了。
【編輯推薦】
- Postfix利用擋信機(jī)制來消除垃圾郵件的隱患
- Postfix郵件轉(zhuǎn)發(fā)詳解
- Postfix虛擬網(wǎng)絡(luò)域名
- Postfix里的POP與Imap介紹
- Postfix中的地址操作大全
- 使用 Kerberos 進(jìn)行 SharePoint 身份驗(yàn)證
- 修改SQL Server身份驗(yàn)證模式的方法
- IIS服務(wù)中五種身份驗(yàn)證的靈活運(yùn)用