我完全是 LDAP 新手,可能犯了一些非常愚蠢的错误,所以希望有人能给我指出正确的方向。我在 Linux 下运行 openldap 2.4.23 中的 slapd。我遇到的问题是,从我在 slapd.conf 中设置的管理帐户(cn=Manager,dc=example,dc=com),我可以毫无问题地设置最终用户的密码:
# ldappasswd -D 'cn=Manager,dc=example,dc=com' -W -S 'uid=tsuraan,ou=People,dc=example,dc=com'
但是,从最终用户的角度来看,我可以运行搜索等操作,但无法更改密码:
$ ldapsearch -x -D "uid=tsuraan,ou=People,dc=example,dc=com" -W
Enter LDAP Password:
<results>
$ ldappasswd -D 'uid=tsuraan,ou=People,dc=example,dc=com' -W -S 'uid=tsuraan,ou=People,dc=example,dc=com'
New password:
Re-enter new password:
Enter LDAP Password:
Result: Insufficient access (50)
我还尝试使用 ldapmodify 直接更改 userPassword 属性,它给出了相同的 Insufficient access (50) 消息。我的 slapd ACL 部分如下所示:
access to *
by dn="uid=root,ou=People,dc=example,dc=com" write
by users read
by self write
by anonymous auth
access to attrs=userPassword,gecos,description,loginShell
by self write
access to attrs="userPassword"
by dn="uid=root,ou=People,dc=example,dc=com" write
by anonymous auth
by self write
by * none
而且,我有一个非 root 用户,其 LDIF 如下所示:
dn: uid=tsuraan,ou=People,dc=example,dc=com
uid: tsuraan
cn: tsuraan
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {crypt}x
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/tsuraan
谷歌今天没有给我任何支持,我不明白为什么我的用户无法写入他自己的 LDAP 节点,因为我到处都有“自行写入”,所以希望有人可以帮助我。
答案1
Lists of access directives are evaluated in the order they appear in
slapd.conf. When a <what> clause matches the datum whose access is
being evaluated, its <who> clause list is checked. When a <who> clause
matches the accessor's properties, its <access> and <control> clauses
are evaluated. Access control checking stops at the first match of the
<what> and <who> clause, unless otherwise dictated by the <control>
clause.
第一个匹配<what>
并<who>
尝试更改密码的是:
access to *
by users read
如果您将“访问 *”子句移至列表末尾,它应该可以正常工作。或者只需交换“用户读取”和“自写”的顺序即可。
ACL 是 OpenLDAP 配置中最棘手的部分,因此请slapd.access(5)
仔细阅读,并确保在编写一些非平凡内容之前完全理解 ACL 的工作原理。