OpenLDAP 身份验证故障排除

OpenLDAP 身份验证故障排除

我正在使用 slapd.d/ 配置样式运行 OpenLDAP 服务。我正在测试创建用户并以用户身份进行身份验证。这是我的测试脚本,以失败结束:ldap_bind: Invalid credentials (49)

ldapsearch -H ldapi:/// -Y EXTERNAL -b "dc=foo,dc=bar,dc=nl"

为我提供相关用户(以及其他用户)

dn: uid=testuser,ou=people,dc=foo,dc=bar,dc=nl
givenName: Test
sn: User
uid: testuser
objectClass: person
objectClass: inetOrgPerson
objectClass: posixAccount
uidNumber: 2002
gidNumber: 2003
loginShell: /bin/bash
homeDirectory: /home/testuser
cn: TestUser
userPassword:: e1NTSEF9eGI2Y3ZrbVByd2lPT01HT0RQWFUyZitEYm5xdy9JaHE=

为了进行健全性检查,我使用以下方法更改密码

result=$(slappasswd -s tree)

echo "dn: uid=testuser,ou=people,dc=foo,dc=bar,dc=nl" > test.ldif
echo "changetype: modify" >> test.ldif
echo "replace: userPassword" >> test.ldif
echo "userPassword: $result" >> test.ldif

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

ldapsearch -H ldapi:/// -Y EXTERNAL -b "dc=foo,dc=bar,dc=nl"

再次,确实显示密码更改成功:

dn: uid=testuser,ou=people,dc=foo,dc=bar,dc=nl
...
userPassword:: e1NTSEF9RTBnNDkxR0FPSzg0ZUt6M2dleWl1TWI3VHk1SURzekY=

ldapwhoami -x -D "uid=testuser,ou=people,dc=foo,dc=bar,dc=nl" -w tree -H ldapi:///

返回

ldap_bind: Invalid credentials (49)

我误解了什么?如果需要更多详细信息,我可以提供。

例如,我的 olcAccess 属性是:

olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage
olcAccess: {1}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {2}to attrs=shadowLastChange by self write by * read
olcAccess: {3}to * by * read

答案1

您的 ACL 规则拒绝匿名客户端进行“auth”访问,因为您的 {0} 规则不是 fall-through:

to *
  by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage

如果请求匹配to *,但没有匹配任何by条目,那么它将到达一个隐式最后by * none stop一条记录(有点像 iptables 链策略)将拒绝所有其他访问to *也就是说,如果明确指定了所有默认值,则相同的规则将如下所示:

to *
  by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage [stop]
  [by * none stop]

为了使整个规则成功,您需要使用选项而不是默认值进行显式by * none输入,如下所示:breakstop

to *
  by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage
  by * break

(为了进行比较,带有 userPassword 的 {1} 规则是故意地非贯穿性,因此它的by * none末尾有一个扩展为by * none stop。)


每个条目有三种模式by

  • stop(默认)完全结束检查。
  • break退出当前“到”部分,但继续尝试其他“到”部分。
  • continue继续尝试同一节中的其他“by”条目。(它们可以相加,例如,授予一个“by”读取权限,并授予另一个“by”写入权限。)

答案2

我认为您必须将用于生成密码的哈希算法类型放在 ldif 中的密码值前面(以便让 openldap 知道您已经对密码进行了哈希处理)。如果没有指定,slappasswd 应该使用{SSHA},因此你应该按以下方式设置你的 ldif

result=$(slappasswd -s tree)

echo "dn: uid=testuser,ou=people,dc=foo,dc=bar,dc=nl" > test.ldif
echo "changetype: modify" >> test.ldif
echo "replace: userPassword" >> test.ldif
echo "userPassword: {SSHA}$result" >> test.ldif

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

参考。根据开放 LDAP 为用户设置已散列的密码

相关内容