我正在使用 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
输入,如下所示:break
stop
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