我有一个域名(我们称之为dc=example,dc=org
)
该域有一个分支(ou=users,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org
)。
simpleSecurityObject
此域中有一个( uid=admin,ou=managers,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org
)。
我需要uid=admin,***
用户对分支具有完全(manage
)访问ou=users,***
权限,因此我添加了以下olcAccess
记录:
to
dn.subtree="ou=users,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org"
by
dn.exact="uid=admin,ou=managers,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org"
它已添加到默认规则集:
dn: olcDatabase={1}mdb,cn=config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword,shadowLastChange by self write by dn="cn=a
dmin,dc=example,dc=org" write by anonymous auth by * none
olcAccess: {2}to * by self read by dn="cn=admin,dc=example,dc=org" write by
* none
olcAccess: {3}to dn.subtree="ou=users,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=
infra,dc=example,dc=org" by dn.exact="uid=admin,ou=managers,ou=ftp,ou=servi
ces,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org" manage
但似乎有些不对劲。当我运行 时ldapsearch -D uid=admin,ou=managers,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org -W -b ou=users,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org
,我得到以下结果:
# extended LDIF
#
# LDAPv3
# base <ou=users,ou=ftp,ou=services,dc=k9999,dc=z9999,dc=infra,dc=example,dc=org> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 32 No such object
# numResponses: 1
command terminated with exit code 32
该对象可用,并且cn=admin,dc=example,dc=org
可以毫无困难地看到它,因此看来我的访问规则是错误的。但到底是什么呢?
似乎默认规则 #2 ( {2} to * by self read by dn="cn=admin,dc=example,dc=org" write by * none
) 比我添加的规则更早触发。这是否意味着我应该总是在它之前添加我的自定义规则吗?
为什么有这条规则by * none
?它不是与OpenLDAP 文档?
默认访问控制策略是允许所有客户端读取
似乎规则#2(我的意思是这个:
to *
by self read
by dn="cn=admin,dc=example,dc=org" write
by * none
) 根本不是“默认”的。我刚刚发现了另一个 OpenLDAP 实例(我大约 4 年前部署了它)。这个实例(2.4.40)根本没有这样的规则。似乎它不是由 OpenLDAP 本身添加的,而是由其他人或其他东西手动添加的。我说得对吗?OpenLDAP 默认没有这样的规则吗?
答案1
一般建议:
- 顺序很重要!
这个一般性陈述适用于 ACL 的顺序和 <who> 子句的顺序。 - 每个 ACL 都隐式地以 结尾,
by * none
这意味着控制流在那里停止。 - 通过运行 slapd 来调试 ACL
loglevel stats ACL
- 读slapd.访问(5)非常小心,而且不只一次!
例如,示例 ACL #2 中的 AFAICS 掩盖了 ACL #3。
帮自己一个忙:不要再临时发明这个轮子了,仔细看看我的Æ-DIR。它有许多 ACL,用于强制执行委派管理并根据清晰的数据模型限制可见性。作为作者,我当然有偏见。否则,我很清楚,如果你按照这条路线走,你面前有多少工作要做……