slapd.conf ACL:ldap_modify:访问权限不足(50)

slapd.conf ACL:ldap_modify:访问权限不足(50)

我正在尝试限制用户自己userPassword属性的写权限。但几个小时以来一直失败。以下是我目前所做的:

  • 在 Arch Linux 上安装 OpenLDAP 2.4
  • 配置了基本 DN(dc=exmaple,dc=org)和管理器,以便通过 Apache Directory Studio 进行修改、添加和删除
  • 添加了两个组织单位peoplegroup
  • ou=people在-uid=timo,ou=people,dc=example,dc=org下添加了两个用户uid=heike,...

接下来我想做的是能够修改用户自己的用户密码。为此,我创建了一个changepw.ldif文件。

dn: uid=timo,ou=people,dc=example,dc=org
changetype: modify
replace: userPassword
userPassword: newpw

并像这样应用它

$ ldapmodify -x -D "uid=timo,ou=people,dc=example,dc=org" -W -f changepw.ldif
modifying entry "uid=timo,ou=people,dc=example,dc=org"
ldap_modify: Insufficient access (50)

我首先使用 Apache Directory Studio 设置了 uid=timo 的用户密码,并验证其是否正常工作

到目前为止,一切都按预期运行(至少符合我的期望 :-P)。因此,我向 /etc/openldap/slapd.conf 添加了访问控制,如下所示:

[...]
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

access  to attrs=userPassword by self write by anonymous auth by dn.base="cn=Manager,dc=example,dc=org" write by * none

#######################################################################
# MDB database definitions

database        mdb
[...]

并做了一些常见的事情:

$ slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
$ chown -R ldap:ldap /etc/openldap/slapd.d
$ systemctl restart slapd

并再次尝试。

$ ldapmodify -x -D "uid=timo,ou=people,dc=example,dc=org" -W -f changepw.ldif
modifying entry "uid=timo,ou=people,dc=example,dc=org"
ldap_modify: Insufficient access (50)

由于某种原因,访问被拒绝。我打开了 acl 日志记录并得到以下信息:

5f12f36a => access_allowed: result not in cache (userPassword)
5f12f36a => access_allowed: auth access to "uid=timo,ou=people,dc=example,dc=org" "userPassword" requested
5f12f36a => slap_access_allowed: backend default auth access granted to "(anonymous)"
5f12f36a => access_allowed: auth access granted by read(=rscxd)
5f12f36a => access_allowed: backend default write access denied to "uid=timo,ou=people,dc=example,dc=org"

我将非常感激您的帮助!

答案1

当我发现有一种工具可以slapacl测试 ACL 时,我想到了一个解决方案。

让我向您展示一下在进行任何更改之前它是什么样子的。

$ slapacl -F /etc/openldap/slapd.d/ -b "uid=timo,ou=people,dc=example,dc=org" -D "uid=timo,ou=people,dc=example,dc=org" -u userPassword
authcDN: "uid=timo,ou=people,dc=example,dc=org"
userPassword: read(=rscxd)

这基本上就是我已经想到的,并且它给了我足够的证据来质疑配置生成命令(slaptest -f ... -F ...)。

实际问题是配置目录(/etc/openldap/slapd.d)没有被覆盖

您必须先删除该目录,然后重新生成配置目录。

$ rm -rf /etc/openldap/slapd.d/*
$ slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
$ chown -R ldap:ldap /etc/openldap/slapd.d
$ systemctl restart slapd

测试本来应该是这样的。

$ slapacl -F /etc/openldap/slapd.d/ -b "uid=timo,ou=people,dc=example,dc=org" -D "uid=timo,ou=people,dc=example,dc=org" -u userPassword
authcDN: "uid=timo,ou=people,dc=example,dc=org"
userPassword: write(=wrscxd)

我希望有人能从我的发现中受益。但令人好奇的是,手册页中没有提到这一点,而且没有-f(强制覆盖) 标志。

相关内容