从 SLES11 升级到 SLES 12 我必须用 dovecot 替换正在运行的 Cyrus 邮件服务器。不幸的是,我无法通过 LDAP 进行身份验证(这对 Cyrus 来说不是问题):
我的 LDAP 用户有两个uid
属性。通过 IMAP 进行身份验证时,dovecot 检测到 ( Warning: ldap(*uid*,*IP*,<*SID*>): Multiple values found for '*uid*', using '*uid2*'
)。
虽然这不应该是问题,但身份验证失败并且没有进一步的消息。如何在不更改 LDAP 用户的情况下进行身份验证? (在 UNIX/PAM 中我可以使用任一 uid 登录)
这是我的/etc/dovecot/dovecot-ldap.conf.ext
(为简洁起见,删除了大多数评论,并且实际域已更改(无论如何都无法访问)):
# This file is commonly accessed via passdb {} or userdb {} section in
# conf.d/auth-ldap.conf.ext
hosts = ds2.domain.org ds1.domain.org
tls = yes
tls_require_cert = demand
debug_level = 0
auth_bind_userdn = uid=%u,ou=people,dc=domain,dc=org
ldap_version = 3
base = ou=people,dc=domain,dc=org
scope = onelevel
# User attributes are given in LDAP-name=dovecot-internal-name list. The
# internal names are:
# uid - System UID
# gid - System GID
# home - Home directory
# mail - Mail location
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid
# Filter for user lookup. Some variables can be used (see
# http://wiki2.dovecot.org/Variables for full list):
# %u - username
# %n - user part in user@domain, same as %u if there's no domain
# %d - domain part in user@domain, empty if user there's no domain
user_filter = (&(objectClass=posixAccount)(uid=%n))
pass_attrs = uid=%n,userPassword=password
pass_filter = (&(objectClass=posixAccount)(uid=%u))
iterate_attrs = uid=user
iterate_filter = (objectClass=posixAccount)
default_pass_scheme = SSHA
所以恕我直言,需要一种方法让 dovecot 继续使用用于查询 userdb 和 passdb 的用户名。相反,它继续使用从 LDAP 返回的值。
答案1
为什么你有多个uid属性值?
海事组织你不应该这样做。
例如在鸽舍config 中的一些路径名是从用户名派生的。因此,dovecot 无法从 LDAP 搜索结果中可靠地确定要使用的用户名。
因为属性类型描述为uid不强制执行SINGLE-VALUE
应将属性限制为一个值。例如,使用 OpenLDAP,您可以在 slapd.conf 中设置(请参阅slapo约束):
constraint_attribute uid count 1
如果您已经拥有多个uid您应该清理您的数据,因为您肯定也会在使用其他支持 LDAP 的软件时遇到麻烦。