OpenLDAP 高级 ACL 配置

OpenLDAP 高级 ACL 配置

我的 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

相关内容