环境:CentOS 7.9、Sendmail 8.14、OpenLDAP 2.4
我试图让 sendmail 从 LDAP 数据库中读取它的别名(这已经与 NIS 一起工作多年,但 NIS 正在逐渐消失)。我的邮件服务器是一个 LDAP 客户端。在mailserver:/etc/mail/sendmail.mc
:
define(confLDAP_DEFAULT_SPEC, `-H ldaps://ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org" -d "uid=sendmail,dc=myoffice,dc=mycompany,dc=org" -M simple -P /etc/mail/secret')dnl
define(`ALIAS_FILE',`ldap:-k (&(objectClass=nisMailAlias)(cn=%0)) -v "rfc822MailMember",/etc/aliases')dnl
推导出第一行是痛苦的,因为我的 web-fu 很差,因为我在 LDAP 的 sendmail K 宏上搜索文档。这个页面是我能找到的最好的页面,它似乎适用于旧版本的 sendmail。
当我在邮件服务器上重新启动 sendmail 并尝试使用别名数据库时,响应是:
# sendmail -bv sysadmin
ldap_init/ldap_bind failed to ldaps://ldap.myoffice.mycompany.org in map Alias0: Protocol error
sysadmin... deliverable: mailer local, user sysadmin
请注意,当我恢复到 NIS 版本时,别名解析;这是我期待的输出:
# sendmail -bv sysadmin
myname... deliverable: mailer local, user myname
在mailserver:/etc/openldap/ldap.conf
:
BASE dc=myoffice,dc=mycompany,dc=org
URI ldaps://ldap.myoffice.mycompany.org ldaps://ldap-replica-1.myoffice.mycompany.org ldaps://ldap-replica-2.myoffice.mycompany.org
SIZELIMIT unlimited
TLS_CACERT /etc/mail/certs/certs-latest/__myoffice_mycompany_org.cer
TLS_CACERTDIR /etc/mail/certs/certs/certs-latest
__myoffice_mycompany_org.cer
是 PEM 格式,包含我的站点的证书链和通配符证书,*.myoffice.mycompany.org
.
对于 sendmail 之外的身份验证和搜索,通过邮件服务器的 LDAP 客户端配置进行的 LDAP 搜索似乎工作正常。这是我的测试,所有测试都产生了我期望的结果:
# Authentication-type searches
ldapsearch -LLL -x -H ldaps://ldap.myoffice.mycompany.org "(uid=myname)"
ldapsearch -LLL -x uid=myname -b dc=myoffice,dc=mycompany,dc=org
ldapsearch -LLL -x uid=myname
# Mail-aliase-type searches
ldapsearch -x -h ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org" "cn=sysadmin"
ldapsearch -x -H ldaps://ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org" "cn=sysadmin"
ldapsearch -H ldaps://ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org" "(cn=sysadmin)" -D "uid=sendmail,dc=myoffice,dc=mycompany,dc=org" -y /etc/mail/secret
最后三个命令的输出是相同的,并且表明我根据以下内容在 LDAP 服务器上设置了别名misc.schema
:
# extended LDIF
#
# LDAPv3
# base <ou=Aliases,dc=myoffice,dc=mycompany,dc=org> with scope subtree
# filter: cn=sysadmin
# requesting: ALL
#
# sysadmin, Aliases, myoffice.mycompany.org
dn: cn=sysadmin,ou=Aliases,dc=myoffice,dc=mycompany,dc=org
cn: sysadmin
objectClass: nisMailAlias
objectClass: top
rfc822MailMember: myname
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
请注意,对于ldapsearch
上面的最后一项,为了尝试调试正在发生的事情,我uid=sendmail,dc=myoffice,dc=mycompany,dc=org
在我的 LDAP 服务器上创建了一个单独的用户,明文密码在/etc/mail/secret
.
在sendmail.mc
中,我也尝试过:
define(confLDAP_DEFAULT_SPEC, `-h ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org"')dnl
define(confLDAP_DEFAULT_SPEC, `-H ldaps://ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org"')dnl
但结果是一样的。
只是为了确认该帐户myname
存在(尽管我怀疑这是问题所在):
# ldapsearch -LLL -x uid=myname -b dc=myoffice,dc=mycompany,dc=org
dn: uid=myname,ou=People,dc=myoffice,dc=mycompany,dc=org
uid: myname
cn: Bill Myname
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 17316
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 11230
gidNumber: 10130
homeDirectory: /myoffice/desktop/home/myname
gecos: Bill Myname,Room 321,x2280
我错过了什么?或者换句话说,sendmail 中的 LDAP 查找与 CentOS 其余部分中的 LDAP 查找有何不同?
编辑:
我发现一个网页表明问题可能是 CentOS 7 上的 sendmail 可能使用其 NSS 存储中的证书,而不仅仅是CERT_DIR
目录中的文本文件。我按照该页面上建议的说明进行操作:
cd /etc/openldap/certs
certutil -A -d . -n "Myoffice 2022" -a -i /etc/mail/certs/certs-latest/__myoffice_mycompany_org.cer -t "CT,c,"
但这并没有改变 sendmail 的 LDAP+aliases 行为。
感谢larsks的建议,我有了答案。原来
olcLogLevel
在我的 LDAP 服务器上已经设置为 -1。我在日志中寻找,我认为我以前做过,但显然不够仔细。我找到了消息:事实证明,sendmail 8.14 默认使用 LDAPv2 协议,该协议在多年前已被 LDAPv3 淘汰。网络搜索向我展示了在我的 LDAP 服务器上添加选项以接受 v2 连接的过程:
在
allow_bind_v2.ldif
:然后我发出命令
回到我的邮件服务器,我发现一个简单的配置就足够了
sendmail.mc
:重启sendmail后,得到了我预期的结果:
虽然这行得通,但对我来说似乎难以置信,这么多年过去了,即使是相对较旧的 sendmail 版本也无法支持 LDAPv3。现在我知道要寻找什么,我找到了这个页面,它解释了如何让 sendmail 使用 LDAPv3:添加
-w 3
到 confLDAP_DEFAULT_SPEC:这样,我就可以在我的 LDAP 服务器上关闭 bind_v2:
在
remove_bind_v2.ldif
:Sendmail 别名解析仍然工作得很好。
虽然我承认整个情况+解决方案倾向于证实 larsks 关于 sendmail 的论点,但我现在已经找到了一些有用的东西。是时候继续下一个问题了。