OSWikiHK: 請協力 GPLv3 的中文翻譯工作。
Authenticate IMAP server via SASL
OSWikiHK,自由中文開源知識庫
本文源自Frankie ITSolutions Frankie Chow 的 SASL rimap Module。
其實我們喜歡攪網絡服務的系統管理者,都常有一個毛病就是常喜歡使用一些高深的技巧來表現自己是過中的高手,但是我們卻很多時候忽略了一個問題;就是使用這些技術其實背後也要付出一定的代價,例如︰更多的死點等,更多的管理技術等。其實當我們為我們的客戶服務的時候也要緊記︰
- 我們公司所建立的系統必須達致容易管理的目標。
這方面其實也說明了一件事實––就是不要使用過多的高深技巧。但是一些有用而巧妙的技術我們卻十分欣賞,其中就有這樣的 SASL 認証技術。
目录 |
SASL 認証與遠端 IMAP 伺服器
嚴格來說,這並不是和 Postfix 有關的題目,但是卻和 SASL 認証有關。而且我想你還會記得 SASL 認証是 Postfix 下的 SMTP Auth 認証的基本方式。(其實可以說不是基本方法,而可以說是現在唯一的方式。
SASL 認証簡介
另外這一篇文章亦是 SASL 認証中的一篇進階文章。 所以不如在這裡讓我們也來簡單地介紹一下 SASL 認証!這也是昨天晚上學生問我的問題。
SASL 和 SASL 模組
首先我們要了解在 Unix 世界下認証是怎樣的一回事! 我想你還是記得以下的文章 url 這裡講到 auth_userdb 和 auth_passdb 這兩個基本的觀念。
- auth_passdb
- 這是負責認証的工作。(其實它只會回傳真和否這兩個值,也是說使用者的名稱和所使用的密碼有否被系統所登記。當然有登記的話,就會傳回「真」的值的,如沒有即傳回「否」的值。)
- auth_userdb
- 這是負責把使用者的資料傳回的,例如使用者的家目錄和使用 uid 和 gid 等。
其實在 SASL 的認証工作上,它只負責 auth_passdb 類型的工作,而不負責 auth_userdb 類型的工作。
但是登記使用者登入名稱和密碼的,卻有不同的機制。 (在Frankie ITSolutions中已介紹過了 sasldb 和 pam 的認証模組。 其實除了這兩種機制外,還可以和不同認証伺服器溝通如 Kerberos 、OTP .... 等,也有把一些認証資料放到數據庫(Database)下,如 MySQL , PostgreSQL 和 sqlite 等。)
其實還有一個十分有趣,而又易用的機制。這就是使用遠端 imapd 伺服器作認証基制。
使用遠端 imapd 伺服器作認証基制的好處
其實它的好處真是不言而喻的。因為在這情況下你會發現你永遠投寄電郵時所使用的 smtpd auth 的密碼和你登入IMAP伺服器認証都是一樣的, 這其實也是微軟在 Outlook 下的預設設定。
這就是如果你的接收伺服器和外寄伺服器時使用相同的密碼, 你會更容易設定 Outlook 和 IE 等客戶端電郵程式。
還有如果你的IMAP伺服器是使用虛擬使用者的方法來管理的話, 你會發覺一在 smtpd auth 上也會以在差不多不作任何設定下進行認証的工作。 為什麼這樣說,因為你的接收伺服器可以和不同的 SQL 對談, 或者和 LDAP 認証的,但是無論你怎樣設定你的接收伺服器, 你也可以使用相同的方法來設定 smtpd ,這是 rimap 認証模組中最好的地方。
另一個有趣的地方,你是可以嘗試用程式來扮演一個IMAP伺服器的回應,、 來程式化 SASL 認証的結果。例如︰下面就是一個用 python 寫的一個簡單程式。 來回應 SASL rimap 模組請求的一個簡單程式。
這是一個簡單的 python 程式:
#!/usr/bin/python
import socket
HOST = '' # Symbolic name meaning the local host
PORT = 143 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
conn.send('* OK [PythonRIMAP]\n')
print 'Connected by', addr
data = conn.recv(1024)
print "Data received:",data
conn.send('saslauthd OK LOGIN Ok.\n')
s.close()
註︰ 以上只是一個供測試的程式,當你作任何的認証,輸入任何的使用者名字和密碼都會認証成功的。
當然這也有不好的地方,這是會加重IMAP伺服器的工作。而且 SASL 的 rimap 模組和 imapd 伺服溝通上是不能使用 SSL 作加密認証的。
但是這樣的工作量其實也不算太多的,比起使用者使用IMAP伺服器來說它可以說是一個很輕微的工作量。
以手動方式起動 saslauthd 使用 rimap 模組
其實你可以先以手動方式起動 saslauthd 伺服器及使用 rimap 模組的,然後進行測試。
起動方式:
# saslauthd -a rimap -O 127.0.0.1
這樣就可以起動 saslauthd ,而當我們設定認証模組的時候, 我們會用上 -a 的參數。 另外在我們使用 rimap 這認証模組的時候, 我們還需要告訴它,你使用來作認証伺服器的 imapd 伺服的網絡地址, 這裡的網絡地址為 127.0.0.1 。 另外在你連接 imapd 伺服器的時候,預設連接埠是 tcp 143 。 如果你有興趣修改它的連接埠地址就需要在 source core 下進行修改, 及再重新編譯。其實不會太難的,不過這裡暫且按下不提了。
測試
如果你要進行測試的話,你也一樣可以使用 testsaslauth 來進行。執行 testsaslauthd 的方式來進行測試:
# testsaslauthd -u frankie -p 123456 0: OK "Success." #
如果你看見如上的訊息的話,即表示你認証成功了。
在Debian下起動 saslauthd 使用 rimap
如果你希望要在Debian下起動 saslauthd 而使用 rimap 的話,你就需要修改 /etc/default/saslauthd 檔案,內容如下︰
START=yes PARAMS="-O localhost" MECHANISMS="rimap"
這樣就可以在執行:
# /etc/init.d/saslauthd restart
起動 saslauthd 伺服器,而使用 rimap 的認証模組了。
限制
但是這認証模組有一個重要的特點,這特點就是不能同一時間支援多網域名稱,可能在現今時刻是一個很重要的缺陷吧。
如果你真的進行 debug 模式的測試::
# saslauthd -d -O 127.0.0.1 -a rimap ... saslauthd[14895] :do_auth : auth failure: [user=frankie] [service=smtp] [realm=godclick.net] [mech=rimap] [reason=remote server rejected your credentials]
你會發現在電郵客戶端傳來的網域的資料信息,會被看作是 realm 的資料。 因此真正傳到IMAP伺服器的資料只有使用者的名稱, 因此在認証上並不能同一時間支援多網域名稱。也就是說在電郵帳號上只能有一個 frankie , 而不能同時有 frankie@godclick.net 和 frankie@samba.hk 的存在。

