我有以下 openldap 服务器配置:
access to attrs=userPassword
by self write
by anonymous auth
by set="[cn=users,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * none
# Allow everybody adding and changing Contacts
access to dn.subtree="ou=Contacts,dc=my-company,dc=de"
by set="[cn=users,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read
access to *
by self write
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read
它应该做的是这样的:
- 允许每个人更改自己的密码
- 允许所有用户添加和更改联系人
- 允许“sysadm”组中的所有人更改所有内容
问题是,sysadms 无法更改任何用户密码。有什么提示吗?
答案1
访问指令的评估顺序使得它们在配置文件中的位置很重要。如果一个访问指令在所选条目方面比另一个访问指令更具体,则它应该首先出现在配置文件中。同样,如果一个选择器比另一个选择器更具体,它应该首先出现在访问指令中。
长话短说,请尝试以下操作:
access to attrs=userPassword
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by self write
by anonymous auth
by * none
# Allow everybody adding and changing Contacts
access to dn.subtree="ou=Contacts,dc=my-company,dc=de"
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by set="[cn=users,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read
access to *
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by self write
by * read
顺便问一下,你真的想授予所有用户访问他们自己对象的所有属性的权限吗('通过自写访问*...')? 由于您仅在第一个 ACL 中限制对 userPassword 属性的写访问,因此我认为这不是您想要的。
答案2
如果你这样做,会发生什么情况?
access to dn.subtree"[cn=users,ou=Group,dc=my-company,dc=de]"
by self write
by dn.base="cn=admin,dc=my-company,dc=de" write
by set="[cn=sysadm,ou=Group,dc=my-company,dc=de]/memberUid & user/uid" write
by * read
答案3
IIRC slapd 使用第一个匹配规则。由于第一个块匹配用户密码但不允许系统管理员修改,因此他们无权修改。