环境: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+别名行为。
答案1
感谢 larsks 的建议,我找到了答案。结果发现olcLogLevel
我的 LDAP 服务器上的 已经设置为 -1。我仔细查看了日志,我以为我以前做过,但显然不够仔细。我找到了以下消息:
send_ldap_result: err=2 matched="" text="historical protocol version requested, use LDAPv3 instead"
事实证明,sendmail 8.14 默认使用 LDAPv2 协议,该协议在多年前就被 LDAPv3 淘汰了。网上搜索向我展示了流程在我的 LDAP 服务器上添加选项以接受 v2 连接:
在allow_bind_v2.ldif
:
dn: cn=config
add: olcAllows
olcAllows: bind_v2
然后我发出命令
# ldapmodify -H ldapi:// -Y EXTERNAL -f allow_bind_v2.ldif
回到我的邮件服务器,我发现一个简单的配置就足够了sendmail.mc
:
define(confLDAP_DEFAULT_SPEC, `-H ldaps://ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org"')dnl
重新启动sendmail之后,得到了我预期的结果:
# sendmail -bv sysadmin
myname... deliverable: mailer local, user myname
虽然这有效,但对我来说,经过这么多年,即使是相对较旧的 sendmail 版本也无法支持 LDAPv3,这似乎令人难以置信。现在我知道该寻找什么了,我发现这一页解释了如何让 sendmail 使用 LDAPv3:添加-w 3
到 confLDAP_DEFAULT_SPEC:
define(confLDAP_DEFAULT_SPEC, `-H ldaps://ldap.myoffice.mycompany.org -b "ou=Aliases,dc=myoffice,dc=mycompany,dc=org" -w 3')dnl
这样,我就可以关闭 LDAP 服务器上的 bind_v2:
在remove_bind_v2.ldif
:
dn: cn=config
delete: olcAllows
ldapmodify -H ldapi:// -Y EXTERNAL -f remove_bind_v2.ldif
Sendmail 别名解析仍能正常工作。
虽然我承认整个情况+解决方案倾向于证实 larsks 关于 sendmail 的论点,但我现在找到了一些可行的方法。是时候继续解决下一个问题了。