OpenLDAP用户认证失败(错误码49)排查求助
看起来你已经做了不少基础排查工作——确认用户存在、手动重置密码,但还是碰到了ldap_bind: Invalid credentials (49)这个头疼的错误,咱们一步步拆解可能的问题点:
先排查密码存储与匹配的细节
你用slappasswd -s tree生成的是SSHA哈希(从userPassword::开头的base64编码能看出来),格式本身没问题,但可以做两个验证:- 打开你生成的
test.ldif,检查userPassword的值是否和slappasswd -s tree直接输出的完全一致,避免变量传递时出现截断或乱码; - 临时改用明文密码测试(仅用于排查,不要在生产环境这么做):修改LDIF里的
userPassword为{CLEARTEXT}tree,执行ldapmodify后再用ldapwhoami测试。如果成功,说明哈希生成或存储环节出了问题;如果还是失败,那问题不在密码本身。
- 打开你生成的
检查ACL配置的潜在问题
你的ACL规则看起来逻辑没问题:{1}to attrs=userPassword by self write by anonymous auth by * none允许匿名用户尝试认证,但可以再确认两点:- 有没有其他更高优先级的ACL规则覆盖了这条?比如第一条
{0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage是给root权限的,不会影响普通用户,但可以检查是否有遗漏的ACL条目; - 尝试用匿名用户执行
ldapsearch -x -b "uid=testuser,ou=people,dc=foo,dc=bar,dc=nl" userPassword,正常应该返回no such attribute或者权限不足,但如果连这个查询都报错,可能ACL的权限控制有问题。
- 有没有其他更高优先级的ACL规则覆盖了这条?比如第一条
切换连接方式测试
你现在用的是ldapi:///Unix套接字连接,有些OpenLDAP配置会对本地套接字连接有额外限制。试试用TCP连接测试:ldapwhoami -x -D "uid=testuser,ou=people,dc=foo,dc=bar,dc=nl" -w tree -H ldap://localhost如果TCP连接能成功,说明Unix套接字的配置有问题(比如socket文件权限、slapd的socket路径配置错误等)。
查看slapd日志获取精准错误信息
错误码49只是笼统的“无效凭据”,但slapd的日志会给出具体原因——比如是密码不匹配、用户找不到,还是权限不足。
去查看slapd的日志文件(通常在/var/log/slapd.log或/var/log/openldap/slapd.log),执行ldapwhoami测试后,看日志里的详细报错,这是最有效的排查手段。确认用户对象的属性完整性
你的用户对象包含person、inetOrgPerson、posixAccount三个objectClass,检查所有必填属性是否都已设置:inetOrgPerson需要cn、sn(你已经有了);posixAccount需要uidNumber、gidNumber、homeDirectory(这些也都配置了);
可以用ldapsearch查询用户的所有属性,确保没有缺失必填项。
如果以上步骤都没解决问题,可以提供slapd的日志片段,或者olcDatabase的完整配置,这样能更精准地定位问题。
备注:内容来源于stack exchange,提问作者XGDragon

