我对 OpenLDAP ACL 配置这一神秘科学感到困惑。我想将用户登录数据存储在 OpenLDAP 中,并将其提供给多个服务,以便用户可以对所有服务使用相同的用户名和密码。
我在 VPS 上设置了 Virtualmin/Webmin,并使用以下说明设置了 OpenLDAP 和 Webmin:https://www.virtualmin.com/documentation/installation/ldap/ 这样,就可以从 LDAP 中检索 Unix 用户和 Webmin 用户的帐户数据。
现在我想尽可能地限制 LDAP ACL,但不知道如何做。我想到了以下策略:
- 服务的每个 LDAP 用户都应具有必要的最少读/写权限以使服务正常运行。
- 匿名 LDAP 用户应该能够登录,但不能读取任何内容。
- 与人类相对应的 LDAP 用户不应该能够读取/写入除了他们自己的属性之外的任何内容(直到有必要为止)。
使用这些说明我为 OpenLDAP 提出了以下 ACL:
olcAccess: {0}to * by dn="cn=admin,dc=example,dc=com" write by * break
olcAccess: {1}to * attrs=userPassword by self =xw by anonymous auth by * none
olcAccess: {2}to * attrs=shadowLastChange by self write by users read
olcAccess: {3}to dn.subtree=ou=WebminUG,dc=example,dc=com by dn="uid=WebminUG,ou=sysusers,dc=example,dc=com" write by users read
olcAccess: {4}to * by users read
假设基本 DN 是dc=example,dc=com
。
遗憾的是,无论出于什么原因,此 ACL 都不起作用。尝试登录 Webmin 时会显示“登录失败。请重试。”如果用户名或密码不匹配,则会显示相同的消息。即使su Username
在 shell 中也不起作用(如果Username
LDAP 中存储了某个 Unix 用户),错误表明该用户不存在。
目前,我将 ACL 设置为olcAccess: to * by users write by anonymous read
,因为我不知道如何在不破坏设置的情况下使其更加严格。
你能帮我弄清楚该怎么办吗?为什么我的配置拒绝访问?如有必要,我很乐意提供更详细的信息。
编辑: 我认为它失败了,因为我忘了添加“catch-all”规则。以下有效:
olcAccess: {0}to * by dn="cn=admin,dc=mueli-deisswil,dc=ch" write by * break
olcAccess: {1}to * attrs=userPassword by self =xw by anonymous auth by * none
olcAccess: {2}to * attrs=shadowLastChange by self write by users read
olcAccess: {3}to dn.subtree=ou=WebminUG,dc=example,dc=com by dn="uid=WebminUG,ou=sysusers,dc=example,dc=com" write by users read
olcAccess: {4}to * by users write by anonymous read
但是,如果我将最后一行更改为to * by users read by anonymous auth
,或者仅将两个权限中的一个更改为read
/ auth
,那么它会再次失败。
有没有没有的解决方案to * by anonymous read
?
为了更容易理解目录的布局如下:
dc=example,dc=com // Base DN
ou=people,dc=example,dc=com // Here "human users" are stored
uid=Elie,ou=people,dc=example,dc=com // Entry of Elie Xample. ;)
ou=unix-groups,dc=example,dc=com // Here unix groups corresponding to unix accounts are stored
cn=Elie,ou=unix-groups,dc=example,dc=com
ou=sysusers,dc=example,dc=com // Here the users of services are stored
uid=WebminUG,ou=sysusers,dc=example,dc=com
uid=NextCloud,ou=sysusers,dc=example,dc=com
ou=WebminUG,dc=example,dc=com // Here the data of Webmin-Users is stored
cn=Elie,ou=WebminUG,dc=example,dc=com // The Webmin-User of Elie Xample