本章介绍如何为Dovecot配置LDAP认证。Dovecot配置龙LDAP认证后,还可通过SASL为Postfix提供认证。
环境确认
首先需要确认LDAP服务可用,且用户可登录:
$ ldapwhoami -H ldap://localhost/ -D cn=user@example.com,dc=example,dc=com -W
Enter LDAP Password:
dn:cn=user,dc=example,dc=com
并安装了Dovecot:
# apt install dovecot-core dovecot-ldap dovecot-imapd dovecot-lmtpd
配置Dovecot
打开/etc/dovecot,可以看到配置目录结构:
$ ll /etc/dovecot
total 48
drwxr-xr-x 4 root root 4096 Sep 3 09:45 ./
drwxr-xr-x 70 root root 4096 Sep 1 15:58 ../
drwxr-xr-x 2 root root 4096 Sep 3 09:46 conf.d/
-rw-r--r-- 1 root root 4343 Jan 11 2023 dovecot.conf
-rw-r----- 1 root dovecot 1507 Aug 6 2021 dovecot-dict-auth.conf.ext
-rw-r----- 1 root dovecot 522 Aug 6 2021 dovecot-dict-sql.conf.ext
-rw-r----- 1 root dovecot 5898 Sep 3 09:45 dovecot-ldap.conf.ext
drwx------ 2 root root 4096 Sep 1 14:32 private/
打开dovecot.conf,可以看到其中配置文件主要集中在conf.d
第一步,编辑/etc/dovecot/conf.d/10-auth.conf
# 使用完整的用户名来认证(完整的 用户名@域名 格式)
auth_username_format = %Lu
# 取消注释ldap配置,其他的认证方式按需使用
!include auth-ldap.conf.ext
第二步,编辑/etc/dovecot/auth-ldap.conf.ext
# hosts 和 uri二选一配置
uris = ldap://localhost/
# 使用bind方式来进行LDAP认证
auth_bind = yes
# 设置bind方式认证的用户
auth_bind_userdn = cn=%Lu,dc=example,dc=com
# 配置下查询base(可选,但不配置好像会报错)
base = dc=example,dc=com
# (可选)最好限制下查询范围scope
scope = subtree
# 这两句按照官方的来
pass_attrs = uid=user, userPassword=password
pass_filter = (&(objectClass=inetOrgPerson)(cn=%Lu))
# 如果LDAP使用加密方式存储密码,建议配置下
default_pass_scheme = SSHA256
第三步(可选),为了提高查询性能,链接一份auth-ldap.conf.ext,并使用
# ln -s /etc/dovecot/auth-ldap.conf.ext /etc/dovecot/auth-ldap-userdb.conf.ext
# vi /etc/dovecot/conf.d/auth-ldap.conf.ext
userdb {
driver = ldap
args修改为:
args = /etc/dovecot/dovecot-ldap-userdb.conf.ext
验证
验证LDAP帐号是否可用:
$ ldapwhoami -H ldap://localhost/ -D cn=user@example.com,dc=example,dc=com -W
Enter LDAP Password:
dn:cn=user,dc=example,dc=com
验证Dovecot能否使用LDAP认证:
$ sudo -u dovecot doveadm auth test -x "service=imap" user@example.com
Password:
passdb: user@example.com auth succeeded
extra fields:
user=user@example.com
也可以:
$ sudo -u dovecot doveadm auth test user@example.com
Password:
passdb: user@example.com auth succeeded
extra fields:
user=user@example.com