sendmail 和基于 LDAP 的别名

sendmail 和基于 LDAP 的别名

环境: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 的论点,但我现在找到了一些可行的方法。是时候继续解决下一个问题了。

相关内容