This page is use UTF-8 encoding. If you cann't see the page contents, Please change the Character Encoding to UTF-8 .

Contents

  1. 如何看此文ç«
  2. Virtual Mail Box
    1. 重申 Virtual Mail Box 的定義
    2. 使用 Dovecot 來提供 Virtual Mail Box 服務
  3. Dovecot 下的 auth_userdb 和 auth_passdb
    1. 使用 static 來設定 auth_userdb
      1. static 的模式簡介
    2. 設定使用 static 的 userdb
      1. 在 file:///etc/dovecot.conf 中修已 auth_userdb
      2. 建立 file:///var/spool/vmail/samba.hk/frankie 檔案目錄
      3. 使用電郵客戶端 MUA 來連接 Dovecot
    3. auth_user 和 auth_passdb 的關聯
    4. 設定 auth_passdb
      1. 設定 auth_passdb 的參數
      2. 建立 file:///etc/passdb.dovcot 檔案
      3. file:///etc/passdb.dovcot 的檔案格式
      4. 進行測試
        1. 使用 telnet 來檢查你的 dovecot imapd 伺服器
        2. 還原 auth_userdb 設定
        3. 再次使用 telnet 來測試我們的設定
        4. 在 maillog 中找尋原å›
    5. 再談 auth_passdb 和 auth_userdb 的關係
      1. 使用者資料庫的查詢 auth_userdb 及帶來的影響
      2. 使用認証的不同設定及帶來的影響
        1. 找不到使用者的錯誤
  4. Dovecot 的 Virtual Mail Box 的設定
    1. 分別不同使用者使用不同的電郵信箱
  5. Dovecot 的 Virtual Mail box 在管理上的小貼士

如何看此文ç«

這是一篇十分長的文章。如果你不想看太理念的東西,你可以先跳到以下章節,然後再看回其它的篇幅。

http://wiki.openworkshop.org/wiki/Email/DovecotVirtualMailBox#head-754b041b3a19c7a6f8592a390b8685c422433d86

Virtual Mail Box

其實早前在 OpenWorkShop 的 Wiki 下也曾討論過有關 Virtual Mail Box 的事情,請參考以下的文章

* Email/PostfixVirtualMailBox

但是那時卻沒有介紹過 imapd 伺服器下的 Virtual Mail Box 的方案,主要原因是如果要在不提資料庫查詢下要 Courier-IMAP 能做到 Virtual Mail Box ,是可以有一個叫做 userdb 的方案的。但是這方案像是另一套使用者的帳號資料如︰ file:///etc/passwd 等。自己不喜歡它的劃蛇添足的味道,而且它有自己一套不同的管理方法和理念;加上有多少人會喜歡使用它,也是一個問題,所以沒有在 OpenWorkShop 中提及它。

但是為何舊事重提?主要原因是在 Dovecot 下,這問題變得簡單了很多。而且很有不同的品味所以在這裡希望使用 Dovecot 解決這個還未回答的問題。

重申 Virtual Mail Box 的定義

我想在這裡再一次定義 Virtual Mail Box ,其實這是指電郵伺服器提供電郵服務給 沒有系統帳號的使用者。如果你想了解更多;可以先看看 Email/PostfixVirtualMailBox ,這裡不重複了。

使用 Dovecot 來提供 Virtual Mail Box 服務

要 Dovecot 提供 Virtual Mail Box 的服務的話,主要有兩方面的工作你要處理的,(其實你希望 Dovecot 提供任何服務給使用者,你也需要處理這方面的事情。只是很多時因為使用者是系統使用者,所以你可以輕易地使用 PAM 來滿足這方面的要求。但是在 Virtual Mail Box 的設定下,卻特顯了這方面的需要。

Dovecot 下的 auth_userdb 和 auth_passdb

要做好使用者認証和使用者資料查詢的工作, Dovecot 下就有這兩個參數你要留意的。 auth_userdb 是用來提供使用者資料的,而 auth_passdb 是用來提供使用者認証的密碼和對應的使用者登入名稱。

使用 static 來設定 auth_userdb

我想在設定 Dovecot 下的 Virtual Mail Box ,你可以先來設定 auth_userdb ,因為你可以收到一個很有趣的結果。而且 auth_userdb 也會定義好使用者如何存放他的郵件。

在這裡會使用 static 的模式來做,這也是我在 Dovecot 下設定 Virtual Mail Box 時最喜歡使用的模式。

static 的模式簡介

static 在 Dovecot 來說,就是使用相同的系統使用者帳號和系統群組來管理整套的電郵系統。但是電郵的存放 Mail Storage 因為不同的電郵帳號而有所不同。我想這是電郵系統管理者最容易管理的模式!

static 的妙處,就是在於如果把電郵帳號和電郵 Mail Storage 作一個巧妙的配對,而這個配對是不需要在資料庫中作出查詢的。(減輕查詢資料庫的壓力,增加系統的反應時間。)

設定使用 static 的 userdb

好了讓我們一步一步來做一些 lab 吧。

在 file:///etc/dovecot.conf 中修已 auth_userdb

好了在我們的 Dovecot 中修改這一行的設定︰

auth_userdb = static uid=65533 gid=65533    
    home=/var/spool/vmail/samba.hk/frankie

以上是一行的,不要把它寫作兩行,不然在你起動 dovecot 時就會得到這樣的錯誤信息。

Starting Dovecot Imap: Fatal: Error in configuration file /etc/dovecot.conf line 384: Missing value

建立 file:///var/spool/vmail/samba.hk/frankie 檔案目錄

# mkdir /var/spool/vmail/samba.hk/frankie
# chown 65533:65533 -R /var/spool/vmail

你要記得一事就是電郵接收伺服器,它的功能只是負責提取信件給使用者,而本身不會發送郵件的,所以這不保證設定好後,你會在你的電郵信箱內找到郵件。但是你卻可以在運作過程中發現 Dovecot 運行時所做的工作。

使用電郵客戶端 MUA 來連接 Dovecot

好了,你可以使用任何電郵客戶端,使用系統內任何一個使用者帳號登人你的電郵接收伺服器 Dovecot ,當然是不會有任何郵件產生的。

這是離開你的 Dovecot ,再看看你的 file:///var/spool/vmail/samba.hk/frankie ,在這檔案下 Dovecot 產生了 Maildir/ ,這是你可以回想一下你是使用什麼帳號登入的,我是使用 guest 帳號登入的。而不是使用 frankie 登入的,為何 Dovecot 會到這個檔案目錄下建立 Maildir/ ,這是請你在 file:///var/spool/vmail/samba.hk/frankie/Maildir/new/ 下建立一檔案名為 test.email 的,而內容如下︰

From: guest
To: root
Subject: test vmail

test.

再使用 root 帳號登入,你可以發現 root 的使用者可以在他的信箱中發現了 guest 所留下的信件。而當 root 看過這信件後,就會消失了 file:///var/spool/vmail/samba.hk/frankie/Maildir/new/test.email ,而多了 file:///var/spool/vmail/samba.hk/frankie/Maildir/cur/test.email:2,S

auth_user 和 auth_passdb 的關聯

要了解這個有趣的現象,你要知道一件事;就是什麼是 auth_user 而另一方面什麼是 auth_passdb ,而且當中的關係又是什麼?

設定 auth_passdb

這我們再做多另一個有趣的 lab 之後我們再來討論 auth_user 和 auth_passdb 的關聯問題。

設定 auth_passdb 的參數

這是我們要修改 auth_passdb 的參數如下︰

auth_passdb = passwd-file /etc/passdb.dovecot

這是指使用密碼檔案來作為認証,而且認証檔案是可以自由定義的,這裡定義這個檔案名稱為 file:///etc/passdb.dovecot

建立 file:///etc/passdb.dovcot 檔案

另外我們要建立 file:///etc/passdb.dovcot 檔案。我們如果有安裝 apache 的套件,我們可以使用 htpasswd 指令來建立它。

# htpasswd -c /etc/passdb.dovecot frankie
New password:
Re-type new password:
Adding password for user frankie
#

file:///etc/passdb.dovcot 的檔案格式

這裡使用 cat 的指令來檢查它的格式。

# cat /etc/passdb.dovecot
frankie:OZTNMsD3VwHoM
#

你可以看見這格式是十分簡單的,只有使用者名稱和帳號密碼!而密碼是使用 crypt 來加密的。另外這個密碼檔案是可以有不同的格式的,在這裡暫時略過。)

進行測試

好了現在我們要重新起動 dovecot ,及進行測試。

# service dovecot restart
Stopping Dovecot Imap:                                     [  OK  ]
Starting Dovecot Imap:                                     [  OK  ]

使用 telnet 來檢查你的 dovecot imapd 伺服器

當從新起動 dovecot 後,你可以使用 telnet 來作出檢查你的 dovecot 伺服器。

# telnet 127.0.0.1 imap2
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
* OK dovecot ready.
. login frankie 123456
. OK Logged in.
. logout
* BYE Logging out
. OK Logout completed.
Connection closed by foreign host.

這裡你鍵下了

. login frankie 123456

意義是說使用 frankie 帳號登入,而密碼是使用 123456 。 而你發覺你可以順利登入的,而 frankie 並不是你系統的使用者,而密碼也不是系統密碼。

. logout

意義是說 logout 你的電郵伺服器。

# telnet 127.0.0.1 imap2
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
* OK dovecot ready.
. login guest password
. NO Authentication failed.
. logout
* BYE Logging out
. OK Logout completed.
Connection closed by foreign host.
#

這裡你發覺你是無法使用 guest 來進行登的,但是 guest 是你的系統使用者。

還原 auth_userdb 設定

好了為了實驗的完整性,我們把 auth_userdb 的設定還原到起始的設定。

auth_userdb = passwd

另外我們也加上這個參數。

auth_verbose = yes

這會把一些有關認証的資料記起來的。

再次使用 telnet 來測試我們的設定

這是我們可以再次重新起動 dovecot ,然後再次使用 guest 和 frankie 帳號作登入。但是你會發現 guest 和 frankie 都無法登入 dovecot 系統。但是如果你使用 frankie 帳號來作測試的話,你可以發現這樣的錯誤信息。

# telnet 127.0.0.1 imap2
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
* OK dovecot ready.
. login frankie 123456
. OK Logged in.
* BYE Internal login failure.
Connection closed by foreign host.
#

在 maillog 中找尋原å›

當你檢查 file:///var/log/maillog 的時候,你可得到這樣的錯誤信息。

dovecot-auth: passwd(frankie): unknown user
imap-login: Internal login failure: frankie [127.0.0.1]

這時你可以發現 frankie 是可以通過認証,但是 dovecot-auth 還是無法在 file:///etc/passwd 中無法找到 frankie 使用者的資料,所以 frankie 就成為一個 unknown user 了。

再談 auth_passdb 和 auth_userdb 的關係

這時讓我們重溫 auth_passdb 和 auth_userdb 的關係。

使用者資料庫的查詢 auth_userdb 及帶來的影響

當我們只設定

auth_userdb = static uid=65533 gid=65533    
     home=/var/spool/vmail/samba.hk/frankie

時,我們的 guest 和 root 帳號,都同時登入到 file:///var/spool/vmail/samba.hk/frankie 下的 Maildir/ 。

因為這時我們所有在 dovecot 下的帳號,他們的 uid 和 gid 都是 65533 ,而他們的家目錄都是 file:///var/spool/vmail/samba.hk/frankie ,所以我們的 guest 和 root 查詢電郵的時候都是到相同的目錄下。而且對作業系統來說,他們都是相同的 uid 和 gid 。

使用認証的不同設定及帶來的影響

另外如果我們也設定了

auth_passdb = passwd-file /etc/passdb.dovecot

後,就只有 frankie 的帳號能登入使用 dovecot 伺服器。因為在 file:///etc/passdb.dovecot 下只有 frankie 這個登入名稱和對應的密碼,雖然他不是在作業系統下的使用者,但是他卻可以登入 dovecot 。因為他可以通過認証,而 dovecot 下也知道他的 uid , gid 和 home 在那裡。(透過 static 模式來提供。)所以 frankie 就可以順利地提取信件了。

但是對你修過 auth_userdb 回先前的設定值,而查詢 file:///etc/passwd 後, frankie 因為不是作業系統的使用者,所以他不能順利提取電郵。

另一方面 guest 雖然是作業系統的使用者,可以在 file:///etc/passwd 中找到他,但是卻因為無法在 file:///etc/passdb.dovecot 下找到 guest 的登入帳號和對應的密碼,所以他仍是無法登入的。

找不到使用者的錯誤

但是如果你有仔細地留意,你會再發現一件事,就是在這情況下 guest 和 frankie 所收來的錯誤信息是不一樣的。( guest 所得的錯誤信息是認証錯誤,而 frankie 所得的錯誤信息是他仍可完成認証,但是 imap-login 卻產生內部錯誤 --- 找不到使用者。

原因是在 dovecot 的使用者認証過程是先認証使用者提交的登入名稱和登入密碼。後再找使用者帳號資料。

因為 guest 無法通過認証。(因在 file:///etc/passdb.dovecot 下沒有他的記錄,所以他所得的錯誤信息就是認証錯誤。)

而 frankie 因為可以通過認証,但是 file:///etc/passwd 下卻沒有他的帳號資料,因此他所得的錯誤就是 imap-login 的內部錯誤。

Dovecot 的 Virtual Mail Box 的設定

寫了一大堆還未寫入正題,也是我寫技術文件少見的。但是這卻是在 Unix 認証下一些很基本的理念,這也是 PAM 的理念。難得在 Dovecot 的設定下可以把這理念好好地說一次!所以寫得比較長。但是仍希望網友不要認為我太長氣就好了!

但是還是要寫入正題了。其實當時你的 frankie 就是一個電郵系統使用者,而它卻不是作業系統下的使用者,符合了我們所說的 Virtual Mail Box 的定義了。

分別不同使用者使用不同的電郵信箱

但是我們還是有一個問題就是不可能所有的電郵使用者都是使用相同的電郵信箱,那我們怎樣來分別不同的使用者的電郵信箱。

其實這方面你只要使用一些 marco 就可以達到分別不同使用者使用不同電郵信箱了。你可以看看以下的設定。

auth_userdb = static uid=65533 gid=65533   
     home=/var/spool/vmail/%d/%n

%d

是電郵使用者的 domain 部分

%n

這是電郵使用者的 local_part 部分,這是電郵地址中沒有了 domain 的部份

其它不同的 marco 的意義,就請你參考 file:///etc/dovecot.conf 內的內容了。

例如︰

這樣不同的使用者就會有不同的電郵信箱。

當然你還要設定 auth_passdb 。

auth_passdb = passwd-file /etc/passdb.dovecot

另外你可以使用 htpasswd 來管理這個檔案 file:///etc/passdb.dovecot 了。 另外你也可以新增 frankie@samba.hk 和 winnie@samba.hk 到這個檔案內。

# htpasswd /etc/passdb.dovecot frankie@samba.hk
New password:
Re-type new password:
Adding password for user frankie@samba.hk
# htpasswd /etc/passdb.dovecot winnie@samba.hk
New password:
Re-type new password:
Adding password for user winnie@samba.hk
#

這樣就可以使用 frankie@samba.hk 和 winnie@samba.hk 的帳號來使用 dovecot 的接收伺服器了。

Dovecot 的 Virtual Mail box 在管理上的小貼士

在這裡你可能留意一事,就是 Dovecot 在管理 Mail Storage 上,是可以自行建立 Maildir/ 的是有一個限制,就是它只能建立一層的檔案目錄,因此你可以照以下的小貼士來設定 Dovecot ,看看是否在管理上更暢順。

default_mail_env = maildir:~/

這是表示你電郵帳號下的使用者,都是以自己的家目錄作 Maildir/ ,而不會在家目錄下再開始一個新檔案目錄叫作 Maildir/ 加以另外使用。


ChineseSupport

ChineseSupport/DovecotVirtualMailBox (last edited 2005-03-27 23:44:36 by FrankieChow)