背景:
我在 Debian 10 上使用 Dovecot,并将 userdb/passdb 后端从 NIS 切换到 LDAP,主要是因为我想了解 LDAP。
对于 NIS,我在 dovecot.conf 中有以下内容:
userdb {
driver = passwd
}
passdb {
driver = pam
args = dovecot
}
# mail_uid and mail_gid are NOT set
#mail_uid = dovecot
#mail_gid = mail
nsswitch.conf 中的这段内容(摘录):
passwd: files nis
group: files nis
shadow: files nis
当我切换到 LDAP 时,我在 dovecot.conf 中有以下内容(摘录):
userdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf
}
passdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf
}
# mail_uid and mail_gid are still NOT set
#mail_uid = dovecot
#mail_gid = mail
并且 dovecot-ldap.conf 中有这个(并且只有这个):
base = ou=Users,dc=pasta,dc=net
uris = ldap://192.168.1.21/
auth_bind = yes
auth_bind_userdn = uid=%u,ou=Users,dc=pasta,dc=net
NIS 和 LDAP 版本都可以运行,这意味着我可以启动 mutt 并阅读我(alexis)的邮件。
但是,我希望 Dovecot 从 LDAP 中查找其他属性,例如邮件配额或主目录 - 但不要专注于那些特定属性:我正在尝试学习如何将属性从 LDAP 转移到 Dovecot 并且我将在下面的配置中使用主目录作为示例。
问题:
因此,我通过将其添加到 dovecot-ldap.conf 来告诉 Dovecot 在哪个 LDAP 条目中属性为主目录:
user_attrs = homeDirectory=home
然而,当我这样做的时候,dovecot 就开始抱怨:
dovecot: imap(alexis)<26179><hHrHde6XHLjAqAEQ>: Error: Couldn't
drop privileges: User is missing UID (see mail_uid setting)
我尝试过的:
现在,我认为 mail_uid 文本具有误导性:我在 NIS 中不需要它,那么为什么我在 LDAP 中突然需要它?
事实上,如果我将以下内容添加到 dovecot.conf 中:
mail_uid = dovecot
mail_gid = mail
那么投诉内容就变为:
dovecot: imap(alexis): Error: Mail access for users with UID 111
not permitted (see first_valid_uid in config file, uid
from mail_uid setting).
但 dovecot UID 只是 Debian 10 的默认设置:我认为我不应该弄乱它。而且,无论如何,我并不想阅读鸽舍的邮件,我正在尝试阅读我自己的(亚历克西斯的),所以我真的认为这个错误信息具有误导性。
我尝试将一个不存在的用户的高数字 UID 放入其中mail_uid
,结果可想而知:
dovecot: imap(alexis)<28748><7lb3y+6XmLjAqAEQ>: Error:
stat(/var/mail/maildir/alexis/tmp) failed: Permission denied
(euid=5000(<unknown>) egid=5000(<unknown>) missing +x perm:
/var/mail/maildir/alexis, dir owned by 1000:1000 mode=0700)
我可以更改 /var/mail 中所有内容的所有权以适应需要,但这确实感觉是错误的做法。
mail_uid
所以我又注释掉了mail_gid
。
我想知道 Dovecot 是否认为它需要从匿名 LDAP 访问(用于检索用户属性,而不是阅读邮件)切换到经过身份验证的 LDAP 访问,但将 dovecot 用户添加到 LDAP 并在 dovecot-ldap.conf 中设置dn
并dnpass
没有什么区别,错误仍然存在:
dovecot: imap(alexis)<26179><hHrHde6XHLjAqAEQ>: Error: Couldn't
drop privileges: User is missing UID (see mail_uid setting)
但它应该能够在不经过身份验证的情况下读取属性:
ziti# ldapsearch -Y EXTERNAL -H ldapi:/// -W -b 'cn=config' -LLL "(objectClass=olcDatabaseConfig)"
...
dn: olcDatabase={1}mdb,cn=config
...
olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by * read
...
ziti#
我见过无法删除权限:用户缺少 UID(请参阅 mail_uid 设置)但我真的想学习这里发生了什么事为什么它不起作用,而不是切换到另一个 userdb/passdb 驱动程序。
我在谷歌上搜索了很多次,发现了很多类似的问题(有解决方案),但没有一个符合我的情况(尽管这并没有阻止我尝试其中的一半)。
有人能给出建议吗?谢谢!
答案1
哎呀...将 user_attr 设置为某些值覆写默认值!(我不知不觉地认为它将指定的值附加到了默认值中。)
所以我只需要设置 user_attrs 来指定全部Dovecot 所需的属性:
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid
然后它就起作用了。