LDAP搜索返回"No such object"问题排查与解决
LDAP普通用户无法搜索自身条目导致Phabricator认证失败
问题场景
我之前碰到过完全一样的情况:用LDAP管理员账号搜用户条目毫无问题,但用普通用户自己的账号执行相同搜索时,却返回No such object错误,直接导致Phabricator的LDAP认证卡壳。具体表现如下:
- 管理员账号搜索命令(执行成功,返回1条结果):
ldapsearch -h localhost -p 389 -b "dc=pieye,dc=org" "cn=Markus Proeller" -D "cn=admin,dc=pieye,dc=org" -W - 普通用户账号搜索命令(执行失败,返回
result: 32 No such object):ldapsearch -h localhost -p 389 -b "dc=pieye,dc=org" "cn=Markus Proeller" -D "cn=Markus Proeller,ou=people,dc=pieye,dc=org" -W
问题根源
这个问题的核心是OpenLDAP的权限配置限制了普通用户读取目录条目,默认情况下普通用户可能没有足够权限搜索到自己的信息,进而导致认证流程失败。
解决步骤
通过修改OpenLDAP的olcAccess权限规则就能搞定,具体操作如下:
- 新建一个
ldap.ldif文件,写入以下配置内容:dn: olcDatabase={1}hdb,cn=config changetype: modify delete: olcAccess - add: olcAccess olcAccess: to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=pieye,dc=org" write by anonymous auth by * none olcAccess: to * by self write by dn="cn=admin,dc=pieye,dc=org" write by users read by * none - 执行命令将配置应用到LDAP服务器:
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f ldap.ldif
配置说明
这个权限规则的逻辑很明确:
- 针对
userPassword和shadowLastChange这类敏感属性:仅允许用户自身修改,管理员也有写入权限,匿名用户只能用于认证,其他用户完全无权限 - 针对所有其他条目和属性:允许用户自身修改,管理员拥有完全读写权限,同时开放所有普通用户的只读权限,这样普通用户就能正常搜索到自己的条目了
配置完成后,再用普通用户账号执行搜索命令就能得到和管理员一样的结果,Phabricator的LDAP认证也能正常运行了。
内容的提问来源于stack exchange,提问作者Markus




