用于 DN 查找

用于 DN 查找

我已经解决这个问题好几天了,似乎已经用尽了所有的故障排除方法,所以我想向社区寻求帮助。

在没有将 OpenLDAP 引入邮件基础设施的情况下,Postfix 和 Dovecot 一直运行良好。在过去几天中,Postfix MTA 配置了虚拟 LDAP 设置,但即使 Postfix 可以读取并知道这些真实邮件用户、邮件别名和虚拟域存在,电子邮件仍显示退回状态。以下是我的 Postfix main.cf 中的相关虚拟设置。

笔记:只有 3 个虚拟 LDAP 配置

virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_minimum_uid = 5000 virtual_mailbox_domains = ldap:/etc/postfix/ldap-virtual-domains.cf virtual_mailbox_maps = ldap:/etc/postfix/ldap-vmailbox.cf virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf virtual_mailbox_limit = 512000000 virtual_mailbox_base = /home/vmail transport_maps = hash:/etc/postfix/transport

以下是每个虚拟 LDAP 文件的内容。

ldap-虚拟域.cf

server_host = ldap://ldap.example.net/ search_base = ou=Domains,dc=example,dc=net version = 3 bind = no query_filter = (&(ObjectClass=dNSDomain)(dc=%s)) result_attribute = dc

ldap-vmailbox.cf

server_host = ldap://ldap.example.net/ search_base = ou=Mail,dc=example,dc=net version = 3 bind = no query_filter = (&(objectclass=inetOrgPerson)(mail=%s)) result_attribute = mail

ldap-别名.cf

server_host = ldap://ldap.example.net/ search_base = ou=Mail,dc=example,dc=net version = 3 bind = no query_filter = (&(objectclass=inetLocalMailRecipient)(mailLocalAddress=%s)) result_attribute = mail

验证 Postfix 可以读取并处理所有 3 个虚拟 LDAP 文件成功

ldap-虚拟域.cf:

postmap -q example.net ldap:/etc/postfix/ldap-virtual-domains.cf example.net postmap -q example.org ldap:/etc/postfix/ldap-virtual-domains.cf example.org postmap -q example.com ldap:/etc/postfix/ldap-virtual-domains.cf example.com

ldap-vmailbox.cf:

postmap -q [email protected] ldap:/etc/postfix/ldap-vmailbox.cf [电子邮件保护] postmap -q [email protected] ldap:/etc/postfix/ldap-vmailbox.cf [电子邮件保护] postmap -q [email protected] ldap:/etc/postfix/ldap-vmailbox.cf [电子邮件保护]

ldap-aliases.cf:

postmap -q [email protected] ldap:/etc/postfix/ldap-aliases.cf [电子邮件保护] postmap -q [email protected] ldap:/etc/postfix/ldap-aliases.cf [电子邮件保护]

这是我在邮件日志中看到的内容:

10月26日 16:54:17 example.net postfix/cleanup[2789]: 3D26A105CC: info: header 主题:测试来自 [REDACTED] 的虚拟 LDAP;[电子邮件保护] [电子邮件保护]proto=ESMTP helo=macbook-air.moon
10月26日 16:54:17 example.net postfix/cleanup[2789]: 3D26A105CC:[电子邮件保护]
10 月 26 日 16:54:17 example.net opendkim[11877]: 3D26A105CC: [已删除] 非内部
10月26日 16:54:17 example.net opendkim[11877]: 3D26A105CC: 未经身份验证
10月26日 16:54:17 example.net opendkim[11877]: 3D26A105CC: 没有签名数据
10月26日 16:54:17 example.net postfix/qmgr[26221]: 3D26A105CC:[电子邮件保护], size=571, nrcpt=1 (队列活动)
10 月 26 日 16:54:17 example.net postfix/smtpd[2461]: 断开与 [已编辑] ehlo=1 mail=1 rcpt=1 data=1 quit=1 command=5 的连接
10月26日 16:54:17 example.net postfix/pipe[2791]: 3D26A105CC:[电子邮件保护],中继=dovecot,延迟=0.12,延迟=0.08/0.01/0/0.02,dsn=5.1.1,状态=退回(用户未知)
10月26日 16:54:17 example.net postfix/cleanup[2789]: 55F2B1080A:[电子邮件保护]
10 月 26 日 16:54:17 example.net postfix/qmgr[26221]: 55F2B1080A: from=, size=2460, nrcpt=1 (队列活跃)
10 月 26 日 16:54:17 example.net postfix/bounce[2793]: 3D26A105CC: 发件人未送达通知: 55F2B1080A
10 月 26 日 16:54:17 example.net postfix/qmgr[26221]: 3D26A105CC: 已删除
10月26日 16:54:17 example.net postfix/smtp[2794]: 55F2B1080A:[电子邮件保护]、relay=none、delay=0.02、delays=0/0.01/0/0、dsn=5.4.4、status=bounced(未找到主机或域名。name=macbook-air.moon 的名称服务错误类型=A:未找到主机)

LDAP 中存在的有效邮件帐户在日志中显示以下内容: Oct 26 16:56:14 example.net postfix/pipe[3592]: 457871080A: [email protected], [email protected], relay=dovecot, delay=0.03, delays=0.01/0/0/0.02, dsn=5.1.1, status=bounced (user unknown)

[电子邮件保护]是 LDAP 中的真实邮件地址,并且[电子邮件保护]是 LDAP 中的真实别名。使用 进行验证时,Postfix 可以轻松找到它们postmap -q

以下是完整的 Postfix 配置:

别名数据库 = $别名地图
alias_maps = hash:/etc/postfix/aliases
append_dot_mydomain = no
broken_sasl_auth_clients = 是
命令目录 = /usr/bin
兼容性级别 = 2
daemon_directory = /usr/lib/postfix/bin
数据目录 = /var/lib/postfix
debug_peer_level = 2
debug_peer_list = 127.0.0.1
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
header_checks = regexp:/etc/postfix/header_checks
home_mailbox = Maildir/
html_directory = 否
inet_interfaces = 全部
inet_protocols = ipv4
mail_owner = postfix
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/lib/dovecot/deliver
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
消息大小限制 = 20480000
meta_directory = /etc/postfix
milter_default_action = 接受
milter_protocol = 2
我的目的地 =
mydomain = example.net
myhostname = mail.$mydomain
mynetworks = 127.0.0.0/8 10.8.0.0/24 192.168.128.0/17 [服务器 IP 已编辑] [::1]/128 [2600:3c01::]/64 [fe80::]/64
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
non_smtpd_milters = inet:127.0.0.1:8891
队列目录 = /var/spool/postfix
readme_directory = /usr/share/doc/postfix
收件人分隔符 = +
样本目录 = /etc/postfix/sample
sendmail_path = /usr/bin/sendmail
setgid_group = postdrop
shlib_directory = /usr/lib/postfix
smtp_tls_mandatory_protocols = !SSLv2,!SSLv3
smtp_tls_note_starttls_offer = 是
smtp_tls_protocols = !SSLv2,!SSLv3
smtp_tls_security_level = 可能
smtpd_error_sleep_time = 1s
smtpd_hard_error_limit = 20
smtpd_milters = inet:127.0.0.1:8891
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,check_policy_service inet:mail.example.net:12340
smtpd_sasl_auth_enable = 是
smtpd_sasl_authenticated_header = 是
smtpd_sasl_本地域=
smtpd_soft_error_limit = 10
smtpd_tls_CAfile = /etc/postfix/ssl/PositiveSSL.ca-bundle
smtpd_tls_cert_file = /etc/postfix/ssl/STAR_example_net.crt
smtpd_tls_key_file = /etc/postfix/ssl/key.pem
smtpd_tls_loglevel = 1
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_protocols = !SSLv2,!SSLv3
smtpd_tls_received_header = 是
smtpd_tls_security_level = 可能
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = 是
tls_random_source = dev:/dev/urandom
transport_maps = hash:/etc/postfix/transport
未知本地收件人拒绝代码 = 550
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
virtual_gid_maps = 静态:5000
virtual_mailbox_base = /home/vmail
虚拟邮箱域 = ldap:/etc/postfix/ldap-virtual-domains.cf
虚拟邮箱限制 = 512000000
虚拟邮箱映射 = ldap:/etc/postfix/ldap-vmailbox.cf
virtual_minimum_uid = 5000
virtual_transport=dovecot(鸽舍)
virtual_uid_maps = 静态:5000

LDAP 中具有多个别名的有效用户示例

LDAP 用户

看来我已经很接近了,但也许另一双眼睛可以提供一些解决这个问题的见解。任何意见都非常感谢。

更新 1

我设法status=bounced (user unknown)通过改变virtual_transport主配置文件

virtual_transport = dovecot

virtual_transport = lmtp:unix:private/dovecot-lmtp

主配置文件我改变了这一行

dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

到此行

dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

我在 LDAP 中添加了一个名为[电子邮件保护]并快速postmap -q证明 Postfix 知道[电子邮件保护],但随后我看到了这个错误。

Oct 26 23:46:46 example.net dovecot: quota-status([email protected]): Error: User initialization failed: Namespace '': stat(/home/vmail/postmaster/.Maildir) failed: Permission denied (euid=5003() egid=5000(vmail) missing +x perm: /home/vmail, dir owned by 5000:5000 mode=0700) Oct 26 23:46:46 example.net postfix/smtpd[25851]: NOQUEUE: reject: RCPT from[REDACTED]: 450 4.7.1 : Recipient address rejected: Invalid user settings. Refer to server log for more information.; from= to= proto=ESMTP helo=

经过进一步的研究,我开始查看我的 Dovecot LDAP 配置,特别是dovecot-ldap.conf.扩展名

hosts = ldap.example.net auth_bind = no ldap_version = 3 base = ou=Mail,dc=example,dc=net deref = never scope = subtree user_attrs = uidNumber=uid,gidNumber=gid,mailHomeDirectory=home,quotaBytes=quota_rule=*:bytes=%$ user_filter = (&(objectclass=inetOrgPerson)(mail=%u)) pass_attrs = mail=user,userPassword=password pass_filter = (&(objectClass=posixAccount)(uid=%u)) default_pass_scheme = SSHA

我不再user unknown在邮件日志中看到,但我确实看到失败的登录尝试。我不确定,但认为这可能是来自user_attrs或我的 dovecot-ldap.conf.ext 中的任何其他 LDAP 属性。

Oct 27 00:01:19 example.net dovecot: imap-login: Disconnected (auth failed, 1 attempts in 2 secs): user=<[email protected]>, method=PLAIN, rip=192.168.176.128, lip=192.168.176.128, TLS: Disconnected, session=<w/r1pBAj0YjAqLCA>

更新2

我在 OpenLDAP 中创建了一个名为 Dovecot 的管理员帐户,并read使用这一行授予其访问权限

by dn="uid=dovecot,ou=System,dc=example,dc=net" read

Dovecot 现已成功读取 userPassword 属性。以下是dovecot-ldap.conf.ext启用绑定后的样子。

hosts = ldap.example.net auth_bind = yes auth_bind_userdn = uid=%u,ou=Mail,dc=example,dc=net dn = uid=dovecot,ou=System,dc=example,dc=net dnpass = password ldap_version = 3 base = ou=Mail,dc=example,dc=net deref = never scope = subtree user_filter = (&(objectclass=inetOrgPerson)(mail=%u)) pass_filter = (&(objectclass=inetOrgPerson)(mail=%u)) default_pass_scheme = SSHA user_attrs = uidNumber=uid,gidNumber=gid,mailHomeDirectory=,quotaBytes=quota_rule=*:bytes=%$ pass_attrs = mail=uid,userPassword=password

当我尝试登录 vmail 账户时,我发现 Dovecot 无法从 userdb 中找到用户

Oct 27 20:42:47 example.net dovecot: auth: Error: ldap(vmail,192.168.176.128,<8C7h/CEjo5DAqLCA>): user not found from userdb Oct 27 20:42:47 example.net dovecot: imap: Error: Authenticated user not found from userdb, auth lookup id=4111597569 (client-pid=26724 client-id=1) Oct 27 20:42:47 example.net dovecot: imap-login: Internal login failure (pid=26724 id=1) (internal failure, 1 successful auths): user=<vmail>, method=PLAIN, rip=192.168.176.128, lip=192.168.176.128, mpid=26726, secured, session=<8C7h/CEjo5DAqLCA>

如果我将user_filter属性更改为下面一行登录成功。

user_filter = (&(objectClass=posixAccount)(uid=%u))

但随后消息又开始被退回。

Oct 27 20:46:09 example.net postfix/smtp[27702]: ECA4F10848: to=<[email protected]>, relay=none, delay=0.16, delays=0.01/0.01/0.14/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=macbook-air.moon type=A: Host not found)

Oct 27 20:46:08 example.net postfix/lmtp[27698]: E0994102FA: to=<[email protected]>, relay=example.net[private/dovecot-lmtp], delay=0.06, delays=0.05/0.01/0/0, dsn=5.1.1, status=bounced (host mail.example.net[private/dovecot-lmtp] said: 550 5.1.1 <[email protected]> User doesn't exist: [email protected] (in reply to RCPT TO command))

此时我认为问题可能出在用户和密码过滤器上,但我真的不知道了。这是当前的 Dovecot 配置dovecot -n和 Dovecot 的 LDAP 部分:http://ix.io/lEE

我希望这一切都可以提供线索,表明可能缺少什么或搞乱了什么,以便用户登录和发送/接收邮件成功。

答案1

pass_attrs = mail=user,userPassword=password

可能是错的。它的意思是“使用 mail 作为用户名 ldap 属性名,使用 userPassword 作为密码属性名”。

我认为应该这样写:

pass_attrs = mail=uid,userPassword=password

您可以通过查看 OpenLDAP 日志来检查。

我也对以下几点表示怀疑:

user_attrs = mailHomeDirectory=home

因为存在语义冲突。LDAP 属性home用于 Unix 主目录,但现在它用作 maildir 位置。你能再检查一下吗?

答案2

这个问题已经解决。dovecot-ldap.conf.ext我更改了以下过滤器。

user_attrs = user_filter = (&(objectclass=inetOrgPerson)(uid=%n)(mailEnabled=TRUE))

用于 DN 查找

pass_attrs = mail=user,userPassword=password pass_filter = (&(objectclass=inetOrgPerson)(uid=%n))

完整的 dovecot-ldap.conf.ext 配置

hosts = ldap.example.net auth_bind = yes dn = uid=dovecot,ou=System,dc=example,dc=net dnpass = PASS ldap_version = 3 base = ou=Mail,dc=example,dc=net deref = never scope = subtree default_pass_scheme = SSHA user_attrs = user_filter = (&(objectclass=inetOrgPerson)(uid=%n)) pass_attrs = mail=user,userPassword=password pass_filter = (&(objectclass=inetOrgPerson)(uid=%n))

我还必须mail_location更新/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:%Lh/Maildir/:INDEX=%Lh/Maildir/

最终权限检查

  • 已验证/home/vmail/*具有适当的用户/组权限vmail:vmail
  • 已验证的 uidNumber 和 gidNumber 为 5000

Dovecot 本地传送代理现在能够处理电子邮件并将其存储在/home/vmail/user@domain目录中。

相关内容