Ldap

無法在 macOS 客戶端上驗證 OpenLDAP 使用者“找不到使用者:數據庫中沒有秘密”

  • May 5, 2022

我有一個執行 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 Sierra,或者El 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 登錄時不斷出現問題,是否有一個簡單的解決方案來解決這個問題?

我做了一些研究並遇到了一些事情(IE this)但是,我遇到的方向和想法並不清楚,而且似乎每個人的工作方式都不同。任何幫助或正確方向的觀點將不勝感激。謝謝

我想到了!

好的,問題是 macOS 嘗試使用CRAM-MD5. OpenLDAP 預設為 DIGEST-MD5。為了使其工作,您必須在 SASL 身份驗證失敗時將散列算法添加到 plist 中。為此:

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,這樣您就不必再搞砸了!

我最近遇到了這個問題。當 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

引用自:https://serverfault.com/questions/916745