使用重复目录树结构的组织可以通过宏来优化目录中所使用的 ACI 的数量。如果减少目录树中的 ACI 数,将更容易管理访问控制策略。此外,还会提高 ACI 内存使用的效率。
宏是一种占位符,用于在 ACI 中表示 DN 或 DN 的一部分。可以使用宏来表示 ACI 目标部分和/或绑定规则部分中的 DN。实际上,当目录服务器收到传入的 LDAP 操作时,将根据 LDAP 操作的目标资源对 ACI 宏进行匹配。进行匹配的目的是为了找出匹配的子串(如果有)。如果存在匹配项,将使用匹配的子串扩展绑定规则端的宏,并通过评估已扩展的绑定规则来确定对资源的访问权限。
本部分包含宏 ACI 的示例和有关宏 ACI 语法的信息。
使用示例说明宏 ACI 的优点及其工作方式最为清楚。图 7–1显示了一个目录树,您可以在该目录树中使用宏 ACI 来有效减少 ACI 的总数。
请注意,在此图例中,相同的树结构 (ou=groups,ou=people) 具有重复的子域模式。此模式在整个树中也是重复的,因为 Example.com 目录树存储两个后缀 dc=hostedCompany2,dc=example,dc=com 和 dc=hostedCompany3,dc=example,dc=com(图中未显示)。
目录树中的 ACI 也具有重复的模式。例如,以下 ACI 位于 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";) |
此 ACI 为 domainAdmins 组授予对 dc=hostedCompany1,dc=example,dc=com 树中任何条目的读取和搜索权限。
以下 ACI 位于 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";) |
以下 ACI 位于 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";) |
以下 ACI 位于 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";) |
以下 ACI 位于 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 中,唯一的不同之处是在 groupdn 关键字中指定的 DN。通过为 DN 使用宏,可以在树的根部(即 dc=example,dc=com 节点上)使用一个 ACI 替换这些 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";) |
请注意,此时需要使用之前未使用的关键字 target。
在上述示例中,ACI 的数量从四个减少到一个。但其真正的好处取决于您在整个目录树中的重复模式数。
为了简便起见,本部分将用于提供绑定凭证的 ACI 关键字(如 userdn、roledn、groupdn 和 userattr)统称为 ACI 的主题。主题可确定应用 ACI 的对象。
下表显示可用于替换特定 ACI 关键字的宏。
表 7–1 宏 ACI 关键字
宏 |
描述 |
ACI 关键字 |
---|---|---|
($dn) |
用于在目标中进行匹配,并在主题中直接替换。 |
target、targetfilter、userdn、roledn、groupdn、userattr |
[$dn] |
用于替换在主题的子树中使用的多个 RDN。 |
targetfilter、userdn、roledn、groupdn、userattr |
($attr.attrName) |
用于将目标条目中的 attributeName 属性值替换到主题中。 |
userdn、roledn、groupdn、userattr |
宏 ACI 关键字具有以下限制:
在主题中使用 ($dn) 和 [$dn] 宏时,必须定义包含 ($dn) 宏的目标。
可以在主题中结合使用 ($dn) 宏(而非 [$dn] 宏)和 ($attr.attrName) 宏。
ACI 目标中的 ($dn) 宏通过比较自身与 LDAP 请求的目标条目来确定替换值。例如,您的 LDAP 请求将以下条目作为目标:
cn=all,ou=groups,dc=subdomain1, dc=hostedCompany1,dc=example,dc=com |
此外,您还具有按如下方式定义目标的 ACI:
(target="ldap:///ou=Groups,($dn),dc=example,dc=com") |
($dn) 宏与 "dc=subdomain1, dc=hostedCompany1" 相匹配。因此会将此子串用作 ACI 主题中的替换值。
在 ACI 的主题中,($dn) 宏将被替换为目标中匹配的整个子串。例如:
groupdn="ldap:///cn=DomainAdmins,ou=Groups,($dn),dc=example,dc=com" |
此主题将变为:
groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com" |
扩展宏之后,目录服务器将在完成普通进程后评估 ACI,以确定是否授予访问权限。
与标准 ACI 不同,使用宏替换的 ACI 不一定会授予对目标条目的子条目的访问权限。这是因为当目标为子 DN 时,替换可能不会在主题字符串中创建有效 DN。
[$dn] 的替换机制与 ($dn) 略有不同。将对目标资源的 DN 进行多次检查,每次都舍弃最左侧的 RDN 部分,直到找到匹配项为止。
例如,假定您的 LDAP 请求将 cn=all,ou=groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com 子树作为目标,并具有以下 ACI:
aci: (targetattr="*") (target="ldap:///ou=Groups,($dn),dc=example,dc=com") (version 3.0; acl "Domain access"; allow (read,search) groupdn="ldap:///cn=DomainAdmins,ou=Groups,[$dn], dc=example,dc=com";) |
服务器将按如下方式继续操作,以扩展此 ACI:
服务器验证目标中的 ($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 不是其成员,则此过程将继续。
服务器将主题中的 [$dn] 替换为 dc=hostedCompany1。
得到的主题为 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com"。再次将绑定 DN 作为此组的成员进行测试,如果是其成员,则对此 ACI 进行完全评估。如果此绑定 DN 不是其成员,宏扩展将在最后一个具有匹配值的 RDN 处停止,并且对此 ACI 的评估将结束。
[$dn] 宏的优点在于它提供了一种灵活的方法,可以为域级别管理员授予对目录树中所有子域的访问权限。因此,[$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 为 cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com 的成员授予对 dc=hostedCompany1 下所有子域的访问权限。因此,属于该组的管理员可以访问 ou=people,dc=subdomain1.1,dc=subdomain1 等子树。
但同时将拒绝 cn=DomainAdmins,ou=Groups, dc=subdomain1.1 的成员访问 ou=people,dc=subdomain1, dc=hostedCompany1 和 ou=people,dc=hostedCompany1 节点。
将始终在 DN 的主题部分使用 ($attr.attrname) 宏。例如,您可以定义以下 roledn:
roledn = "ldap:///cn=DomainAdmins,($attr.ou),dc=HostedCompany1,dc=example,dc=com" |
现在假定服务器收到了将以下条目作为目标的 LDAP 操作:
dn: cn=Babs Jensen,ou=People,dc=HostedCompany1,dc=example,dc=com cn: Babs Jensen sn: Jensen ou: Sales ... |
为了评估 ACI 的 roledn 部分,服务器会读取存储在目标条目中的 ou 属性值。然后,服务器将在主题中替换此值以扩展宏。在此示例中,roledn 将按如下方式扩展:
roledn = "ldap:///cn=DomainAdmins,ou=Sales,dc=HostedCompany1,dc=example,dc=com" |
然后目录服务器将根据普通 ACI 评估算法来评估此 ACI。
如果宏中指定的属性为多值属性,将依次使用每个值来扩展宏。将使用提供成功匹配的第一个值。