OpenLDAP ACL 的使用集

OpenLDAP ACL 的使用集

因此,我正在尝试编写一些 LDAP 规则,以允许某些人编写一些子树。

假设我们有这个用户:

dn: uid=minion1,o=mycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: TRUE

还有这个用户:

dn: uid=minion2,o=mycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: FALSE

哦,还有这位用户:

dn: uid=minion3,o=notmycompany,ou=cust,dc=some,dc=domain
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
isAdmin: FALSE

我正在尝试设置 minion1 的权限来修改 minion2 的账户,但不能设置 minion3 的权限(如果你看一下,minion3 在不同的组织“notmycompany”中,而其他两个在“mycompany”中)。

基本规则是,如果“isAdmin”属性设置为 TRUE,并且对象与他/她希望修改的用户位于同一组织中,则用户应该能够添加/修改/删除其组织中的条目。

我的部分工作的 ACL 是:

to dn.regex="^.+o=([^,]+),ou=cust,dc=some,dc=domain$" 
by set="user/isAdmin & [TRUE]" write 

这当然也允许他们修改 minion3 的账户。我想补充一下

"[^.+,o=$1,ou=cust,dc=some,dc=domain$]"

按照上面的指示去做,但到目前为止我失败了。有人有什么好主意可以让我试试吗?(我在这里充分解释了我试图做什么吗)?

提前致谢;

答案1

我花了一些时间浏览集合文档,而您遇到的问题是集合运算符(如&)实际上只对同一类型的数据起作用……因此您可以要求 DN 与 DN 的交集,或者属性值与字符串的交集,但不同类型的事物的交集是没有意义的。

因此,我们使用属性isAdmin和字符串连接的奇妙之处来构建一个字符串,如下所示:

olcAccess: {1}to dn.regex="o=([^,]+),ou=cust,dc=some,dc=domain$" 
    by set.expand="([admin=] + user/isAdmin + [,] + user/-1) & ([admin=TRUE] + [,o=$1,ou=cust,dc=some,dc=domain])" write 
    by * break

请注意 的用户set.expand,因为我们想要$1在集合定义中使用,并注意使用[...]将文字值放入我们正在评估的字符串中。

对于以 身份登录的用户minion1,这将要求提供以下交集:

admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain

和文字值:

admin=TRUE,o=mycompany,ou=cust,dc=some,dc=domain

这是一个非空集,因此它有效。对于具有isAdmin=FALSE(或没有isAdmin)属性的人,比较将是admin=FALSE,...admin=,...。同样,对于与目标不在同一组织中的人o=...,交集将产生一个空集。

如果你有兴趣,是我实际用于测试的。我使用employeeType而不是isAdmin因为我不想在向架构中添加新属性时浪费时间。

另外:slapd -dacl ...是你的朋友。

相关内容