我正在尝试限制用户自己userPassword
属性的写权限。但几个小时以来一直失败。以下是我目前所做的:
- 在 Arch Linux 上安装 OpenLDAP 2.4
- 配置了基本 DN(
dc=exmaple,dc=org
)和管理器,以便通过 Apache Directory Studio 进行修改、添加和删除 - 添加了两个组织单位
people
和group
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
(强制覆盖) 标志。