我的系統是這樣設定的。
smtp --> postfix --> dovecot (透過 LMTP) --> 信箱
棘手的部分是身份驗證是針對 LDAP 的。
典型的 LDAP 條目如下:
CN=Jon Doe
uid=jond
[email protected]
現在發生的情況是 postfix 正在將郵件推送到 dovecot。 Dovecot 正在執行 userdb 查找,但基於目標電子郵件地址“[電子郵件受保護]」。
因此 LDAP 找出 (uid=%u) ,然後是 ([電子郵件受保護])。
Postfix 透過虛擬堆疊發送此訊息,因此虛擬部分的設定如下:
virtual_alias_maps = ldap:/etc/postfix/ldap/ldap-aliases.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /
virtual_mailbox_domains = ldap:/etc/postfix/ldap/virtual_domains.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap/ldap-accounts.cf
virtual_minimum_uid = 5000
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_uid_maps = static:5000
我期望的是 postfix 使用 virtual_mailbox_maps 來尋找使用者並將該使用者傳遞給 LMTP,以便 dovecot 可以進行 userdb 查找。由於 postfix 不知道如何做到這一點,而且我沒有找到可以做到這一點的 virtual_map* 參數,所以我不知道正確的程式是什麼。
postfix 是否應該透過 LDAP 尋找使用者並將其傳送到 LMTP?或者 LMTP 應該根據收件者電子郵件地址進行查找嗎?
編輯:我應該補充一點,當我連接郵件用戶端來接收郵件時,dovecot 的 IMAP 部分工作正常。它根據我的登入名稱(uid)正確查找所有內容。這當然是可能的,因為當我登入 IMAP 時,我傳遞了我的 uid,因此很容易將其用於 dovecot。
當 postfix 使用它時,我必須以某種方式告訴 dovecot 以不同的方式做...
/etc/dovecot/dovecot-ldap.conf.ext
hosts = localhost
dn = cn=linagent,ou=people,dc=example,dc=org
dnpass = SECRET
tls = no
auth_bind = yes
base = dc=example,dc=org
deref = never
scope = subtree
user_attrs = \
=home=%{ldap:homeDirectory}, \
=uid=5000, \
=gid=5000, \
=mail=maildir:%{ldap:mailMessageStore}
user_filter = (&(objectClass=inetOrgPerson)(uid=%u))
pass_attrs = uid=user,userPassword=password
pass_filter = (&(objectClass=inetOrgPerson)(uid=%u))
答案1
我不知道這是否應該是這樣,但我在 dovecot 中更改了 ldap 配置,如下所示:
user_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u)))
pass_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u)))
uid=%u 的部分我需要從郵件用戶端進行身份驗證,因為郵件用戶端是透過 UID(使用者名稱)登入的。
mail=%u 我需要從 postfix 接收 LMTP 的部分,postfix 只知道收件者郵件。
由於 uid 從來都不是郵件地址,我想這個解決方案會起作用並且不會產生任何衝突。這對我來說也有道理,但我想知道為什麼 Courier 可以更優雅地處理它。
但我不會解決這個問題,因為我認為這不是設計的方式。
答案2
難道你不使用 %n 變數而不是 %u 嗎?
檢查一下:https://wiki.dovecot.org/Variables
這是摘錄https://wiki2.dovecot.org/AuthDatabase/LDAP/Userdb
變數和域
使用者名稱和網域可以使用變數 %n 和 %d 來區分。他們將以前的用戶名拆分為“@”字元。先前的使用者名稱是:
- 對於 LMTP,它將是 user@hostname,其中主機名稱取決於 Postfix 設定等。 -對於 IMAP,它將是密碼資料庫指定為使用者名稱的任何內容。如果 (LDAP) 密碼資料庫具有“user_attrs = =user=%n”,則登入名稱的網域部分將會被密碼資料庫刪除。 UserDB 不會看到任何網域部分,即%n 和%u 對於UserDB 來說是相同的。
湯瑪斯