无法在 macOS 客户端上对 OpenLDAP 用户进行身份验证“未找到用户:数据库中没有秘密”

无法在 macOS 客户端上对 OpenLDAP 用户进行身份验证“未找到用户:数据库中没有秘密”

我有一台运行 OpenLDAP 服务器的 Ubuntu 16.04 服务器。我能够正常看到所有内容:

serveradmin@Magic:~$ ldapsearch -x -H ldap://localhost -D cn=admin,dc=example,dc=com -W
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# example.com
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: work
dc: example

# admin, example.com
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
...

# Groups, example.com
dn: ou=Groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups

...

# Policies, example.com
dn: ou=Policies,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Policies
description: Password policy for users

# foo, People, example.com
dn: uid=foo,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
sn: foo
...

在我选择的任何 macOS 客户端上,从操作系统High SierraEl Capitan我可以运行:

a0216:data admin$ dscl localhost -list /LDAPv3/example.com/Users
foo
bar
...

这将检索我的所有用户的列表。


我使用 MacBook Pro 2016 版运行High Sierra。当我尝试在目录实用程序下以用户身份进行身份验证时,它成功允许我进行身份验证:

Jun 14 16:36:23 magic slapd[344850]: conn=1276 op=1 SRCH attr=uidNumber uid userPassword
Jun 14 16:36:23 magic slapd[344850]: conn=1276 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jun 14 16:36:24 magic slapd[344850]: conn=1277 fd=19 ACCEPT from IP=10.0.1.20:65410 (IP=0.0.0.0:389)
Jun 14 16:36:24 magic slapd[344850]: conn=1277 fd=19 closed (connection lost)
Jun 14 16:36:24 magic slapd[344850]: conn=1278 fd=19 ACCEPT from IP=10.0.1.20:65411 (IP=0.0.0.0:389)
Jun 14 16:36:24 magic slapd[344850]: conn=1278 op=0 SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
Jun 14 16:36:24 magic slapd[344850]: conn=1278 op=0 SRCH attr=supportedSASLMechanisms defaultNamingContext namingContexts schemaNamingContext saslRealm
Jun 14 16:36:24 magic slapd[344850]: conn=1278 op=0 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jun 14 16:36:24 magic slapd[344850]: conn=1278 op=1 BIND dn="uid=foo,ou=People,dc=example,dc=com" method=128
Jun 14 16:36:24 magic slapd[344850]: conn=1278 op=1 BIND dn="uid=foo,ou=People,dc=example,dc=com" mech=SIMPLE ssf=0
Jun 14 16:36:24 magic slapd[344850]: conn=1278 op=1 RESULT tag=97 err=0 text=

但是,如果我尝试在运行 或 的 iMac 上执行同样的事情High SierraEl Capitan我会得到以下结果:

Jun 14 16:40:04 magic slapd[344850]: conn=1345 op=3 SRCH attr=uidNumber uid userPassword
Jun 14 16:40:04 magic slapd[344850]: conn=1345 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jun 14 16:40:04 magic slapd[344850]: conn=1358 fd=19 ACCEPT from IP=10.0.1.67:49545 (IP=0.0.0.0:389)
Jun 14 16:40:04 magic slapd[344850]: conn=1358 fd=19 closed (connection lost)
Jun 14 16:40:04 magic slapd[344850]: conn=1359 fd=19 ACCEPT from IP=10.0.1.67:49546 (IP=0.0.0.0:389)
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=0 SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=0 SRCH attr=supportedSASLMechanisms defaultNamingContext namingContexts schemaNamingContext saslRealm
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=0 SEARCH RESULT tag=101 err=0 nentries=1 text=
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=1 BIND dn="" method=163
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=1 RESULT tag=97 err=14 text=SASL(0): successful result: security flags do not match required
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=2 BIND dn="" method=163
Jun 14 16:40:04 magic slapd[344850]: SASL [conn=1359] Failure: no secret in database
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=2 RESULT tag=97 err=49 text=SASL(-13): user not found: no secret in database
Jun 14 16:40:04 magic slapd[344850]: conn=1359 op=3 UNBIND
Jun 14 16:40:04 magic slapd[344850]: conn=1359 fd=19 close

我已经尝试了所有我能想到的方法,感觉答案就在眼前。有人知道为什么我尝试No secret in database从 iMac 登录时不断出现此问题吗?有没有什么简单的解决方案?

我做了一些研究,发现了一些事情(例如)然而,我遇到的方向和想法并不明确,似乎对每个人来说效果都不同。任何帮助或正确的方向都将不胜感激。谢谢

答案1

我最近遇到了这个问题。当 DIGEST-MD5 和 CRAM-MD5 机制作为服务器选项显示时,我无法使用户身份验证正常工作。我想在 LDAP 服务器上进行更改,而不是使用 plist 设置修改每个客户端。

以下两种方法通过阻止服务器使用 2 SASL MD5 机制来修复用户身份验证。使用绑定到 OpenLDAP 服务器版本 2.4.44 的 macOS Yosemite 和 Mojave 客户端进行了测试。

方法 1:设置 olcSaslSecProps noactive 选项,该选项将禁用所有易受主动非字典攻击的机制。(注意:还有其他选项,请参见:https://docs.oracle.com/javase/jndi/tutorial/ldap/security/sasl.html

vi modify_olcSaslSecProps.ldif

dn: cn=config
changetype: modify
replace: olcSaslSecProps
olcSaslSecProps: noplain,noanonymous,noactive

ldapmodify -Y EXTERNAL -H ldapi:/// -f modify_olcSaslSecProps.ldif

要查看修改前后的变化:

ldapsearch -H ldapi:/// -x -s base -b "" -LLL "+" | grep sasl

BEFORE:
supportedSASLMechanisms: GSS-SPNEGO
supportedSASLMechanisms: GSSAPI
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: EXTERNAL
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: LOGIN
supportedSASLMechanisms: PLAIN

AFTER:
supportedSASLMechanisms: GSS-SPNEGO
supportedSASLMechanisms: GSSAPI

方法 2:提供更多控制的方法是创建一个配置文件,允许所需的特定 SASL 机制。对我来说,在安装了 Cyrus SASL 2.1.26 包的 CentOS 7.9 服务器上。创建一个名为 slapd.conf 的文件,内容如下所示,然后重新加载 slapd 服务以使更改生效。根据需要用小写字母编辑 SASL 机制,每个机制之间有一个空格。

vi /usr/lib64/sasl2/slapd.conf

mech_list: plain login external gssapi gss-spnego

systemctl reload slapd.service

此外,olcSaslSecProps 应设置为“noplain,noanonymous”。

vi modify_olcSaslSecProps.ldif

dn: cn=config
changetype: modify
replace: olcSaslSecProps
olcSaslSecProps: noplain,noanonymous

ldapmodify -Y EXTERNAL -H ldapi:/// -f modify_olcSaslSecProps.ldif

答案2

我想到了!

好的,问题是 macOS 尝试使用 进行身份验证CRAM-MD5。OpenLDAP 默认为 DIGEST-MD5。为了使其正常工作,您必须将哈希算法添加到 plist 中,以防 SASL 身份验证失败。为此:

sudo su 
/usr/libexec/PlistBuddy -c "add ':module options:ldap:Denied SASL Methods:' string DIGEST-MD5" /Library/Preferences/OpenDirectory/Configurations/LDAPv3/yourldapserver.plist 
/usr/libexec/PlistBuddy -c "add ':module options:ldap:Denied SASL Methods:' string CRAM-MD5" /Library/Preferences/OpenDirectory/Configurations/LDAPv3/yourldapserver.plist
/usr/libexec/PlistBuddy -c "add ':module options:ldap:Denied SASL Methods:' string NTLM" /Library/Preferences/OpenDirectory/Configurations/LDAPv3/yourldapserver.plist
/usr/libexec/PlistBuddy -c "add ':module options:ldap:Denied SASL Methods:' string GSSAPI" /Library/Preferences/OpenDirectory/Configurations/LDAPv3/yourldapserver.plist 

重启 Mac,它就能正常工作了。另外,一定要复制 plist,这样就不用再费心了!

答案3

我在将 MacOS 与基于 OpenLDAP 的 IAM 解决方案集成时也遇到了这个问题,该解决方案具有散列密码,因此不支持 CRAM-MD5 或 DIGEST-MD5 等质询-响应机制:

MacOS 尝试在 LDAP 服务器的 rootDSE 属性中找到的 SASL 机制支持的SASL机制。因此,我没有在每个 MacOS LDAP 客户端中配置 SASL 机制,而是通过 OpenLDAP(静态)配置中的 ACL 将不需要的 SASL 机制隐藏起来。

以下两个 ACL 使除 EXTERNAL(用于 LDAPI 和 TLS 客户端证书)之外的所有 SASL 机制不可见:

# allow anonymous access to supportedSASLMechanisms: EXTERNAL
access to
  dn.base=""
  attrs=supportedSASLMechanisms
  val.regex="^EXTERNAL$"
    by * read
# deny access to all other SASL mech values
access to
  dn.base=""
  attrs=supportedSASLMechanisms
    by * none

相关内容