我的系统是这样设置的。
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,其中 hostname 取决于 Postfix 配置等。-对于 IMAP,它将是密码数据库指定的用户名。如果 (LDAP) 密码数据库有“user_attrs = =user=%n”,则登录名的域部分将被密码数据库剥离。UserDB 将看不到任何域部分,即 %n 和 %u 对于 UserDB 来说是同一个东西。
托马斯