You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Postfix/Dovecot同时支持用户与服务邮件的正确配置方案咨询

Postfix/Dovecot同时支持用户与服务邮件的正确配置方案咨询

看起来你在搭建一套结合OpenLDAP、Kerberos的企业级邮件系统,要同时给交互式用户和GitLab这类服务账号提供邮件支持,这个场景确实容易在认证规则的匹配上踩坑——毕竟你的服务账号只有PostfixBookMailAccount类,没有用户账号的posixAccount属性,依赖系统用户属性的认证逻辑自然会把它们挡在外面。我来帮你理理两个可行的调整方向,以及之前配置可能踩的坑:

一、先排查你之前PAM配置没生效的核心原因

你的服务账号没有posixAccount,所以依赖Kerberos的PAM认证肯定过不了(因为Kerberos principal通常和uid绑定),哪怕你把LDAP加到PAM栈前面,大概率是这两个地方没配对:

  • PAM LDAP的过滤规则没覆盖服务账号:你说改了搜索mailEnabled,但要确认配置文件(比如/etc/pam_ldap.conf)里的filter是不是改成了(&(objectClass=PostfixBookMailAccount)(mailEnabled=TRUE)),而不是还残留着objectClass=posixAccount的条件。
  • PAM栈的认证逻辑太严格:如果你的PAM auth栈里Kerberos是required(必须通过),那服务账号没有Kerberos principal,哪怕LDAP过了也会被拒。要改成sufficient(任一通过即可),比如:
    auth    sufficient  pam_ldap.so use_first_pass
    auth    sufficient  pam_krb5.so use_first_pass
    auth    required    pam_deny.so
    
  • PAM的登录属性映射错了:服务账号可能没有uid,所以要在PAM LDAP配置里加pam_login_attribute mail,让PAM用邮件地址去匹配账号,而不是默认的uid

不过说实话,用PAM来做邮件账号认证有点绕,因为PAM本质是为系统登录设计的,更推荐直接用Dovecot的LDAP驱动——专门针对邮件场景,不用依赖系统用户的属性。

二、推荐方案:直接配置Dovecot的LDAP驱动

这个方案更直接,完全绕开系统PAM的限制,直接从LDAP拉取邮件账号的信息,不管有没有posixAccount

1. 配置Dovecot的LDAP连接文件

新建/etc/dovecot/dovecot-ldap.conf.ext,关键配置项要对应你的LDAP结构:

# LDAP服务器地址
hosts = ldap://your-ldap-server-ip:389
# 搜索根DN
base = dc=your-domain,dc=com
# 递归搜索子节点
scope = sub
# 匹配规则:只要是PostfixBookMailAccount且mailEnabled的账号,用邮件地址匹配
user_filter = (&(objectClass=PostfixBookMailAccount)(mailEnabled=TRUE)(mail=%u))
pass_filter = (&(objectClass=PostfixBookMailAccount)(mailEnabled=TRUE)(mail=%u))
# 如果你的LDAP需要绑定账号搜索(匿名搜索可能权限不够)
bind_dn = cn=mail-bind,ou=system,dc=your-domain,dc=com
bind_pw = your-bind-password
# 密码加密方式,要和LDAP里存储的一致
default_pass_scheme = CRYPT
# 属性映射:给没有homeDirectory的服务账号指定默认邮件存储路径
user_attrs = =home=/var/vmail/%u, =mail=maildir:/var/vmail/%u/Maildir

2. 修改Dovecot主配置,启用LDAP认证

编辑/etc/dovecot/dovecot.conf,把原来的PAM认证换成LDAP:

# 启用plain和login认证机制(服务账号通常用这两种)
auth_mechanisms = plain login
# 密码数据库用LDAP
passdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
}
# 用户数据库也用LDAP
userdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
}

3. 同步Postfix的虚拟邮箱映射

Postfix也要能识别服务账号的邮件地址,新建/etc/postfix/virtual_ldap.cf

server_host = your-ldap-server-ip
search_base = dc=your-domain,dc=com
# 匹配规则和Dovecot保持一致
query_filter = (&(objectClass=PostfixBookMailAccount)(mailEnabled=TRUE)(mail=%s))
# 返回邮件存储路径(如果用Maildir的话)
result_attribute = mailMessageStore

然后在Postfix的main.cf里更新配置:

virtual_mailbox_maps = ldap:/etc/postfix/virtual_ldap.cf

三、快速测试验证

  • 测试Dovecot认证:用doveadm auth test service-account@your-domain.com,输入密码后如果返回OK就说明认证通了;如果失败,看错误提示是“user not found”还是“password mismatch”,对应调整LDAP过滤规则或密码属性。
  • 测试Postfix映射:用postmap -q service-account@your-domain.com ldap:/etc/postfix/virtual_ldap.cf,能返回存储路径就说明映射正常。

我之前帮朋友调过几乎一模一样的场景,用Dovecot LDAP驱动的方式比PAM顺畅太多——毕竟不用迁就系统用户的属性规则,完全围绕邮件账号的需求来配置。

备注:内容来源于stack exchange,提问作者user4540359

火山引擎 最新活动