允许任何具有特定 uid 的用户管理整个 OU

允许任何具有特定 uid 的用户管理整个 OU

我有一个域名(我们称之为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 来调试 ACLloglevel stats ACL
  • slapd.访问(5)非常小心,而且不只一次!

例如,示例 ACL #2 中的 AFAICS 掩盖了 ACL #3。

帮自己一个忙:不要再临时发明这个轮子了,仔细看看我的Æ-DIR。它有许多 ACL,用于强制执行委派管理并根据清晰的数据模型限制可见性。作为作者,我当然有偏见。否则,我很清楚,如果你按照这条路线走,你面前有多少工作要做……

相关内容