我的 OpenLDAP 服务器中有多个 DIT。我让用户 cn=config 成为 root,这样 cn=config 就可以拥有所有 DIT(每个 DIT)的 root 访问权限。此外,每个 DIT 都有一个管理员,ID 为 cn=admin,$suffix [例如 cn=admin,dc=example,dc=com 或其他]。
我向管理员和用户对象添加了自定义 NAME 属性。该属性名为:“serviceLevel”,值为“suspended”或“normal”。该属性是可选的,当不存在时,我们将其解释为正常 - 未暂停。
目前,当 serviceLevel 设置为“suspended”时,我的 ACL 会暂停普通用户,但不会暂停本地/DIT 管理员。我需要管理员无法像普通用户一样进行身份验证。
当前 LDIF 设置 ACL 的示例如下:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
filter=(serviceLevel=suspended)
by dn="cn=config" write
by * none
olcAccess: {1}to attrs=userPassword,shadowLastChange
filter=(!(serviceLevel=suspended))
by self write
by anonymous auth
by dn="cn=admin,dc=directory,dc=com" write
by dn="cn=config" write
by * none
olcAccess: {2}to dn.base="" by * read
olcAccess: {3}to *
filter=(serviceLevel=suspended)
by dn="cn=config" write
by * none
olcAccess: {4}to *
filter=(!(serviceLevel=suspended))
by self write
by dn="cn=admin,dc=directory,dc=com" write
by dn="cn=config" write
by * read
如果您知道域管理员为何会绕过我的 ACL,请提供建议。我显然不明白如何正确设置这些规则。
答案1
我认为你采取的方法过于复杂。要禁用 DIT,请禁用其相应的数据库。这可以通过设置来实现olcHidden: TRUE
。
olcHidden: TRUE | FALSE
控制是否使用数据库来回答查询。隐藏的数据库永远不会被选中来回答任何查询,并且在检查与其他数据库的冲突时,将忽略数据库上配置的任何后缀。默认情况下,olcHidden 为 FALSE。
ldapmodify <<EOF
dn: olcDatabase={2}hdb,cn=config
replace: olcHidden
olcHidden: TRUE
EOF
补充说明:
无论定义了什么访问控制策略,rootdn 始终被允许具有全部权限(即对任何事物进行授权、搜索、比较、读取和写入)。
因此,在子句中明确列出 rootdn 是无用的(并且会导致性能下降)。——
OpenLDAP Software 2.4 Administrator's Guide