在郵件系統中使用虛擬用戶後,需要考慮如何處理郵件 服務器 所在主機的本地用戶和郵件服務器自身的虛擬用戶之間的關系。 1、分析本地用戶和虛擬用戶對郵件的 需求 情況 本地用戶可以分為兩類。一是系統用戶,比如bin、daemon、mail、news、postmaster等等。
在郵件系統中使用虛擬用戶後,需要考慮如何處理郵件
服務器所在主機的本地用戶和郵件服務器自身的虛擬用戶之間的關系。
1、分析本地用戶和虛擬用戶對郵件的需求情況 本地用戶可以分為兩類。一是系統用戶,比如bin、daemon、mail、news、postmaster等等。另一類是普通用戶。
這兩類用戶對郵件的需求是不一樣的。系統用戶一般是接收來自程序的錯誤或日志等信息的郵件。由於系統用戶沒有自身的郵箱,通常是通過系統的別名表將郵件轉發到一個管理員賬號上。一般情況下這個管理員賬號是本地上的一個用戶賬號,如root、serial0。普通用戶可能有兩種的郵件需求,能夠在本地發送或是閱讀郵件,也能夠在其他計算機上使用郵件客戶端利用郵件主機上的smtp/imap/pop服務進行郵件收發。
虛擬用戶的郵件需求,就是通過smtp/imap/pop進行郵件收發,不會涉及在本地的發送閱讀問題。
2、本地用戶和虛擬用戶關系主要有兩個問題 第一、用戶身份驗證問題。本地用戶和虛擬用戶的用戶信息保存位置不同。郵件主機的本地用戶信息保存在/etc/passwd中,而虛擬用戶信息則保存在
數據庫文件、數據庫服務器或目錄服務器等。在進行口令驗證時(SMTP/IMAP/POP驗證),如何從兩個不同的位置取得用戶名和口令這是一個問題;第二、本地用戶和虛擬用戶的郵件路由問題,即本地用戶和虛擬用戶的郵件投遞問題。
下面分別討論這兩個問題。這裡的實驗環境是:postfix+courier-imap+cyrus-sasl+pam-
mysql+mysl,虛擬用戶信息保存在mysql中。
3、用戶身份驗證問題: 3.1、smtp口令驗證:
使用cyrus-sasl的saslauthd進行SMTP口令驗證。saslauthd支持在一次驗證中使用多種驗證機制。針對本地用戶,使用shadow驗證機制對/etc/shadow進行驗證。針對虛擬用戶,使用pam驗證機制,由pam-mysql完成對mysql中虛擬用戶信息的驗證。
在/etc/init.d/saslauthd啟動腳本中,默認使用了shadow機制:
[root@hpe45 sysconfig]# more /etc/init.d/saslauthd
...
MECH=shadow
FLAGS=
if [ -f /etc/sysconfig/saslauthd ] ; then
. /etc/sysconfig/saslauthd
fi
...
在/etc/sysconfig/saslauthd中加入pam機制:
[root@hpe45 sysconfig]# more /etc/sysconfig/saslauthd
MECH=pam
在/usr/lib/sasl2/smtpd.conf中指明smtp驗證使用saslauthd:
[root@hpe45 sysconfig]# more /usr/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login
在postfix中打開smtp驗證參數即可。
3.2、IMAP/POP身份驗證問題
IMAP/pop驗證除了驗證用戶和密碼外,一般還會涉及到用戶目錄和郵箱路徑的取得,特別是虛擬用戶。courier-imap的authdaemon支持一次驗證中使用多處用戶信息。對虛擬用戶,使用authmysq
lrc,對mysql中的用戶信息驗證。對本地用戶,使用pam對/etc/passwd進行驗證。
在/usr/lib/courier-imap/etc/authdaemonrc中使用以下:
[root@hpe45 etc]# more /usr/lib/courier-imap/etc/authdaemonrc
authmodulelist="authmysql authpam"
在/usr/lib/courier-imap/etc/authmysqlrc中設定虛擬用戶相關項:
在/etc/pam.d/imap和/etc/pam.d/pop3中對系統用戶驗證:
[root@hpe45 pam.d]# more imap
#%PAM-1.0
auth required pam_stack.so service=system-auth
a
clearcase/" target="_blank" >ccount required pam_stack.so service=system-auth
注:由於courier-imap支持的是Maildir風格的郵箱目錄,因此postfix中要打開$home_mailbox=Maildir/參數,郵件會投遞到/home/username/Maildir下,courier-imap能到用戶目錄下取信。
以上設置後,本地用戶和虛擬用戶都可以由imap/pop取信。
4、郵件的路由問題 postfix對於來自本地發出的郵件與來自
網絡smtp的郵件,處理方法是不一樣的。來自本地用戶發出的郵件被sendmail投入maildrop隊列,再由pickup程序送入cleanup進程。而來自網絡的郵件,則由smtpd接收後送入cleanup進程。詳圖見http://www.postfix.org/receiving.html。
cleanup進程後,郵件被放入incoming和active隊列。然後,qmgr進程處理郵件,根據默認的transport規則或是用戶定義的transport表,將郵件發向不同的郵件投遞代理,如本地投遞代理、虛擬投遞代理、smtp客戶端(發向其他域)以及一些外部的
MDA,如procmail。
郵件投遞代理收到郵件後,將郵件投遞到用戶郵箱中。
4.1、使用本地投遞代理和虛擬投遞代理情況下的郵件路由
本地用戶使用本地投遞代理,虛擬用戶使用虛擬投遞代理。在這種情況下,郵件路由的做法:
實驗中/etc/postfix/main.cf部分設置:
myhostname = hpe45.fz.fj.zz
mydomain = fz.fj.zz
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain
virtual_transport = virtual
virtual_mailbox_domains = fz.fj.zz
virtual_mailbox_base = /var/spool/smail3k
virtual_mailbox_maps = mysql:/etc/postfix/smail3k.cf
#virtual_mailbox_maps = hash:/etc/postfix/smail3k
virtual_uid_maps = static:12346
virtual_gid_maps = static:12
virtual_minimum_uid = 1001
local_transport = local
4.1.2、讓本地用戶和虛擬用戶分屬不同的郵件域。
本地用戶使用主機名的郵件地址形式,如
[email protected]。虛擬用戶使用域名的郵件地址形式,如
[email protected]。
將上面的myorigin值改為
myorigin=hpe45.fz.fj.zz或myorigin=$myhostname
當本地用戶在本地向bin等系統用戶發送郵件時,會被自動加上收件人和發件人都會自動加上@hpe45.fz.fj.zz的後綴,比如serial0 mail向bin時,會被改為
[email protected]和
[email protected],然後此信被轉到本地投遞代理。本地投遞代理查別名表,再轉向root,再次進入maildrop-pickup-cleanup,root又被改為
[email protected],再次轉到本地投遞代理,最後投遞。
本地普通用戶和虛擬用戶相互之間的投遞,也可以使用。
4.1.2、讓本地用戶和虛擬用戶同屬一個郵件域。
同屬一個域,即本地用戶郵件地址為
[email protected],虛擬用戶的郵件地址為
[email protected]。可以使用transport表控制兩類用戶的郵件路由。使用transport表,將發向本地用戶的郵件交給本地投遞代理處理,將發向虛擬用戶的郵件交虛擬投遞代理處理。
生成/etc/postfix/hpe45fzfjzz,作為transport的表,將本地用戶專門列出指定由local處理,其余都認為是虛擬用戶指向virtual
[root@hpe45 postfix]# more /etc/postfix/hpe45fzfjzz
[email protected] local:
fz.fj.zz virtual:
並用postmap後成相應的hpe45fzfjzz.db。
在/etc/postfix/main.cf中加入transport_map:
#local_transport = local
#transport_maps = hash:/etc/postfix/hpe45fzfjzz
以上設置只考慮了本地的普通用戶。對於系統用戶,默認情況下的別名表是由本地投遞代理使用的,而本地投遞代理的動作是在郵件路由之後才發生的。因此,當程序向系統用戶發送郵件時,postfix在qmgr階段處理時會發現在虛擬域中找不到這些用戶,從而無法投遞。
這種情況下,處理的辦法一個是將系統用戶名也加入到transport表中
[email protected] local:
[email protected] local:
[email protected] local:
fz.fj.zz virtual:
這樣本地發給postmaster的郵件,經過maildrop-pickup-cleanup-incoming-active-qmgr-local會發到本地投遞代理。本地投遞代理查別名表,將此信轉向root,即以本地方式發向postfix,又經過maildrop-pickup-cleanup-incoming-active-qmgr-local,然後投入root郵件箱中。
由此可見,如果在上面的transport中少了
[email protected],則郵件還是無法到達。如果不寫全
[email protected],
[email protected],只寫postmaster,root,郵件也是無法投遞。
還有一辦法是將系統用戶別名表,用virtual_alias_maps指出,讓別名轉化在進入postfix後在cleanup處發生,這樣就省了在本地投遞域再處理。
在/etc/postfix/main.cf中加入:
virtual_alias_maps = hash:/etc/postfix/aliases
這樣,以本地用戶test發向bin用戶的郵件,進入maildrop-pickup-cleanup,cleanup會查aliases.db將
[email protected]轉向
[email protected],然後cleanup-incoming-active-qmgr-local,投在root郵箱。
因此在transport表中,要有“
[email protected] local:”記錄。當然了,我們也可以在aliase加入“root:serial0”。這樣,在transport表中就不需要用root記錄了。
5、處理本地用戶和虛擬用戶要看實際情況 如何處理本地用戶和虛擬用戶要看實際情況,比如郵件服務器的用途,本地用戶的數量,本地用戶的郵件需求等。
假如:郵件服務器所在主機,除了郵件服務外,還有其他用途,還有一些本地用戶。那這時可能就要傾向於本地用戶和虛擬用戶同名了。smtp/imap/pop驗證都要使用/etc/passwd。
假如:郵件服務器就是專門用來做郵件服務,沒有本地用戶。那麼就可以將域名給虛擬用戶使用。本地的用戶就直接使用主機名做後綴。系統用戶就可以轉發一些錯誤日志信息的郵件投遞給本地管理員。這時本地管理員就不需要什麼SMTP驗證了,imap/pop也可以根據需要加入。
這時也可以考慮做別名轉發,將本地管理員的郵件再轉到虛擬用戶上,這樣就避免imap/pop服務器對/etc/passwd的訪問。
只要在別名表中加入root :
[email protected] 。用newaliases轉化為數據庫後,就可以了。