2.3. 使用宏访问控制指令
宏访问控制指令(ACI)可让您自动定制对 LDAP 条目区分名称(DN)或其部分的访问,并减少 ACI 的数量。
2.3.1. 宏访问控制说明示例 复制链接链接已复制到粘贴板!
下图显示带有后缀 dc=hostedCompany1,dc=example,dc=com
和 dc=hostedCompany2,dc=example,dc=com
的目录树,其重复子域模式。每个子域都有相同的 ou=groups
,ou=people
条目的结构。目录树使用宏访问控制指令(ACI)来减少 ACI 的总数。
在目录树中应用的 ACI 也具有重复的模式。例如,以下 ACI 位于 dc=hostedCompany1,dc=example,dc=com
节点上,并将 DomainAdmins
组的读和搜索权限授予该树中的任何条目:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
(version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
图 2.1. 宏 ACI 的目录树示例
以下 ACI 在 groupdn
关键字中显示 DN 的不同部分:
-
dc=hostedCompany1,dc=example,dc=com
节点包含以下 ACI:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
(version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com";)
-
dc=subdomain1,dc=hostedCompany1,dc=example,dc=com
节点包含以下 ACI:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
(version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
-
dc=hostedCompany2,dc=example,dc=com
节点包含以下 ACI:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany2,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
(version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=hostedCompany2,dc=example,dc=com";)
-
dc=subdomain1,dc=hostedCompany2,dc=example,dc=com
节点包含以下 ACI:
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany2,dc=example,dc=com";)
aci: (targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
(version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=DomainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany2,dc=example,dc=com";)
使用宏替换多个 ACI 用于重复模式。例如,要将上面的 ACI 减为一个,请使用以下宏:
aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com") (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
aci: (target="ldap:///ou=Groups,($dn),dc=example,dc=com")
(targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
(version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn],dc=example,dc=com";)
2.3.2. 宏访问控制指令语法 复制链接链接已复制到粘贴板!
宏访问控制指令(ACI)包含以下类型的表达式来替换 DN 或 DN 的一部分:
-
($DN)
, -
[$DN]
, -
($attr.attrName)
,其中 attrName 代表属性,它是目标条目的一部分。
ACI 关键字提供绑定凭证,它们是 ACI 主题。主题决定 ACI 的适用位置。
Macro | ACI 关键字 | 描述 |
---|---|---|
|
|
主题中的匹配和直接替换。它将与 |
|
| 替换主题子树中的多个 RDN。 |
|
|
将 |
请注意,如果使用任何宏,则必须定义包含 ($dn)
宏的目标。您可以组合 ($dn)
和 ($attr.attrName)
宏。
2.3.3. [$dn] 宏示例 复制链接链接已复制到粘贴板!
[$dn]
宏多次检查目标源的 DN。此宏丢弃每个迭代的最新 RDN 组件,直到找到匹配项为止。
例如,您在 cn=all,ou=groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com
子树中带有目标的 LDAP 请求,以及以下 ACI:
aci: (target="ldap:///ou=groups,($dn),dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=domainAdmins,ou=groups,[$dn],dc=example,dc=com";)
aci: (target="ldap:///ou=groups,($dn),dc=example,dc=com")
(targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=domainAdmins,ou=groups,[$dn],dc=example,dc=com";)
宏扩展如下:
-
目标中的
($dn)
与dc=subdomain1,dc=hostedCompany1
匹配。 主题中的
[$dn]
替换为dc=subdomain1,dc=hostedCompany1
。结果为
groupdn="ldap:///cn=domainAdmins,ou=Groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"。
如果绑定 DN 是该组的成员,则匹配过程将停止,并且评估 ACI。如果结果不匹配,则进程将继续并丢弃最左边的部分。主题中的 [$dn] 是
dc=hostedCompany1
。结果为
groupdn="ldap:///cn=domainAdmins,ou=Groups,dc=hostedCompany1,dc=example,dc=com"。
如果绑定 DN 不是该组的成员,则不会评估 ACI。如果是一个成员,则会评估 ACI。
[$dn]
宏授予对目录树中所有子域的访问权限。它可用于表达域之间的分层关系。例如,请考虑以下 ACI:
aci: (target="ldap:///ou=*, ($dn),dc=example,dc=com") (targetattr="*")(targetfilter=(objectClass=nsManagedDomain)) (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=domainAdmins,ou=groups,[$dn],dc=example,dc=com";)
aci: (target="ldap:///ou=*, ($dn),dc=example,dc=com")
(targetattr="*")(targetfilter=(objectClass=nsManagedDomain))
(version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=domainAdmins,ou=groups,[$dn],dc=example,dc=com";)
此 ACI 向 dc=hostedCompany1
下的所有子域授予 cn=domainAdmins,ou=groups,dc=hostedCompany1,dc=example,dc=com
的访问权限。属于该组成员的管理员可以访问 ou=body,dc=subdomain1.1,dc=subdomain1
等子树。但是 cn=domainAdmins,ou=groups,dc=subdomain1.1
的成员无法访问 ou=people,dc=hostedCompany1
和 ou=people,dc=subdomain1,dc=hostedCompany1
节点。
2.3.4. ($dn)宏示例 复制链接链接已复制到粘贴板!
($dn)
宏将替换值与 LDAP 请求中的条目进行比较。例如,LDAP 请求以条目为目标:
cn=all,ou=groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com
cn=all,ou=groups,dc=subdomain1,dc=hostedCompany1,dc=example,dc=com
ACI 定义以下目标:
(target="ldap:///ou=groups,($dn),dc=example,dc=com")
(target="ldap:///ou=groups,($dn),dc=example,dc=com")
($dn)
宏与本例中的 dc=subdomain1,dc=hostedCompany1
匹配。
当 ACI 主题使用 ($dn)
宏时,与目标匹配的子字符串会扩展主题:
aci: (target="ldap:///ou=*,($dn),dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=domainAdmins,ou=groups,($dn),dc=example,dc=com";)
aci: (target="ldap:///ou=*,($dn),dc=example,dc=com")
(targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search)
groupdn="ldap:///cn=domainAdmins,ou=groups,($dn),dc=example,dc=com";)
ACI 扩展如下:
aci: (target="ldap:///ou=groups,dc=subdomain1,dc=hostedCompany1, dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=domainAdmins,ou=groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
aci: (target="ldap:///ou=groups,dc=subdomain1,dc=hostedCompany1,
dc=example,dc=com") (targetattr = "*") (version 3.0; acl "Domain
access"; allow (read,search) groupdn="ldap:///cn=domainAdmins,ou=groups,
dc=subdomain1,dc=hostedCompany1,dc=example,dc=com";)
宏扩展后,红帽目录服务器会根据正常过程评估 ACI,以确定是否授予访问权限。
2.3.5. ($attr.attrName)宏示例 复制链接链接已复制到粘贴板!
您始终使用 ($attr.attrName)
宏作为 DN 的一部分。例如,定义以下 roledn
:
roledn = "ldap:///cn=DomainAdmins,($attr.ou),dc=HostedCompany1,dc=example,dc=com"
roledn = "ldap:///cn=DomainAdmins,($attr.ou),dc=HostedCompany1,dc=example,dc=com"
假设服务器接收以以下条目为目标的 LDAP 操作:
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com cn: Jane Doe sn: Doe ou: Engineering...
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com
cn: Jane Doe
sn: Doe
ou: Engineering...
要评估 ACI 的 roledn
部分,服务器会在目标条目中查看 ou
属性,并使用此属性的值来扩展宏。roledn
扩展如下:
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com"
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com"
Red Hat Directory Server 根据正常的 ACI 评估算法评估 ACI。
如果属性具有多个值,则 RHDS 使用每个值来扩展宏,并使用第一次成功与扩展宏匹配的值。例如:
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com cn: Jane Doe sn: Doe ou: Engineering ou: People...
dn: cn=Jane Doe,ou=People,dc=HostedCompany1,dc=example,dc=com
cn: Jane Doe
sn: Doe
ou: Engineering
ou: People...
当红帽目录服务器评估 ACI 时,它会在以下扩展表达式上执行逻辑 OR :
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com" roledn = "ldap:///cn=DomainAdmins,ou=People,dc=HostedCompany1,dc=example,dc=com"
roledn = "ldap:///cn=DomainAdmins,ou=Engineering,dc=HostedCompany1,dc=example,dc=com"
roledn = "ldap:///cn=DomainAdmins,ou=People,dc=HostedCompany1,dc=example,dc=com"