Sun Java System Directory Server Enterprise Edition 6.3 管理指南

高级访问控制:使用宏 ACI

使用重复目录树结构的组织可以通过宏来优化目录中所使用的 ACI 的数量。如果减少目录树中的 ACI 数,将更容易管理访问控制策略。此外,还会提高 ACI 内存使用的效率。

是一种占位符,用于在 ACI 中表示 DN 或 DN 的一部分。可以使用宏来表示 ACI 目标部分和/或绑定规则部分中的 DN。实际上,当目录服务器收到传入的 LDAP 操作时,将根据 LDAP 操作的目标资源对 ACI 宏进行匹配。进行匹配的目的是为了找出匹配的子串(如果有)。如果存在匹配项,将使用匹配的子串扩展绑定规则端的宏,并通过评估已扩展的绑定规则来确定对资源的访问权限。

本部分包含宏 ACI 的示例和有关宏 ACI 语法的信息。

宏 ACI 示例

使用示例说明宏 ACI 的优点及其工作方式最为清楚。图 7–1显示了一个目录树,您可以在该目录树中使用宏 ACI 来有效减少 ACI 的总数。

请注意,在此图例中,相同的树结构 (ou=groups,ou=people) 具有重复的子域模式。此模式在整个树中也是重复的,因为 Example.com 目录树存储两个后缀 dc=hostedCompany2,dc=example,dc=comdc=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 树中任何条目的读取和搜索权限。

图 7–1 宏 ACI 的示例目录树

示例目录树的剖析图,其中显示了 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 语法

为了简便起见,本部分将用于提供绑定凭证的 ACI 关键字(如 userdnroledngroupdnuserattr)统称为 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)

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 主题中的替换值。

在主题中替换 ($dn)

在 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) 略有不同。将对目标资源的 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:

  1. 服务器验证目标中的 ($dn) 是否与 dc=subdomain1,dc=hostedCompany1 相匹配。

  2. 服务器将主题中的 [$dn] 替换为 dc=subdomain1,dc=hostedCompany1

    得到的主题为 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"。如果因为绑定 DN 是该组的成员而授予访问权限,则宏扩展将停止,并对此 ACI 进行评估。如果绑定 DN 不是其成员,则此过程将继续。

  3. 服务器将主题中的 [$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=hostedCompany1ou=people,dc=hostedCompany1 节点。

($attr.attrName ) 的宏匹配

将始终在 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。

如果宏中指定的属性为多值属性,将依次使用每个值来扩展宏。将使用提供成功匹配的第一个值。