Sun Java 徽标     上一章      目录      索引      下一章     

Sun 徽标
Sun Java(TM) System Directory Server 5 2004Q2 管理指南 

第 6 章
管理访问控制

对目录内容的访问控制是创建安全目录的一个不可或缺的组成部分。本章介绍了访问控制指令 (ACI),这些指令用于确定向访问目录的用户授予哪些权限。Directory Server 具有查看给定用户对给定条目拥有的有效权限的功能。该功能简化了复杂而功能强大的访问控制机制的管理。

在目录部署的规划阶段,您应当定义一种访问控制策略,用来服务于整体安全策略。有关规划访问控制策略的提示,请参阅《Directory Server Deployment Planning Guide》Chapter 7 中的 "Designing Access Control"

本章包括以下主题:


访问控制的原理

用于定义访问的机制叫做访问控制。当服务器接收到一个请求时,它使用用户在绑定操作中提供的验证信息,以及服务器中定义的访问控制指令 (ACI) 来确定是否允许其访问目录信息。服务器可以允许或拒绝诸如读取、写入、搜索或比较之类的权限。授予用户的权限级别可能取决于所提供的验证信息。

通过使用访问控制,您可以控制对整个目录、目录的子树、目录中的特定条目(包括定义配置任务的条目)、特定的条目特性集或特定的条目特性值的访问。可以为特定用户、属于特定组或角色的所有用户或目录的所有用户设置权限。最后,可以为由其 IP 地址或 DNS 名称标识的特定客户机定义访问。

ACI 结构

访问控制指令作为条目的特性存储在目录中。aci 特性是操作特性;它可用于目录中的每一个条目,而不管它是否是针对条目的对象类定义的。当 Directory Server 接收到来自客户机的 LDAP 请求时,它使用该特性来判断应授予或拒绝哪些权限。如果有明确的要求,aci 特性将在 ldapsearch 操作中被返回。

ACI 语句的三个主要部分是:

ACI 的权限和绑定规则部分被设置为一对,也被称为访问控制规则 (ACR)。对用于访问目标的指定权限是授予还是拒绝,这取决于相应的规则评估是否为 true。有关详细信息,请参阅 “ACI 语法”

ACI 位置

如果包含 ACI 的条目没有任何子条目,那么 ACI 将只应用于该条目。如果该条目具有子条目,那么 ACI 将应用于该条目本身以及它下面的所有条目。因此,当服务器评估条目的访问权限时,它会验证被请求条目和该条目根后缀基础之间的每一个条目的 ACI。

aci 特性是多值的,这意味着可以为同一条目或子树定义多个 ACI。

您可以在条目上创建一个 ACI,使之不直接应用于该条目,而是应用于其子树中的部分或全部条目。这样做的优点是,您可以在目录树中的较高级别上放置一个通用 ACI,以便有效地应用于可能位于树中下层位置上的条目。例如,在 organizationalUnit 条目或 locality 条目的级别上,可以为包括 inetorgperson 对象类的条目创建一个 ACI。

通过使用此功能在高级别分支点上放置通用规则,可以减少目录树中的 ACI 数量。对于更为具体的规则,应该尽可能将它们放置在靠近叶条目的位置上,以便限定其作用域。


放置在根 DSE 条目(其 DN 为 "")中的 ACI 只应用于该条目。


ACI 评估

要评估对特定条目的访问权限,服务器会根据条目本身的 ACI、其父条目的 ACI,直至该条目根后缀的基础编译出一个列表。在评估期间,服务器按此顺序处理 ACI。ACI 评估是在条目及其根后缀基础之间的所有后缀和子后缀中进行的,而不是在其他服务器的链接后缀中进行。


目录管理员是唯一不适用于访问控制的特权用户。当某个客户机以目录管理员身份绑定至目录时,执行操作之前服务器不会评估任何 ACI。

因此,目录管理员的 LDAP 操作的性能无法与其他用户的预期性能相比。您应该始终以典型用户身份检测目录性能。


默认情况下,如果没有 ACI 应用到条目中,则该条目将拒绝所有用户的访问(目录管理员除外)。ACI 必须为用户明确地授予访问权限,以便访问服务器中的任意条目。默认 ACI 定义匿名的读取访问权限并允许用户修改自己的条目(安全所需特性除外)。有关详细信息,请参阅“默认 ACI”

虽然服务器会首先处理距目标条目最近的 ACI,但应用于条目的所有 ACI 的效果是累加的。任意 ACI 授予的访问权都是允许的,除非有 ACI 拒绝此权限。不论出现在列表中的哪个位置,拒绝访问的 ACI 都优先于允许访问相同资源的 ACI。

例如,如果在目录的根级别拒绝写入权限,那么没有一个用户可以写入到该目录,不管授予他们的具体权限是什么。为给目录授予特定用户写入权限,必须限制写入权限的原始拒绝的范围,以使它不包括该用户。

ACI 限制

在为目录服务创建一个访问控制策略时,必须要注意下列限制:


默认 ACI

安装 Directory Server 时,下列默认 ACI 是在配置期间指定的根后缀中定义的:

不论何时在目录中创建新的根后缀,其基本条目都具有上面列出的默认 ACI(自我修改 ACI 除外)。为了获得额外的安全性,您应该按照“使用控制台创建新的根后缀”中的说明添加此 ACI。

管理服务器的 NetscapeRoot 子树具有自己的默认 ACI 集:

下面几节讲述了如何修改这些默认设置以符合您单位的需要。


ACI 语法

ACI 是具有许多可能变量的复杂结构。不论使用控制台或从命令行创建和修改 ACI,都应该了解 LDIF 中的 ACI 语法。以下小节详细介绍 ACI 语法。


提示

因为 ACI 语法比较复杂,所以 Directory Server Console 不支持所有 ACI 的可视编辑。另外,使用命令行为大量的目录条目设置访问控制则快得多。因此,了解 ACI 语法是创建具备有效访问控制的安全目录的关键。


aci 特性具有下列语法:

aci:(target)(version 3.0;acl name;permission bindRules;)

其中:

可以具有多个目标和权限-绑定规则对。这样,您可以调整条目和作为目标的特性,并针对给定目标有效地设置多个访问控制。例如:

aci:(target)...(target)(version 3.0;acl name; permission bindRule;permission bindRule; ...; permission bindRule;)

下面是完整的 LDIF ACI 的示例:

aci: (target=ldap:///uid=bjensen,dc=example,dc=com(targetattr=*)(version 3.0; acl example; allow (write)userdn=ldap:///self;)

在本示例中,ACI 声明用户 bjensen 具有修改其自己的目录条目中所有特性的权限。

下面几节比较详细地介绍了 ACI 的每部分的语法。

定义目标

目标标识 ACI 应用的对象。当客户机要求对条目中的特性执行操作时,服务器将评估目标,从而确定是否必须评估 ACI 以允许或拒绝此操作。如果未指定目标,则 ACI 应用于包含 aci 特性的条目中的所有特性以及它下面的条目。

目标的通用语法是以下语法之一:

(keyword = expression)

(keyword != expression)

其中:

下表列出每个关键字以及关联的表达式:

表 6-1 LDIF 目标关键字

关键字

有效表达式

是否允许通配符?

target

ldap:///distinguished_name

targetattr

attribute

targetfilter

LDAP_filter

targattrfilters

LDAP_operation:LDAP_filter

将目录条目作为目标

使用目标关键字以及 LDAP URL 中的 DN 可以将特定目录条目以及它下面的所有条目作为目标。目标 DN 必须位于定义 ACI 的条目下的子树中。目标表达式具有下列语法:

(target = "ldap:///distinguished_name")
(target != "ldap:///distinguished_name")

标识名称必须位于以定义 ACI 的条目作为根的子树中。例如,可以在 ou=People,dc=example,dc=com 上的 ACI 中使用下列目标:

(target = "ldap:///uid=bjensen,ou=People,dc=example,dc=com")


在字符串表示形式 (RFC 2253) 中,条目的 DN 必须是标识名称。因此,从语法上而言,对 DN 很重要的字符(如逗号)必须使用单个反斜杠 (\) 进行转义。例如:

(target="ldap:///uid=cfuentes,o=Example Bolivia\, S.A.")


还可以在 DN 中使用通配符,以便将与 LDAP URL 匹配的任意数量的条目作为目标。下面是合法的通配符用法示例:

允许使用多个通配符,如 uid=*,ou=*,dc=example,dc=com。此示例匹配 example.com 树中的其标识名称包含 uidou 特性的每个条目。


不能在标识名称的后缀部分使用通配符。即,如果目录使用后缀 c=USc=GB,则不能使用下列目标来引用两个后缀:

(target="ldap:///dc=example,c=*")°

也不能使用诸如 uid=bjensen,o=*.com 之类的目标。


将特性作为目标

除了将目录条目作为目标之外,还可以将目标条目中出现的一个或多个特性(或除上述特性之外的所有特性)作为目标。这一特点在需要拒绝或允许访问有关一个条目的部分信息时十分有用。例如,可以只允许访问一个给定条目的通用名、姓,以及电话号码特性。也可以拒绝对诸如个人数据之类的敏感信息的访问。

如果没有提供 targetattr 规则,则默认情况下将无法访问任何特性。要访问所有特性,规则必须为 targetattr="*"

作为目标的特性不需要存在于目标条目或其子树中,但无论何时这些特性存在于条目或其子树中,ACI 都将应用这些特性。不需要在架构中定义作为目标的特性。缺少架构检查使得在导入数据及其架构之前实现访问控制策略成为可能。

要将特性作为目标,可以使用 targetattr 关键字并提供特性名称。targetattr 关键字使用下列语法:

(targetattr = "attribute")
(targetattr != "attribute")

可以使用 targetattr 关键字,并使用下列语法,将多个特性作为目标:

(targetattr = "attribute1 || attribute2 ...|| attributen")
(targetattr != "attribute1 || attribute2 ...|| attributen")

例如,要将一个条目的通用名、姓和 uid 特性作为目标,可以使用下列语法:

(targetattr = "cn || sn || uid")

被作为目标的特性包括指定的特性的所有子类型。例如,(targetattr = "locality") 还将 locality;lang-fr 作为目标。还可以专门将子类型作为目标,例如 (targetattr = "locality;lang-fr-ca")

您可以在 targetattr 规则中使用通配符,但我们并不鼓励这种行为,因为通配符并没有什么特殊的意义,而且会对性能带来负面影响。

将条目和特性作为目标

默认情况下,包含 targetattr 关键字的 ACI 所针对的条目是在上面放置 ACI 的条目。即,如果将 ACI

aci:(targetattr = "uid")(accessControlRules;)

放置于 ou=Marketing, dc=example,dc=com 条目上,那么该 ACI 应用于整个 Marketing 子树。然而,还可以使用 target 关键字显式指定一个目标,如下所示:

aci:(target="ldap:///uid=*,ou=Marketing,dc=example,dc=com")
(targetattr="uid") (accessControlRules;)

指定 targettargetattr 关键字的顺序不分先后。

使用 LDAP 过滤器将条目或特性作为目标

可以使用 LDAP 过滤器将匹配某些条件的一组条目作为目标。要做到这一点,可将 targetfilter 关键字与 LDAP 过滤器一起使用。ACI 将应用于与特定过滤器相匹配的所有条目,这些特定过滤器是位于包含此 ACI 的条目下的子树中。

targetfilter 关键字的语法是:

(targetfilter = "LDAPfilter")

其中,LDAPfilter 是标准 LDAP 搜索过滤器。有关过滤器语法的详细信息,请参阅 “LDAP 搜索过滤器”

例如,假定代表雇员的所有条目都具有薪水或合同工状态,和代表作为全职职位的百分比的工作小时数的特性。要将代表合同工或兼职雇员的所有条目作为目标,可以使用下列过滤器:

(targetfilter = "(|(status=contractor)(fulltime=79))")


ACI 中不支持描述国际化值的匹配规则的过滤器语法。例如,下列目标过滤器无效:

(targetfilter = "(locality:fr:== Quebec)")


目标过滤器选择整个条目作为 ACI 的目标。可以关联 targetfiltertargetattr 关键字以创建 ACI,以便应用于目标条目中的特性子集。

下列 LDIF 示例允许 Engineering Admins 组的成员修改 Engineering 业务类别中的所有条目的 departmentNumbermanager 特性。此示例使用 LDAP 过滤器选择其 businessCategory 特性被设置为 Engineering 的所有条目:

dn: dc=example,dc=com
objectClass: top
objectClass: organization
aci: (targetattr="departmentNumber || manager")
 (targetfilter="(businessCategory=Engineering)")
 (version 3.0; acl "eng-admins-write"; allow (write)
 groupdn ="ldap:///cn=Engineering Admins, dc=example,dc=com";)


提示

虽然在将分散在目录中的条目和特性作为目标时,使用 LDAP 过滤器比较有用,但是结果有时难以预料,因为过滤器不直接指定要管理其访问的对象。随着特性的添加或修改,被已过滤的 ACI 作为目标的条目集可能会发生变化。因此,如果在 ACI 中使用 LDAP 过滤器,则应该在 ldapsearch 操作中使用同一过滤器验证它们针对的条目和特性正确。


使用 LDAP 过滤器将特性值作为目标

可以使用访问控制以便将特定的特性值作为目标。这表明,如果一个特性的值满足 ACI 中定义的条件,则可以在该特性上授予或拒绝权限。基于特性的值授予或拒绝访问权限的 ACI 叫做基于值的 ACI。

例如,可以给您单位的所有用户授予权限,以便他们能够修改自己的条目中的 nsRoleDN 特性。然而,还需要确保他们不给他们自己授予诸如“顶级管理员”之类的某些关键角色。可以使用 LDAP 过滤器检查特性值上的条件是否满足。

要创建基于值的 ACI,必须使用 targattrfilters 关键字,并使用下列语法:

(targattrfilters="add=attr1:F1 attr2:F2... attrn:Fn,
                  del=attr1:F1 attr2:F2 ... attrn:Fn")

其中:

在创建一个条目时,如果一个过滤器应用于新条目中的一个特性,那么该特性的每个实例都必须满足该过滤器。在删除一个条目时,如果一个过滤器应用于该条目中的一个特性,那么该特性的每个实例也都必须满足该过滤器。

在修改一个条目时,如果操作是添加一个特性,那么必须满足应用于该特性的添加过滤器;如果操作是删除一个特性,那么必须满足应用于该特性的删除过滤器。如果替换条目中已经出现了一个特性的单个值,那么必须满足添加和删除过滤器。

例如,请看下列特性过滤器:

(targattrfilters="add=nsroleDN:(!(nsRoleDN=cn=superAdmin)) && telephoneNumber:(telephoneNumber=123*)")

此过滤器可用于允许用户向他们自己的条目添加除 superAdmin 角色之外的任何角色(nsRoleDN 特性)。它还允许用户添加前缀为 123 的电话号码。


不能从 Directory Server Console 创建基于值的 ACI。


将单个目录条目作为目标

没有可以将单个条目作为目标的直接方法。然而,这是可以办到的:

使用 targetfilter 关键字可以指定仅出现在所需条目中的特性值。例如,在安装 Directory Server 期间,将创建下列 ACI:

aci: (targetattr="*")(targetfilter=(o=NetscapeRoot))
 (version 3.0; acl "Default anonymous access";
 allow (read, search) userdn="ldap:///anyone";)

此 ACI 仅能应用于 o=NetscapeRoot 条目,因为此条目是具有 o 特性且该特性的值为 NetscapeRoot 的唯一条目。

与这些方法关联的风险是,目录树将来可能会发生变化,必须记住修改此 ACI。

使用宏定义目标

可以使用宏来代表 ACI 目标部分中的 DN,从而优化目录中使用的 ACI 数。有关详细信息,请参阅“高级访问控制:使用宏 ACI”

设定权限

权限指定允许或拒绝的访问类型。可以允许或拒绝在目录中执行特定操作的权限。可以指派的各种操作也被称作权限

设置权限有两部分:

允许或拒绝访问

可以显式允许或拒绝对目录树的访问权限。有关何时允许访问以及何时拒绝访问的详细指导说明,请参阅《Directory Server Deployment Planning Guide》Chapter 7 中的 "Designing Access Control"

指派权限

权限详述了用户可以对目录数据执行的特定操作。可以允许或拒绝所有权限,也可以指派下列一个或多个权限:

读取。表示用户是否可以读取目录数据。此权限只能应用于搜索操作。

写入。表示用户是否可以通过添加、修改或删除特性来修改条目。此权限应用于修改和 modrdn 操作。

添加。表示用户是否可以创建条目。此权限只能应用于添加操作。

删除。表示用户是否可以删除条目。此权限只能应用于删除操作。

搜索。表示用户是否可以搜索目录数据。用户必须具有搜索和读取权限,以便查看作为搜索结果的一部分返回的数据。此权限只能应用于搜索操作。

比较。表示用户是否可以将他们提供的数据与存储在目录中的数据进行比较。通过比较权限,目录响应一个查询返回成功或失败消息,但用户不能查看条目或特性的值。此权限只能应用于比较操作。

自身写入。表示用户是否可以在目标条目的特性中添加或删除自己的 DN。此特性的语法必须是“标识名称”。此权限只能用于进行组管理。自身写入可与代理授权一起使用:它授予向一个组条目添加(或从一个组条目删除)代理 DN 的权限(不是绑定用户的 DN)。

代理。表示指定的 DN 是否可以用另一个条目的权限访问目标。可以使用目录中的任何用户的 DN 授予代理访问权限,但目录管理员 DN 除外。此外,也不能给目录管理员授予代理权限。“代理授权 ACI 示例”中提供了一个示例。

所有。表示指定的 DN 具有针对目标条目的所有权限(读取、写入、搜索、删除、比较和自身写入),代理权限除外

权限是彼此独立地授予的。这表明,例如,被授予添加权限的用户可以创建条目,但是如果没有特别授予删除权限,那么该用户就不能删除条目。因此,在规划目录的访问控制策略时,必须确保以对用户有意义的方式授予权限。例如,若没有授予读取和搜索权限,则授予写入权限通常没有意义。

执行 LDAP 操作所需的权限

本节介绍了需要授予用户的权限,这主要取决于授权用户执行 LDAP 操作的类型。

添加条目:

删除条目:

修改一个条目中的特性:

修改一个条目的 RDN:

比较一个特性的值:

搜索条目:

您需要设置权限以便用户能够搜索目录,以下示例可使您更容易地理解这一点。请查看下列搜索:

ldapsearch -h host -p port -D "uid=bjensen,dc=example,dc=com" \
           -w password -b "dc=example,dc=com" \
             "(objectclass=*)" mail

下列 ACI 用于确定是否可以为用户 bjensen 授予搜索她所拥有的条目的访问权限:

aci: (targetattr = "mail")(version 3.0; acl "self access to
 mail"; allow (read, search) userdn = "ldap:///self";)

搜索结果列表为空,因为此 ACI 不允许 bjensen 具有搜索 objectclass 特性的权限。如果希望上文描述的搜索操作成功,则必须按如下方式修改 ACI:

aci: (targetattr = "mail || objectclass")(version 3.0; acl "self
 access to mail"; allow (read, search) userdn = "ldap:///self";)

权限语法

在 ACI 语句中,权限的语法是:

allow|deny (rights)

其中,rights 是一个用括号括起来的关键字列表,其中包括 1 到 8 个以逗号分隔的关键字。有效的关键字有:readwriteadddeletesearchcompareselfwrite、 proxyall

在下列示例中,如果绑定规则被评估为 true,则允许读取、搜索和比较访问:

aci: (target="ldap:///dc=example,dc=com") (version 3.0;acl
 "example"; allow (read, search, compare) bindRule;)


绑定规则

对于某些操作,必须绑定到目录,这取决于为目录定义的 ACI。绑定表明,必须提供绑定 DN 和口令(如果使用 SSL,则提供一个证书),才能登录到目录或针对目录对您自己进行验证。绑定操作中提供的凭证,以及绑定的情况将决定允许还是拒绝对目录进行访问。

ACI 中设置的每一个权限都具有对应的绑定规则,以便详细描述所需的凭证和绑定参数。

简单的绑定规则可能要求访问目录的人员必须属于某个特定组。复杂的绑定规则可以声明,某个人必须属于特定组,并且必须通过使用特定 IP 地址的计算机在上午 8 点和下午 5 点之间进行登录。

绑定规则定义了何人、何时,以及从何处可以访问目录。更具体地讲,绑定规则可以指定:

此外,绑定规则可以是复杂结构,以便通过使用布尔运算符来合并条件。有关详细信息,请参阅“使用布尔绑定规则”

如 RFC 2251 轻型目录访问协议 (v3) 中所述,服务器根据一个三值逻辑评估 ACI 中使用的逻辑表达式,该三值逻辑类似于用于评估 LDAP 过滤器的逻辑。总之,这表明,如果表达式中的任意组件评估为未定义(例如,如果由于资源限制而中止的表达式的评估),则服务器可以正确处理此情况:它并不错误地授予访问权限,因为在复杂的布尔表达式中发生了未定义的值。

绑定规则的语法

是允许还是拒绝访问,这取决于一个 ACI 的绑定规则是否被评估为 true。绑定规则使用下面两个模式之一:

keyword = "expression";

keyword != "expression";

其中,等号 (=) 表示 keywordexpression 必须匹配才能保证绑定规则为 true,而不等号 (!=) 表示 keywordexpression 必须不匹配才能保证绑定规则为 true。


timeofday 关键字也支持不等式(<、<=、>、>=)。这是支持这些表达式的唯一关键字。


expression 两边必须有引号 (""),还需要有界定分号 (;)。可以使用的表达式取决于关联的 keyword

下表列出了每个关键字以及关联的表达式。它还指出了在表达式中是否允许使用通配符。

表 6-2 LDIF 绑定规则关键字

关键字

有效表达式

是否允许通配符?

userdn

ldap:///distinguished_name
ldap:///all
ldap:///anyone
ldap:///self
ldap:///parent
ldap:///
suffix??sub?(filter)

是,只能在 DN 中

groupdn

[ldap:///DN]

roledn

[ldap:///DN]

userattr

attribute#bindType
attribute#value

ip

IP_address

dns

DNS_host_name

dayofweek

sun
mon
tue
wed
thu
fri
sat

timeofday

0 - 2359

authmethod

none
simple
ssl
sasl
authentication_method

下面几节进一步详述了每个关键字的绑定规则语法。

定义用户访问—userdn 关键字

用户访问是使用 userdn 关键字进行定义的。userdn 关键字需要一个或多个有效标识名称,并采用下列格式:

userdn = "ldap:///dn [|| ldap:///dn]..."
userdn != "ldap:///dn [|| ldap:///dn]..."

其中,dn 可以是 DN 或 anyoneallselfparent 表达式中的某一个。这些表达式适用于以下用户:

userdn 关键字还可以表示成下列形式的 LDAP 过滤器:

userdn = ldap:///suffix??sub?(filter)


从语法上而言,对 DN 很重要的字符(例如逗号)必须使用单个反斜杠 (\) 进行转义。


匿名访问(anyone 关键字)

授予对目录的匿名访问意味着,任何人无需提供绑定 DN 或口令就可以访问它,并且不管绑定的情况如何。匿名访问可以限于特定的访问类型(例如,读取访问或搜索访问)、目录中的特定的子树或单个条目。使用 anyone 关键字的匿名访问也允许所有经过验证的用户访问。

例如,如果需要允许对整个 example.com 树进行匿名读取和搜索访问,可以在 dc=example,dc=com 节点创建下列 ACI:

aci: (version 3.0; acl "anonymous-read-search";
 allow (read, search) userdn = "ldap:///anyone";)

一般访问(all 关键字)

可以使用绑定规则指出应用于已经成功地绑定到目录的任何人的权限。因此,all 关键字允许所有经过验证的用户访问。这将允许一般访问,同时又可防止匿名访问。

例如,如果需要向所有经过验证的用户授予对整个树的读取访问,可以在 dc=example,dc=com 节点创建下列 ACI:

aci:(version 3.0; acl "all-read"; allow (read)
 userdn="ldap:///all";)

自访问(self 关键字)

指定用户被允许或拒绝对他们自己的条目的访问。在这种情况下,如果绑定 DN 匹配目标条目的 DN,则允许或拒绝访问。

例如,如果需要授予 example.com 树中的所有用户对他们的 userPassword 特性的写入访问,则可以在 dc=example,dc=com 节点上创建下列 ACI。

aci:(targetattr = "userPassword") (version 3.0; acl
 "modify own password"; allow (write) userdn = "ldap:///self";)

父访问(parent 关键字)

指定只有在用户的绑定 DN 是目标条目的父级的情况下用户才被允许或拒绝对该条目的访问。请注意,必须在 Server Console 中手动编辑 ACI 以使用 parent 关键字。

例如,如果需要允许用户修改其绑定 DN 的任意子条目,则可以在 dc=example,dc=com 节点上创建下列 ACI:

aci:(version 3.0; acl "parent access";
 allow (write) userdn="ldap:///parent";)

LDAP URL

可以使用具有过滤器的 URL 动态地将 ACI 中的用户作为目标,如下所示:

userdn = "ldap:///suffix??sub?(filter)"

例如,将基于下列 URL 允许或拒绝 example.com 树的 accounting 和 engineering 分支中的所有用户对目标资源进行访问:

userdn = "ldap:///dc=example,dc=com??sub?(|(ou=eng)(ou=acct))"


不要在 LDAP URL 内指定主机名或端口号。LDAP URL 始终应用于本地服务器。


有关 LDAP URL 的详细信息,请参阅《Directory Server Administration Reference》中的 Chapter 6 "LDAP URL Reference"

通配符

还可以通过使用通配符 (*) 指定一组用户。例如,指定 uid=b*,dc=example,dc=com 的用户 DN 表示基于您设置的权限,只有具有以字母 b 开头的绑定 DN 的用户才被允许或拒绝访问。

LDAP URL 的逻辑 OR

指定几个 LDAP URL 或关键字表达式以便创建用户访问的复杂规则。例如:

userdn = "ldap:///uid=b*,c=example.com ||
 ldap:///cn=b*,dc=example,dc=com";

对于与任一 DN 模式绑定的用户,绑定规则都将评估为 true。

排除特定 LDAP URL

使用不等号 (!=) 运算符可以定义将特定 URL 或 DN 排除在外的用户访问。例如:

userdn != "ldap:///uid=*,ou=Accounting,dc=example,dc=com";

如果客户机不绑定为 accounting 子树中的基于 UID 的标识名称,则绑定规则被评估为 true。此绑定规则只有在目标条目不在目录树的 accounting 分支下的情况下才有意义。

定义组访问—groupdn 关键字

特定组的成员可以访问目标资源。这被称作组访问。组访问是使用 groupdn 关键字来定义的,以指定在用户使用属于特定组的 DN 绑定的情况下对目标条目的访问将被允许还是被拒绝。

groupdn 关键字需要一个或多个组的标识名称,并采用下列格式:

groupdn="ldap:///groupDN [|| ldap:///groupDN]..."

如果绑定 DN 属于由任意 groupDNs 指定的组,则绑定规则将评估为 true。下一节将给出使用 groupdn 关键字的示例。


从语法上而言,对 DN 很重要的字符(如逗号)必须使用单个反斜杠 (\) 进行转义。


单 LDAP URL

groupdn = "ldap:///cn=Administrators,dc=example,dc=com";

如果绑定 DN 属于 Administrators 组,则绑定规则被评估为 true。如果需要授予 Administrators 组对整个目录树进行写入的权限,则可以在 dc=example,dc=com 节点创建下列 ACI:

aci:(version 3.0; acl "Administrators-write"; allow (write)
 groupdn="ldap:///cn=Administrators,dc=example,dc=com";)

LDAP URL 的逻辑 OR

groupdn = "ldap:///cn=Administrators,dc=example,dc=com ||
ldap:///cn=Mail Administrators,dc=example,dc=com";

如果绑定 DN 属于 Administrators 组或 Mail Administrators 组,则绑定规则被评估为 true。

定义角色访问—roledn 关键字

特定角色的成员可以访问目标资源。这被称作角色访问。角色访问是使用 Roledn 关键字来定义的,以指定在用户使用属于特定角色的 DN 绑定的情况下对目标条目的访问将被允许还是拒绝。

roledn 关键字需要一个或多个有效标识名称,并采用下列格式:

roledn = "ldap:///dn [|| ldap:///dn]...[|| ldap:///dn]"

如果绑定 DN 属于指定角色,则绑定规则被评估为 true。


从语法上而言,对 DN 很重要的字符(例如逗号)必须使用单个反斜杠 (\) 进行转义。


roledn 关键字与 groupdn 关键字具有相同语法,使用方式也相同。

基于值匹配来定义访问

可以设置绑定规则以指定用于绑定到目录的条目的特性值必须匹配目标条目的特性值。

例如,可以指定绑定 DN 必须匹配一个用户条目的 manager 特性中的 DN 才能使 ACI 应用。在这种情况下,只有用户的管理员才可以访问该条目。

此示例基于 DN 匹配。然而,可以将绑定中使用的条目的任何特性与目标条目进行匹配。例如,可以创建一个 ACI,以允许其 favoriteDrink 特性是 beer 的任何用户读取具有相同的 favoriteDrink 值的其他用户的所有条目。

使用 userattr 关键字

userattr 关键字可用于指定哪些特性值必须在用于绑定的条目和目标条目之间进行匹配。

可以指定:

userattr 关键字的 LDIF 语法如下所示:

userattr = "attrName#bindType"

或者,如果使用需要除用户 DN、组 DN、角色 DN 或 LDAP 过滤器之外的值的特性类型:

userattr = "attrName#attrValue"

其中:

下面几节提供具有各种可能的绑定类型的 userattr 关键字的示例。

具有 USERDN 绑定类型的示例

下面是与基于用户 DN 的绑定关联的 userattr 关键字的示例:

userattr = "manager#USERDN"

如果绑定 DN 匹配目标条目中的 manager 特性的值,则绑定规则被评估为 true。可以使用它允许用户的管理员修改员工的特性。此机制只有在目标条目中的 manager 特性表示成完整 DN 的情况下才起作用。

下列示例授予管理员对其员工的条目的完全访问权:

aci: (target="ldap:///dc=example,dc=com")(targetattr="*")
 (version 3.0;acl "manager-write";
 allow (all) userattr = "manager#USERDN";)

具有 GROUPDN 绑定类型的示例

下面是与基于组 DN 的绑定关联的 userattr 关键字的示例:

userattr = "owner#GROUPDN"

如果绑定 DN 是目标条目的 owner 特性中指定的一个组的成员,则绑定规则被评估为 true。例如,可以使用此机制允许一个组管理员工的状态信息。可以使用除 owner 之外的特性,只要您使用的特性包含一个组条目的 DN。

指向的组可以是动态组,该组的 DN 可以在目录中的任何后缀下。然而,服务器对这种类型的 ACI 的评估消耗资源非常厉害。

如果使用在与目标条目相同的后缀下的静态组,则可以使用下列表达式:

userattr = "ldap:///dc=example,dc=com?owner#GROUPDN"

在此示例中,组条目是在 dc=example,dc=com 后缀下。服务器可以比以前的示例更快地处理这种类型的语法。

具有 ROLEDN 绑定类型的示例

下面是与基于角色 DN 的绑定关联的 userattr 关键字的示例:

userattr = "exampleEmployeeReportsTo#ROLEDN"

如果绑定 DN 属于目标条目的 exampleEmployeeReportsTo 特性中指定的角色,则绑定规则被评估为 true。例如,如果为贵公司的所有经理创建嵌套角色,则可以使用此机制授予所有级别的经理访问等级比他们自己低的员工的信息的权限。

角色的 DN 可以在目录中的任何后缀下。此外,如果使用过滤的角色,对这种类型的 ACI 的评估会占用服务器上的许多资源。

具有 LDAPURL 绑定类型的示例

下面是与基于 LDAP 过滤器的绑定关联的 userattr 关键字的示例:

userattr = "myfilter#LDAPURL"

如果绑定 DN 匹配目标条目的 myfilter 特性中指定的过滤器,则绑定规则被评估为 true。myfilter 特性可以替换为包含 LDAP 过滤器的任何特性。

具有任何特性值的示例

下面是与基于任何特性值的绑定关联的 userattr 关键字的示例:

userattr = "favoriteDrink#Beer"

如果绑定 DN 和目标 DN 包括具有 Beer 值的 favoriteDrink 特性,则绑定规则被评估为 true。

使用具有继承性的 userattr 关键字

在使用 userattr 关键字将用于绑定的条目与目标条目关联时,ACI 只应用于指定的目标,而不应用于它下面的条目。在某些情况下,可以将 ACI 应用于目标条目下面多个级别。通过使用 parent 关键字,并指定应该继承 ACI 的目标下面的级别数,就可以做到这一点。

在将 userattr 关键字与 parent 关键字联合使用时,语法如下所示:

userattr = "parent[inheritance_level].attribute#bindType"

其中

例如:

userattr = "parent[0,1].manager#USERDN"

如果绑定 DN 匹配目标条目的 manager 特性,则此绑定规则被评估为 true。当绑定规则被评估为 true 时授予的权限应用于目标条目应用于紧随它下面的所有条目。

具有 userattr 继承性的示例

下图中的示例表示用户 bjensen 被允许读取和搜索 cn=Profiles 条目以及包括 cn=mailcn=news 的子条目的第一个级别。

图 6-1 使用具有 userattr 关键字的继承

显示使用继承性和 userattr 关键字的 ACI 的图表

在此示例中,如果没有使用继承性,则必须执行下列操作之一以获得相同结果:

使用 userattr 关键字授予添加权限

如果将 userattr 关键字与 alladd 权限一起使用,则会发现服务器的行为不像您预期的那样。通常,当在目录中创建新条目时,Directory Server 评估正在创建的条目上的访问权限,而不是评估父条目上的访问权限。然而,在 ACI 使用 userattr 关键字的情况下,此行为可能会造成安全漏洞,可以修改服务器的正常行为以避免这种情况。

请看下列示例:

aci: (target="ldap:///dc=example,dc=com")(targetattr="*")
 (version 3.0; acl "manager-write"; allow (all)
 userattr = "manager#USERDN";)

此 ACI 授予管理员对向他们报告的员工的条目的所有权限。然而,由于访问权限是在正在创建的条目上评估的,这种类型的 ACI 还将允许任何员工创建其 manager 特性被设置为他们自己的 DN 的条目。例如,不满意的员工 Joe (cn=Joe,ou=eng,dc=example,dc=com) 可能需要在树的 Human Resources 分支中创建一个条目,以使用(或滥用)授予 Human Resources 员工的权限。

他可以通过创建下列条目做到这一点:

dn: cn= Trojan Horse,ou=Human Resources,dc=example,dc=com
objectclass: top
...
cn: Trojan Horse
manager: cn=Joe,ou=eng,dc=example,dc=com

为避免这种类型的安全威胁,ACI 评估过程不在级别 0(即,向该条目本身)授予添加权限。然而,可以使用 parent 关键字在现有的条目下面授予添加权限。必须为添加权限指定父级别下面的级别数。例如,下列 ACI 允许向其 manager 特性匹配绑定 DN 的 dc=example,dc=com 中的任何条目添加子条目:

aci: (target="ldap:///dc=example,dc=com")(targetattr="*")
 (version 3.0; acl "parent-access"; allow (add)
 userattr = "parent[0,1].manager#USERDN";)

此 ACI 确保只向其绑定 DN 匹配父条目的 manager 特性的用户授予添加权限。

定义来自特定 IP 地址的访问

通过使用绑定规则,可以指出绑定操作必须发自一个特定 IP 地址。这通常用于强制从一个给定计算机或网络域进行所有目录更新。

设置基于 IP 地址的绑定规则的 LDIF 语法如下所示:

ip = "IPaddressList" 或 ip != "IPaddressList"

IPaddressList 是一个或多个以逗号分隔的元素列表,可能为以下任意值:

如果访问目录的客户机位于指定的 IP 地址,则绑定规则被评估为 true。对于只允许从特定子网或计算机进行的某些类型的目录访问非常有用。请注意,此用户验证位置可能不真实,因而不可信任。请不要让 ACI 仅基于此信息。

可以从 Server Console 通过“访问控制编辑器”定义对其应用 ACI 的特定计算机。有关详细信息,请参阅“使用控制台创建 ACI”

定义来自特定域的访问

绑定规则可以指定绑定操作必须发自一个特定域或主机。这通常用于强制从一个给定计算机或网络域进行所有目录更新。

设置基于 DNS 主机名的绑定规则的 LDIF 语法如下所示:

dns = "DNS_Hostname" 或 dns != "DNS_Hostname"


警告

dns 关键字要求在您的计算机上使用的命名服务是 DNS。如果命名服务不是 DNS,则应该使用 ip 关键字代替。


dns 关键字要求完全符合要求的 DNS 域名。授予对主机的访问而不指定域会带来潜在的安全威胁。例如,允许使用下列表达式,但不建议使用:

dns = "legend.eng";

应该使用完全符合要求的名称,如:

dns = "legend.eng.example.com";

dns 关键字允许使用通配符。例如:

dns = "*.example.com";

如果访问目录的客户机位于指定的域,则绑定规则被评估为 true。这对于只允许从特定域进行访问非常有用。注意,如果系统使用 DNS 之外的命名服务,则通配符将不起作用。在这样的情况下,如果需要限制对特定域的访问,则请使用 ip 关键字,如“定义来自特定 IP 地址的访问”中所描述的。

定义特定时间或星期的访问

可以使用绑定规则指定绑定只能在某些时间或在一个星期中的某些天发生。例如,可以设置一条规则,以便只允许在星期一到星期五上午 8 点和下午 5 点之间进行的访问。用于评估访问权限的时间是 Directory Server 上的时间,而不是客户机上的时间。

设置基于时间的绑定规则的 LDIF 语法如下所示:

timeofday operator "time"

其中 operator 可以是下列符号之一:等号 (=)、不等号 (!=)、大于号 (>)、大于等于号 (>=)、小于号 (<) 或者小于等于号 (<=)。时间以四位数字的形式表示,代表 24 小时制的小时和分钟(02359)。例如:

设置基于一周内各天的绑定规则的 LDIF 语法如下所示:

dayofweek = "day1, day2 ..."

dayofweek 关键字的可能的值是星期几的三个英语字母缩写:sunmontuewedthufrisat。指定要授予访问权限的所有天,例如:

dayofweek = "Mon, Tue, Wed, Thu, Fri";

如果在上面列出的某一天中访问目录,则绑定规则为 true。

定义基于验证方法的访问

可以设置绑定规则,以声明客户机必须使用特定验证方法绑定到目录。可用的验证方法有:

不能通过“访问控制编辑器”设置基于验证的绑定规则。

设置基于验证方法的绑定规则的 LDIF 语法如下所示:

authmethod = "authentication_method"

其中 authentication_methodnonesimplesslsasl sasl_mechanism。例如:

示例

下面是 authmethod 关键字的示例:

使用布尔绑定规则

可以使用布尔表达式 ANDOR,以及 NOT 来将绑定规则设置为复杂的表达式,以表达非常精确的访问规则。不能使用 Server Console 创建布尔绑定规则。必须创建 LDIF 语句。

布尔绑定规则的 LDIF 语法如下所示:

bindRule [boolean][bindRule][boolean][bindRule]...;)

例如,如果绑定 DN 是管理员组或者邮件管理员组的成员,并且客户机运行于 example.com 域内,那么下面的绑定规则将被评估为 true:

(groupdn = "ldap:///cn=administrators,dc=example,dc=com" or
groupdn = "ldap:///cn=mail administrators,dc=example,dc=com" and
dns = "*.example.com";)

句末分号 (;) 是必需的分隔符,应出现在最后一个绑定规则之后。

对布尔表达式的评估遵循如下顺序:

布尔 OR 和布尔 AND 运算符没有优先级顺序。

请看下面的布尔绑定规则:

(bindRule_A) OR (bindRule_B)

(bindRule_B) OR (bindRule_A)

由于布尔表达式是从左向右进行评估的,所以在第一种情况下,绑定规则 A 在绑定规则 B 之前进行评估,而在第二种情况下,绑定规则 B 在绑定规则 A 之前进行评估。

但是,布尔 NOT 在布尔 OR 和布尔 AND 之前进行评估。因此,在下面的示例中:

(bindRule_A) AND NOT (bindRule_B)

尽管存在从左向右的规则,但绑定规则 B 还是在绑定规则 A 之前进行评估。


从命令行创建 ACI

可以使用 LDIF 语句手动创建访问控制指令,以及使用 ldapmodify 命令将它们添加到目录树。因为 ACI 值可能非常复杂,所以查看现有值并对其进行复制以协助创建新的 ACI,这一点会非常有用。

查看 aci 特性值

ACI 作为 aci 特性的一个或多个值存储在条目上。aci 特性是多值操作特性,可以由目录用户读取和修改,本身应该由 ACI 保护。管理用户通常被授予对 aci 特性的完全访问权,并可以以下列某一种方式查看其值。

可以在通用编辑器中如查看任何其他值一样查看 aci 特性值。在 Directory Server Console 的顶级“目录”选项卡中,右键单击带有 ACI 的条目,并选择“用通用编辑器进行编辑”菜单项。然而,aci 值通常是难以在此对话框中查看和编辑的长字符串。

相反,可以通过右击目录树中的条目并选择“设置访问权限”菜单项,以便调用“访问控制编辑器”。选择一个 ACI 并单击“编辑”,然后单击“手动编辑”以查看对应的 aci 值。通过在 ACI 的手动和可视编辑器之间切换,可以将 aci 值的语法与其配置进行比较。

如果操作系统允许,则可以从“通用编辑器”或“手动访问控制编辑器”复制 aci 值以例将它粘贴到 LDIF 文件中。管理用户还可以通过运行以下 ldapsearch 命令来查看条目的 aci 特性:

ldapsearch -h host -p port -D "cn=Directory Manager" -w password \
             
-b entryDN -s base "(objectclass=*)" aci

结果为 LDIF 文本,可以将其复制到新的 LDIF ACI 定义中以便用于编辑。由于 ACI 的值是长字符串,因此 ldapsearch 操作的输出可能会显示为几行,第一个空格是一个持续标记。复制和粘贴 LDIF 输出时请将这一点考虑进来。


要查看以授予或拒绝的权限来表示的 aci 值的效果,请参阅“查看有效权限”



使用控制台创建 ACI

可以配置 Directory Server Console 来显示目录中的哪些条目具有 aci 特性。通过选择或取消选择“查看”>“显示”>“ACI 计数”菜单项,可切换此显示。顶级的“目录”选项卡上列出的条目将被附加,同时显示出它们的 aci 特性中定义的 ACI 的数量。然后您可以使用 Directory Server Console 查看、创建、编辑和删除目录的访问控制指令。

请参阅“访问控制用法示例”,以了解 Directory Server 安全策略中通常使用的一组访问控制规则,以及有关使用 Directory Server Console 创建这些规则的分步指导。

“访问控制编辑器”不允许在可视编辑模式下构建某些比较复杂的 ACI。具体将,不能通过“访问控制编辑器”执行下列操作:

查看条目的 ACI

  1. 在 Directory Server Console 的顶级“目录”选项卡中,浏览目录树以显示要为其设置访问控制的条目。您必须具有目录管理员的特权才能编辑 ACI。
  2. 右键单击该条目并从弹出菜单中选择“设置访问权限”。或者,可以用左键单击“此条目”以选中它,并从“对象”菜单中选择“设置访问权限”。
  3. 显示“访问控制管理”对话框,如下图所示。其中列出了对所选条目上定义的所有 ACI 的描述,并允许您编辑或删除它们,以及创建新的 ACI。

    图 6-2 “访问控制管理”对话框
    ou=People,dc=example,dc=com 的标题为管理访问控制且列出此条目中定义的 ACI 的说明字符串的窗口

    如果选中“显示继承的 ACI”复选框,则列出由所选条目的父级定义的应用于该条目的所有 ACI。继承的 ACI 不能被编辑或删除;您必须在定义这些 ACI 的条目上对其进行管理。

  4. 单击“新建”,在选定对象及其整个子树上定义新的访问权限。将显示如图 6-3 中所示的 ACI 编辑器。
  5. 图 6-3 “ACI 编辑器”对话框
    ou=People,dc=example,dc=com 的标题为编辑 ACI且显示用于定义 ACI 的图形界面的窗口

对话框顶部的 ACI 名称是对将出现在“访问控制管理”对话框中的 ACI 的描述。提供描述性的 ACI 名称将使得对整个目录中的 ACI 进行管理变得更容易,特别是在查看叶条目上继承的 ACI 时更是如此。

“访问控制编辑器”的选项卡可用于指定被允许或拒绝访问的用户,被访问或限制的目标,以及诸如被允许的主机名和操作次数之类的高级参数。有关“访问控制”选项卡中的单个字段的详细信息,请参阅联机帮助。

ACI 编辑器的选项卡以图形方式显示了 ACI 值的内容。单击“手动编辑”按钮以查看 ACI 值,并在文本状态下对其进行编辑。在文本编辑器中,可以定义不能通过选项卡定义的高级 ACI。不过,即使您不使用高级功能,一旦编辑了 ACI 值后,就不能再在可视状态下编辑 ACI。

创建新的 ACI

  1. 显示“访问控制编辑器”。
  2. 此任务在“查看条目的 ACI” 中讲述。

    如果显示的视图不同于图 6-3,则请单击“可视编辑”。

  3. 在“ACI 名称”文本框中键入名称来对 ACI 进行命名。
  4. 名称可以是任何字符串,用于唯一地标识该 ACI。如果没有输入名称,服务器将使用未命名的 ACI

  5. 在“用户/组”选项卡中,突出显示“所有用户”或单击“添加”按钮来在目录中搜索要授予其访问权的用户。
  6. 在“添加用户和组”窗口中:

    1. 从下拉列表中选择一个搜索区域,在搜索字段中输入一个搜索字符串,并单击“搜索”按钮。
    2. 搜索结果会在下面的列表中显示出来。

    3. 在搜索结果列表中突出显示所需的条目,并单击“添加”按钮将其添加到具有访问权限的条目列表中。
    4. 单击“确定”关闭“添加用户和组”窗口。
    5. 您所选的条目将在 ACI 编辑器中的“用户/组”选项卡上列出。

  7. 在“访问控制编辑器”中,单击“权限”选项卡,并使用复选框来选择要授予的权限。
  8. 单击“目标”选项卡,然后单击“此条目”来显示此 ACI 所针对的节点。
  9. 您可以更改目标 DN 的值,但新 DN 必须是选定条目的直接或间接子条目。

    如果不希望此节点下的子树中的每一个条目都适用该 ACI,那么必须在“子条目”字段的“过滤器中”输入一个过滤器。

    此外,还可以通过在特性列表中选择所需的特性来将 ACI 的作用域限制在个别特性上。

  10. 单击“主机”选项卡,然后单击“添加”按钮来显示“添加主机过滤器”对话框。
  11. 可以指定主机名或 IP 地址。如果指定 IP 地址,还可以使用通配符 (*)。

  12. 单击“时间”选项卡以显示一个上面显示了在哪些时间允许访问的表。
  13. 默认情况下,在任何时候都允许访问。可以通过单击并在表中拖移光标来更改访问时间。不能选择不连续的时间块。

  14. 编辑完 ACI 之后,单击“确定”。
  15. “ACI 编辑器”关闭,新的 ACI 在“ACI 管理器”窗口列出。


    在创建 ACI 过程中随时都可以单击“手动编辑”按钮以显示对应于您的输入的 LDIF 语句。可以修改此语句,但您的更改不一定在图形界面中可见。


编辑 ACI

要编辑 ACI:

  1. 在“目录”选项卡上,右键单击子树中的顶部条目,并从弹出菜单中选择“设置访问权限”。
  2. “访问控制管理器”窗口将显示出来。它包含属于该条目的 ACI 列表。

  3. 在“访问控制管理器”窗口,突出显示需要编辑的 ACI,并单击“编辑”。
  4. “访问控制编辑器”将显示出来。有关可以使用此对话框编辑的信息的详细信息,请参阅联机帮助。

  5. 在“访问控制编辑器”的各种选项卡下进行所需的更改。
  6. 编辑完 ACI 之后,单击“确定”。
  7. “ACI 编辑器”关闭,修改的 ACI 在“ACI 管理器”中列出。

删除 ACI

要删除 ACI:

  1. 在“目录”选项卡上,右键单击子树中的顶部条目,并从弹出菜单中选择“设置访问权限”。
  2. “访问控制管理器”窗口将显示出来。它包含属于该条目的 ACI 列表。

  3. 在“访问控制管理器”窗口,选择需要删除的 ACI。
  4. 单击“删除”。
  5. 该 ACI 不再在“访问控制管理器”中列出。


访问控制用法示例

本节中提供的示例说明了一个虚构的 ISP 公司 example.com 如何实现其访问控制策略。所有示例讲述了如何从控制台并使用 LDIF 文件执行给定任务。

Example.com 的业务是提供 Web 托管服务和 Internet 访问。Example.com 的 Web 托管服务的一部分是托管客户公司的目录。Example.com 实际托管并部分管理两个中等规模的公司 Company333 和 Company999 的目录。它还向许多单个用户提供 Internet 访问。

下面是 example.com 需要实施的访问控制规则:

授予匿名访问

大多数目录是这样运行的,可以至少匿名地访问一个后缀以便读取、搜索或比较。例如,如果正在运行一个需要员工能够搜索的企业人员目录(诸如电话簿),则可能需要设置这些权限。在 example.com 内部便是这种情况,并在 ACI “匿名 example.com” 示例中进行说明。

作为一个 ISP,example.com 还希望通过创建一本外界可访问的公用电话簿来向其所有用户通知联系信息。这部分在 ACI “匿名世界”示例中进行说明。

ACI “匿名 example.com”

在 LDIF 中,要向 example.com 员工授予对整个 example.com 树的读取、搜索和比较权限,可以写入下列语句:

aci: (targetattr !="userPassword")(version 3.0; acl "Anonymous
 example"; allow (read, search, compare)
 userdn= "ldap:///anyone" and dns="*.example.com";)

此示例假设 aci 被添加到 dc=example,dc=com 条目。注意,userPassword 特性已从 ACI 的范围中排除。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中的 example.com 节点,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的 “ACI 名称”字段中,键入“匿名 example.com”。检查所有用户是否都显示在被授予访问权限的用户列表中。
  4. 在“权限”选项卡上,选中“读取”、“比较”和“搜索权限”的复选框。确保其他复选框都被清除。
  5. 在“目标”选项卡上,单击“此条目”,在“目标目录条目”字段中显示 dc=example,dc=com 后缀。在特性表中,定位 userPassword 特性并清除对应的复选框。
  6. 所有其他复选框都应该被选中。如果单击“名称”标题以按字母顺序组织特性列表,此任务会变得比较容易。

  7. 在“主机”选项卡上单击“添加”,并在 DNS 主机过滤器字段,键入 *.example.com。单击“确定”,关闭对话框。
  8. 单击“访问控制编辑器”窗口中的“确定”。
  9. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

ACI “匿名世界”

在 LDIF 中,要向外界授予对单个用户子树的读取和搜索访问,而拒绝对未列出的用户的信息访问,可以写入下列语句:

aci: (targetfilter= "(!(unlistedSubscriber=yes))")
 (targetattr="homePostalAddress || homePhone || mail")
 (version 3.0; acl "Anonymous World"; allow (read, search)
 userdn="ldap:///anyone";)

此示例假设 ACI 被添加到 ou=subscribers,dc=example, dc=com 条目。还假设每一个用户条目都具有可以设置为 yes 或 no 的 unlistedSubscriber 特性。目标定义筛选出基于此特性值的未列出的用户。有关过滤器定义的详细信息,请参阅“使用过滤器设置目标”

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的“用户”条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入“匿名世界”。检查所有用户是否都显示在被授予访问权限的用户列表中。
  4. 在“权限”选项卡上,选中读取、搜索权限的复选框。确保其他复选框都被清除。
  5. 在“目标”选项卡上,单击“此条目”,在“目标目录条目”字段中显示 dc=subscribers, dc=example,dc=com 后缀。
    1. 在“子条目”字段的过滤器中,键入下列过滤器:
    2. (!(unlistedSubscriber=yes))

    3. 在特性表中,选中 homePhonehomePostalAddressmail 特性的复选框
    4. 所有其他复选框都应该被清除。如果单击“一个都不选中”按钮,清除表中所有特性的复选框,然后单击“名称”标题按字母顺序组织它们,并且选择适当的特性,此任务会变得比较轻松。

  6. 单击“确定”。
  7. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

授予对个人条目的写权限

许多目录管理员希望允许内部用户更改其自己的条目中的某些特性而不是所有特性。example.com 的目录管理员希望允许用户更改其自己的口令、家庭电话号码,以及家庭地址,但不允许更改其他任何信息。这部分在 ACI “写入 example.com”示例中进行说明。

example.com 的策略还允许他们的用户更新 example.com 树中自己的个人信息,前提是他们与目录建立 SSL 连接。这部分在 ACI “写入用户”示例中进行说明。

ACI “写入 example.com”


通过设置此权限,还授予用户删除属性值的权限。


在 LDIF 中,要授予 example.com 雇员更新口令、家庭电话号码和家庭地址的权限,可以写入下列语句:

aci: (targetattr="userPassword || homePhone ||
 homePostalAddress")(version 3.0; acl "Write example.com";
 allow (write) userdn="ldap:///self" and dns="*.example.com";)

此示例假设 ACI 被添加到 ou=People,dc=example,dc=com 条目。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中的 ou=People,dc=example,dc=com 条目,并从弹出菜单中选择“设置访问权限”来显示访问控制管理器。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入“写入 example.com”。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 将搜索区域设置为特殊权限,并从搜索结果列表中选择自己。
    4. 单击“添加”按钮,在被授予访问权限的用户列表中列出自己。
    5. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,选中写权限的复选框。确保其他复选框都被清除。
  5. 在“目标”选项卡上,单击“此条目”,将 ou=People,dc=example,dc=com 输入“目标目录条目”字段中。在特性表中,选中 homePhonehomePostalAddress,以及 userPassword 特性的复选框。
  6. 所有其他复选框都应该被清除。如果单击“一个都不选中”按钮,清除表中所有特性的复选框,然后单击“名称”标题按字母顺序组织它们,并且选择适当的特性,此任务会变得比较轻松。

  7. 在“主机”选项卡上,单击“添加”按钮,显示“添加主机过滤器”对话框。在 DNS 主机过滤器字段,键入 *.example.com。单击“确定”,关闭对话框。
  8. 单击“访问控制编辑器”窗口中的确定。
  9. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

ACI “写入用户”


通过设置此权限,还授予用户删除属性值的权限。


在 LDIF 中,要授予 example.com 用户更新口令、家庭电话号码的权限,可以写入下列语句:

aci: (targetattr="userPassword || homePhone")
 (version 3.0; acl "Write Subscribers"; allow (write)
 userdn= "ldap://self" and authmethod="ssl";)

此示例假设 aci 被添加到 ou=subscribers,dc=example, dc=com 条目。

请注意,example.com 用户不具有对其家庭地址的写入访问权限,因为他们可能删除该特性,而 example.com 需要该信息进行记帐。因此,家庭地址是对业务比较关键的信息。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的用户条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的 “ACI 名称”字段中,键入“写入用户”。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 将搜索区域设置为特殊权限,并从搜索结果列表中选择自己。
    4. 单击“添加”按钮,在被授予访问权限的用户列表中列出自己。
    5. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,选中写权限的复选框。确保其他复选框都被清除。
  5. 在“目标”选项卡上,单击“此条目”,在“目标目录条目”字段中显示 dc=subscribers, dc=example,dc=com 后缀。
    1. 在子条目字段的过滤器中,键入下列过滤器:
    2. (!(unlistedSubscriber=yes))

    3. 在特性表中,选中 homePhonehomePostalAddressmail 特性的复选框。
    4. 所有其他复选框都应该被清除。如果单击“一个都不选中”按钮,清除表中所有特性的复选框,然后单击“名称”标题按字母顺序组织它们,并且选择适当的特性,此任务会变得比较轻松。

  6. 如果希望用户使用 SSL 进行验证,则通过单击“手动编辑”按钮切换到手动编辑,并将 authmethod=ssl 添加到 LDIF 语句,以使它的形式如下:
  7. (targetattr="homePostalAddress || homePhone || mail")
     (version 3.0; acl "Write Subscribers"; allow (write)
     (userdn= "ldap:///self") and authmethod="ssl";)

    请注意,这是一个连续的行,只是出于可读性才进行了拆分。

  8. 单击“确定”。
  9. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

限制对关键角色的访问权限

可以使用目录中的角色定义以标识对业务、网络和目录的管理,或其他目的关键的功能。

例如,可以通过标识全世界企业站点在特定时间和星期几可用的系统管理员子集来创建 superAdmin 角色。或者可以创建 First Aid 角色,包括在特定站点进行了急救培训的所有成员。有关创建角色定义的信息,请参阅“分配角色”

当某个角色提供的任何一种特权超出了关键企业或业务功能时,应该考虑限制对该角色的访问。例如,在 example.com,雇员可以将除 superAdmin 角色之外的任何角色添加到自己的条目中。这部分在 ACI “角色”示例中进行说明。

ACI “角色”

在 LDIF 中,要授予 example.com 雇员将除 superAdmin 角色之外的任何角色添加到他们自己的条目的权限,可以写入下列语句:

aci: (targetattr="*") (targattrfilters="add=nsRoleDN:
 (nsRoleDN !="cn=superAdmin, dc=example, dc=com")")
 (version 3.0; acl "Roles"; allow (write)
 userdn= "ldap:///self" and dns="*.example.com";)

此示例假设 ACI 被添加到 ou=People,dc=example, dc=com 条目中。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中的 example.com 节点,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入“角色”。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 在“添加用户和组”对话框中将搜索区域设置为特殊权限,并从搜索结果列表中选择自己。
    4. 单击“添加”按钮,在被授予访问权限的用户列表中列出自己。
    5. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,选中写权限的复选框。确保其他复选框都被清除。
  5. 在“主机”选项卡上,单击“添加”按钮,显示“添加主机过滤器”对话框。在 DNS 主机过滤器字段,键入 *.example.com。单击“确定”,关闭对话框。
  6. 要为角色创建基于值的过滤器,可通过单击“手动编辑”按钮切换到手动编辑。将下列内容添加到 LDIF 语句的开始:
  7. (targattrfilters="add=nsRoleDN:
     (nsRoleDN != "cn=superAdmin, dc=example,dc=com")")

    LDIF 语句的形式应该如下:

    (targetattr="*") (targattrfilters="add=nsRoleDN:
     (nsRoleDN != "cn=superAdmin, dc=example,dc=com")")
     (target = "ldap:///dc=example,dc=com")
     (version 3.0; acl "Roles"; allow (write)
     (userdn = "ldap:///self") and (dns="*.example.com");)

  8. 单击“确定”。
  9. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

授予组对后缀的完全访问权限

大多数目录具有用于标识某些企业功能的组。可以给这些组授予对整个目录或部分目录的完全访问权限。通过向该组应用访问权限,可以避免分别地为每个成员设置访问权限。相反,可以只通过将用户添加到该组来向他们授予这些访问权限。

例如,在使用典型安装过程安装 Directory Server 时,默认情况下将创建对目录具有完全访问权限的 Administrators 组。

在 example.com,Human Resources 组被授予对目录的 ou=People 分支的完全访问权,以使他们可以更新雇员目录。这部分在 ACI "HR" 示例中进行说明。

ACI "HR"

在 LDIF 中,要授予 HR 组对目录的雇员分支的所有权限,可以使用下列语句:

aci: (targetattr="*") (version 3.0; acl "HR"; allow (all)
 userdn= "ldap:///cn=HRgroup,ou=People,dc=example,dc=com";)

此示例假设 ACI 被添加到 ou=People,dc=example,dc=com 条目。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的 example.com-people 条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的 “ACI 名称”字段中,键入 "HR"。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 将搜索区域设置为用户和组,并在搜索字段中键入 "HRgroup"。
    4. 此示例假设已经创建了 HR 组或角色。有关组和角色的详细信息,请参阅第 5 章“管理身份和角色”

    5. 单击“添加”按钮,在被授予访问权限的用户列表中列出 HR 组。
    6. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,单击“全部选中”按钮。
  5. 除代理权限以外的所有复选框都被选中。

  6. 单击“确定”。
  7. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

授予添加和删除组条目的权限

某些组织希望允许雇员在树中创建条目,如果这样做可以提高他们的效率,或者如果可以有助于企业的活力。

例如,在 example.com,有一个活跃的社会委员会,由各种俱乐部组成:网球、游泳、滑雪、角色扮演等。任何 example.com 雇员都可以创建一个代表新俱乐部的组条目。这部分在 ACI “创建组”示例中进行说明。任何 example.com 雇员都可以成为这些组中的某一个组的成员。这部分在“允许用户从组中添加或删除其自身”下的 ACI “组成员”中进行了说明。只有组的所有者才能修改或删除组条目。这部分在 ACI “删除组”示例中进行说明。

ACI “创建组”

在 LDIF 中,要授予 example.com 雇员在 ou=Social Committee 分支下创建组条目的权限,可以写入下列语句:

aci: (target="ldap:///ou=social committee,dc=example,dc=com")
 (targetattr="*")(targattrfilters="add=objectClass:
 (|(objectClass=groupOfNames)(objectClass=top))")
 (version 3.0; acl "Create Group"; allow (read,search,add)
 userdn= "ldap:///uid=*,ou=People,dc=example,dc=com")
 and dns="*.example.com";)


  • 此 ACI 不授予写权限,这意味着条目创建者无法修改条目。
  • 由于服务器在后台添加 "top" 值,因此需要在 targattrfilters 关键字中指定 objectclass=top

此示例假设 ACI 被添加到 ou=social committee, dc=example,dc=com 条目。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的 Social Committee 条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入“创建组”。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 将搜索区域设置为特殊权限,并从搜索结果列表中选择所有经过验证的用户。
    4. 单击“添加”按钮,列出被授予访问权限的用户列表中的所有经过验证的用户。
    5. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,选中读取、搜索和添加的复选框。确保其他复选框都被清除。
  5. 在“目标”选项卡上,单击“此条目”,在“目标目录条目”字段中显示 ou=social committee, dc=example,dc=com 后缀。
  6. 在“主机”选项卡上,单击“添加”按钮,显示“添加主机过滤器”对话框。在 DNS 主机过滤器字段,键入 *.example.com。单击“确定”,关闭对话框。
  7. 要创建将允许雇员只向此子树添加组条目的基于值的过滤器,请通过单击“手动编辑”按钮切换到手动编辑。将下列内容添加到 LDIF 语句的开始:
  8. (targattrfilters="add=objectClass:(objectClass=groupOfNames)
     |(objectClass=top)")

    LDIF 语句的形式应该如下:

    (targetattr = "*") (targattrfilters="add=objectClass:(objectClass=groupOfNames)
     |(objectClass=top)") (target="ldap:///ou=social  committee,dc=example,dc=com) (version 3.0; acl "Create Group";
     allow (read,search,add) (userdn= "ldap:///all") and
     (dns="*.example.com"); )

  9. 单击“确定”。
  10. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

ACI “删除组”

在 LDIF 中,要授予 example.com 雇员在 ou=Social Committee 分支下修改或删除他们所拥有的组条目的权限,可以写入下列语句:

aci: (target="ou=social committee,dc=example,dc=com)
 (targetattr = "*")
 
(targattrfilters="del=objectClass:(objectClass=groupOfNames)")
 (version 3.0; acl "Delete Group"; allow (write,delete)
 userattr="owner#GROUPDN";)

此示例假设 aci 被添加到 ou=social committee, dc=example,dc=com 条目。

使用控制台不是创建此 ACI 的有效方式,因为必须使用手动编辑模式创建目标过滤器,以及检查组的所有权。

授予对组或角色的条件访问权

在许多情况下,授予组或角色对目录的特权访问时,您希望确保防止这些特权被试图假冒有特权用户的入侵者盗用。因此,在许多情况下,授予组或角色关键访问权的访问控制规则通常与许多条件关联。

例如,example.com 已经为其托管的每个公司,Company333 和 Company999,创建 Directory Administrator 角色。它希望这些公司能够管理其自己的数据,并实现自己的访问控制规则,同时防止入侵者。因此,Company333 和 Company999 具有对目录树中他们各自的分支的完全访问权限,前提是满足下列条件:

这些条件在每个公司的单个 ACI(ACI "Company333"和 ACI "Company999")中显示。由于这些 ACI 的内容相同,下面的示例只说明了 "Company333"。

ACI "Company333"

在 LDIF 中,要在上述条件下授予 Company333 对目录中他们各自的分支的完全访问权,可以写入下列语句:

aci: (target="ou=Company333,ou=corporate-clients,dc=example,dc=com")
 (targetattr = "*") (version 3.0; acl "Company333"; allow (all)
 (roledn="ldap:///cn=DirectoryAdmin,ou=Company333,
 ou=corporate-clients,dc=example,dc=com") and (authmethod="ssl")
 and (dayofweek="Mon,Tues,Wed,Thu") and (timeofday >= "0800" and
 timeofday <= "1800") and (ip="255.255.123.234"); )

此示例假设 ACI 被添加到 ou=Company333, ou=corporate-clients,dc=example,dc=com 条目。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的 Company333 条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入 "Company333"。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 将搜索区域设置为用户和组,并在搜索字段中键入 DirectoryAdmin。
    4. 此示例假设已经用 DirectoryAdmincn 创建了管理员角色。

    5. 单击“添加”按钮,在被授予访问权限的用户列表中列出管理员角色。
    6. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,单击“全部选中”按钮。
  5. 在“目标”选项卡上,单击“此条目”,在“目标目录条目”字段中显示 ou=Company333,ou=corporate-clients,dc=example,dc=com 后缀。
  6. 在“主机”选项卡上,单击“添加”按钮,显示“添加主机过滤器”对话框。在 IP 地址主机过滤器字段,键入 255.255.123.234。单击“确定”,关闭对话框。
  7. IP 地址必须是主机的有效 IP 地址,Company333 管理员将用来连接到 example.com 目录。

  8. 在“时间”选项卡上,选择对应于星期一到星期四,以及上午 8 点到下午 6 点的时间块。
  9. 表下方将显示一则消息,指定您选择的时间块。

  10. 要强制从 Company333 管理员进行 SSL 验证,请通过单击“手动编辑”按钮来切换到手动编辑。将下列内容添加到 LDIF 语句的末尾:
  11. and (authmethod="ssl")

    LDIF 语句应类似于:

    aci: (targetattr = "*")(target="ou=Company333,
     ou=corporate-clients,dc=example,dc=com") (version 3.0; acl
     "Company333"; allow (all) (roledn="ldap:///cn=DirectoryAdmin,
     ou=Company333,ou=corporate-clients, dc=example,dc=com") and
     (dayofweek="Mon,Tues,Wed,Thu") and (timeofday >= "0800" and
     timeofday <= "1800") and (ip="255.255.123.234") and
     (authmethod="ssl"); )

  12. 单击“确定”。
  13. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

拒绝访问

如果目录保存了对业务关键的信息,则可能特别希望拒绝对它的访问。

例如,example.com 希望所有用户都能够读取他们自己的条目下的诸如连接时间或帐户余额之类的记帐信息,但明确希望拒绝对该信息的写入访问。这部分分别在 ACI “记帐信息读取”ACI “记帐信息拒绝”中进行说明。

ACI “记帐信息读取”

在 LDIF 中,要授予用户读取他们自己的条目中记帐信息的权限,可以写入下列语句:

aci: (targetattr="connectionTime || accountBalance")
 (version 3.0; acl "Billing Info Read"; allow (search,read)
 userdn="ldap:///self";)

此示例假设已经在架构中创建相关的特性,并且 ACI 被添加到 ou=subscribers,dc=example,dc=com 条目。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的用户条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入“记帐信息读取”。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 在“添加用户和组”对话框中将搜索区域设置为特殊权限,并从搜索结果列表中选择自己。
    4. 单击“添加”按钮,在被授予访问权限的用户列表中列出自己。
    5. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,选中搜索和读取权限的复选框。确保其他复选框都被清除。
  5. 在“目标”选项卡上,单击“此条目”,在“目标目录条目”字段中显示 ou=subscribers, dc=example,dc=com 后缀。在特性表中,选中 connectionTimeaccountBalance 特性的复选框。
  6. 所有其他复选框都应该被清除。如果单击“一个都不选中”按钮,清除表中所有特性的复选框,然后单击“名称”标题按字母顺序组织它们,并且选择适当的特性,此任务会变得比较轻松。

    此示例假设您已经将 connectionTimeaccountBalance 特性添加到架构。

  7. 单击“确定”。
  8. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

ACI “记帐信息拒绝”

在 LDIF 中,要拒绝用户修改他们自己的条目中记帐信息的权限,可以写入下列语句:

aci: (targetattr="connectionTime || accountBalance")
 (version 3.0; acl "Billing Info Deny";
 deny (write) userdn="ldap:///self";)

此示例假设已经在架构中创建相关的特性,并且 ACI 被添加到 ou=subscribers,dc=example,dc=com 条目。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的用户条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入“记帐信息拒绝”。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 在“添加用户和组”对话框中将搜索区域设置为特殊权限,并从搜索结果列表中选择自己。
    4. 单击“添加”按钮,在被授予访问权限的用户列表中列出自己。
    5. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,选中写权限的复选框。确保其他复选框都被清除。
  5. 单击“手动编辑”按钮,在显示的 LDIF 语句中,将 allow 更改为 deny
  6. 在“目标”选项卡上,单击“此条目”,在“目标目录条目”字段中显示 ou=subscribers, dc=example,dc=com 后缀。在特性表中,选中 connectionTimeaccountBalance 特性的复选框。
  7. 所有其他复选框都应该被清除。如果单击“一个都不选中”按钮,清除表中所有特性的复选框,然后单击“名称”标题按字母顺序组织它们,并且选择适当的特性,此任务会变得比较轻松。

    此示例假设您已经将 connectionTimeaccountBalance 特性添加到架构。

  8. 单击“确定”。
  9. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

使用过滤器设置目标

如果希望设置访问控制,允许对分散在目录中的许多条目进行访问,则可能希望使用过滤器设置目标。请记住,由于搜索过滤器不直接指出要管理其访问的对象,因此容易无意中允许或拒绝对错误对象的访问,特别是在目录变得比较复杂时。此外,过滤器可能会使解决目录内的访问控制问题变得比较困难。

允许用户从组中添加或删除其自身

许多目录设置 ACI,允许用户从组中添加或删除他们自身。例如,这对于允许用户从邮件列表添加和删除他们自身是有用的。

在 example.com,雇员可以将他们自己添加到 ou=social committee 子树下的任何组条目。这部分在 ACI “组成员”示例中进行说明。

ACI “组成员”

在 LDIF 中,要授予 example.com 雇员从一个组中添加或删除他们自己的权限,可以写入下列语句:

aci: (targettattr="member")(version 3.0; acl "Group Members";
 allow (selfwrite)
 (userdn= "ldap:///uid=*,ou=People,dc=example,dc=com") ;)

此示例假设 ACI 被添加到 ou=social committee, dc=example,dc=com 条目。

可以通过执行以下操作从控制台设置此权限:

  1. 在“目录”选项卡上,右键单击左导航树中 example.com 节点下的 People 条目,并从弹出菜单中选择“设置访问权限”来显示“访问控制管理器”。
  2. 单击“新建”,显示“访问控制编辑器”。
  3. 在“用户/组”选项卡上的“ACI 名称”字段中,键入“组成员”。在被授予访问权限的用户列表中,执行以下操作:
    1. 选择并删除所有用户,然后单击“添加”。
    2. 显示“添加用户和组”对话框。

    3. 在“添加用户和组”对话框中将搜索区域设置为特殊权限,并从搜索结果列表中选择所有经过验证的用户。
    4. 单击“添加”按钮,列出被授予访问权限的用户列表中的所有经过验证的用户。
    5. 单击“确定”,关闭“添加用户和组”对话框。
  4. 在“权限”选项卡上,选中自身写入的复选框。确保其他复选框都被清除。
  5. 在“目标”选项卡上,“目标目录条目”字段中键入 dc=example,dc=com 后缀。在特性表中,选中 member 特性的复选框。
  6. 所有其他复选框都应该被清除。如果单击“一个都不选中”按钮,清除表中所有特性的复选框,然后单击“名称”标题按字母顺序组织它们,并且选择适当的特性,此任务会变得比较轻松。

  7. 单击“确定”。
  8. 新 ACI 被添加到“访问控制管理器”窗口中列出的 ACI 中。

为包含逗号的 DN 定义权限

包含逗号的 DN 需要在 LDIF ACI 语句中进行特殊处理。在 ACI 语句的目标和绑定规则部分,逗号必须要用单个反斜杠 (\) 进行转义。下面的示例说明了此语法:

dn: o=example.com Bolivia\, S.A.
objectClass: top
objectClass: organization
aci: (target="ldap:///o=example.com Bolivia\,S.A.")
 (targetattr="*") (version 3.0; acl "aci 2"; allow (all)
 groupdn = "ldap:///cn=Directory Administrators,
 o=example.com Bolivia\, S.A.";)

代理授权 ACI 示例

代理授权方法是验证的一种特殊形式:使用其自己的身份绑定到目录的用户通过代理授权被授予另一个用户的权限。

对于此示例,假设:

为了使客户机应用程序获得对 Accounting 子树的访问权(使用与 Accounting Administrator 相同的访问权限):

有了此 ACI,MoneyWizAcctSoftware 客户机应用程序可以绑定到目录并发送需要代理 DN 访问权限的 LDAP 命令,例如 ldapsearchldapmodify

在上述示例中,如果客户机希望执行 ldapsearch 命令,该命令将包括下列控制:

ldapsearch \
-D "uid=MoneyWizAcctSoftware,ou=Applications,dc=example,dc=com"\
-w password\
-y "uid=AcctAdministrator,ou=Administrators,dc=example,dc=com"\ ...

请注意,客户机作为其自身绑定,但被授予代理条目的权限。客户机不需要代理条目的口令。


不能使用目录管理员的 DN 作为代理 DN。也不能将代理权限授予目录管理员。此外,如果 Directory Server 在同一绑定操作中接收多个代理验证控制,则会向客户机应用程序返回一个错误,绑定尝试失败。



查看有效权限

维护目录中条目的访问策略时,它对了解您所定义的 ACI 安全性的结果非常有用。Directory Server 使您可以评估现有的 ACI,并报告它们为给定用户授予的针对给定条目的有效权限。

Directory Server 将响应可能包括在搜索操作中的“获得有效权限”控制。对此控制的响应是在搜索结果中返回有关条目和特性的有效权限信息。此额外信息包括每个条目以及每个条目中的每个特性的读取和写入权限。用于搜索的绑定 DN 或任意 DN,可能要求这些权限,允许管理员测试目录用户的权限。


警告

查看有效权限本身应该是受保护和受相应限制的目录操作。为 aclRightsaclRightsInfo 特性创建进一步的 ACI 以限制目录用户对此信息的访问。


有效的权限功能依赖于 LDAP 控制。要查看链接后缀上的有效权限,必须在链接策略中启用此控制,如“配置链接策略”中所述。还必须确保用于绑定到远程服务器的代理身份也被允许访问有效权限特性。

使用获得有效权限控制

通过使用带有 -J "1.3.6.1.4.1.42.2.27.9.5.2" 选项的 ldapsearch 命令来指定“获得有效权限”控制。默认情况下,该控制将在搜索结果中返回条目和特性上绑定 DN 条目的有效权限。使用下面的选项更改默认行为:

使用 -c-X 特性中的某一个或两者时,隐含了具有“获得有效权限”控制 OID 的 -J 选项,因此不必指定。如果为有效权限控制指定了空值,则检索当前用户权限和随当前 ldapsearch 操作返回的特性和条目的权限。

然后必须选择希望查看的信息类型:简单权限,或是讲述如何授予或拒绝这些权限的比较详细的记录信息。信息的类型是通过分别添加 aclRightsaclRightsInfo 来确定的,作为要在搜索结果中返回的特性。可以请求两个特性接收全部的有效权限信息,尽管简单权限带有详细日志记录信息中的信息是多余的。


aclRightsaclRightsInfo 特性具有虚拟操作特性的行为。它们不存储在目录中,因此除非明确请求,它们将不返回。这些特性是由 Directory Server 响应“获得有效权限”控制生成的。

因此,这些特性中没有特性可用于任何类型的过滤器或搜索操作中。


有效权限功能从启动搜索操作的用户继承影响访问控制的其他参数(如一天中的确切时间、验证方法、计算机地址和名称)。

下面的示例显示了用户如何可以查看她在目录中的权限。在结果中,1 表示授予了权限,0 表示拒绝了权限:

ldapsearch -J "1.3.6.1.4.1.42.2.27.9.5.2" \
           -h rousseau.example.com -p 389 \
           -D "uid=cfuente,ou=People,dc=example,dc=com" \
           -w password -b "dc=example,dc=com" \
           "(objectclass=*)" aclRights

dn: dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: ou=Groups, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: cn=Accounting Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: cn=HR Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: uid=bjensen,ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: uid=cfuente, ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:1,proxy:0

此结果向 Carla Fuente 显示了目录中的条目,在此,她至少具有读取权限,并且可以修改她自己的条目。有效权限控制不能避开正常的访问权限,因此用户将无法看到他们没有读取权限的条目。在下面的示例中,目录管理员可以看到 Carla Fuente 没有读取权限的条目:

ldapsearch -h rousseau.example.com -p 389 \
           -D "cn=Directory Manager" -w password \
           -c "dn: uid=cfuente,ou=People,dc=example,dc=com" \
           -b "dc=example,dc=com" \
           "(objectclass=*)" aclRights

dn: dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: ou=Groups, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: cn=Directory Administrators, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:0,write:0,proxy:0

dn: ou=Special Users,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:0,write:0,proxy:0

dn: ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: cn=Accounting Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: cn=HR Managers,ou=groups,dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: uid=bjensen,ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

dn: uid=cfuente, ou=People, dc=example,dc=com
aclRights;entryLevel: add:0,delete:0,read:1,write:1,proxy:0

在上面的输出中,目录管理员可以看到 Carla Fuente 甚至都不能查看的目录树中特殊用户和目录管理员分支。在下面的示例中,目录管理员可以看到 Carla Fuente 不能修改其自身条目中的 mailmanager 特性:

ldapsearch -h rousseau.example.com -p 389 \
           -D "cn=Directory Manager" -w password \
           -c "dn: uid=cfuente,ou=People,dc=example,dc=com" \
           -b "dc=example,dc=com" \
           "(uid=cfuente)" aclRights "*"

version: 1
dn: uid=cfuente, ou=People, dc=example,dc=com

aclRights;attributeLevel;mail: search:1,read:1,compare:1,
 write:0,selfwrite_add:0,selfwrite_delete:0,proxy:0
mail: cfuente@example.com

aclRights;attributeLevel;uid: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
uid: cfuente

aclRights;attributeLevel;givenName: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
givenName: Carla

aclRights;attributeLevel;sn: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
sn: Fuente

aclRights;attributeLevel;cn: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
cn: Carla Fuente

aclRights;attributeLevel;userPassword: search:0,read:0,
 compare:0,write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
userPassword: {SSHA}wnbWHIq2HPiY/5ECwe6MWBGx2KMiZ8JmjF80Ow==

aclRights;attributeLevel;manager: search:1,read:1,compare:1,
 write:0,selfwrite_add:0,selfwrite_delete:0,proxy:0
manager: uid=bjensen,ou=People,dc=example,dc=com

aclRights;attributeLevel;telephoneNumber: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
telephoneNumber: (234) 555-7898

aclRights;attributeLevel;objectClass: search:1,read:1,compare:1,
 write:1,selfwrite_add:1,selfwrite_delete:1,proxy:0
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson

aclRights;entryLevel: add:0,delete:0,read:1,write:0,proxy:0

了解有效权限结果

根据指定的选项的不同,有效权限请求将返回下列信息:

权限信息

有效权限信息按照下列子类型提供:

aclRights;entrylevel

提供条目级权限信息

aclRights;attributelevel

提供特性级权限信息

aclRightsInfo;entrylevel

提供条目级日志记录信息

aclRightsInfo;attributelevel

提供特性级日志记录信息

aclRights 字符串的格式为:permission:value(permission:value)*

可能的条目级权限包括 adddeletereadwriteproxy。可能的特性级权限包括 readsearchcomparewriteselfwrite_addselfwrite_deleteproxy

这些权限的值可以是下列之一:

Write、Selfwrite_add 和 Selfwrite_delete 权限

在 Directory Server 5.2 中,只有写入特性级权限的值可以为 "?"。对于添加和删除权限,您可以添加和删除的条目取决于条目中属性的值。当条目随 ldapsearch 操作返回时,还将针对这些条目返回权限值(0 或 1),而不是返回 "?"

如果 write 权限的值为 1,则授予添加和删除所有值(授权 dn 值除外)的 ldapmodify 操作的权限。如果 write 权限的值为 0,则不授予添加或删除任何值(授权 dn 值除外)的 ldapmodify 操作的权限。授权 dn 的值的权限将显式地以 selfwrite 权限之一返回,即 selfwrite_addselfwrite_delete

尽管selfwrite-add 和 selfwrite-delete 属性级权限在 ACI 环境中不存在,但一组 ACI 可以将 selfwrite 权限授予用户,即只具有修改操作的添加权限或删除权限。对于 selfwrite 权限,正在修改的特性值就是授权 dn。但是 write 权限就不具备这一特征,因为写入权限的正在修改的特性值是未定义的。

如果说有效权限取决于 targattrfilters ACI,则"?"值就表明应该参阅日志记录信息以了解更多的权限详细信息。针对 write、selfwrite_add 和 selfwrite_delete 权限之间的相互依赖性引起的相对复杂性,表 6-3 解释了这三个权限所形成的可能的组合含义。

表 6-3 有效权限相互依赖性

write

selfwrite_add

selfwrite_delete

有效权限说明

0

0

0

无法添加或删除此特性的任何值。

0

0

1

仅能删除授权 dn 的值。

0

1

0

仅能添加授权 dn 的值。

0

1

1

仅能添加或删除授权 dn 的值。

1

0

0

可以添加或删除授权 dn 之外的所有值。

1

0

1

可以删除包括授权 dn 在内的所有值,并且可以添加授权 dn 之外的所有值。

1

1

0

可以添加包括授权 dn 在内的所有值,并且可以删除授权 dn 之外的所有值。

1

1

1

可以添加或删除此特性的所有值。

?

0

0

无法添加或删除授权 dn 值,但是也许可以添加或删除其他值。有关写入权限的进一步详细信息,请参阅日志记录信息。

?

0

1

可以删除但不可以添加授权 dn 的值,并且也许可以添加或删除其他值。有关写入权限的进一步详细信息,请参阅日志记录信息。

?

1

0

可以添加但不可以删除授权 dn 的值,并且也许可以添加或删除其他值。有关写入权限的进一步详细信息,请参阅日志记录信息。

?

1

1

可以添加和删除授权 dn 的值,并且也许可以修改添加或修改删除其他值。有关写入权限的进一步详细信息,请参阅日志记录信息。

日志记录信息

有效权限日志记录信息使您可以了解并调试访问控制困难。日志记录信息中包含访问控制的摘要信息,称为 acl_summary,它可以指明允许或拒绝访问控制的原因。访问控制摘要信息包括下列内容:

有关精确的日志文件格式,请参阅 Directory Server Administration Reference


高级访问控制:使用宏 ACI

在使用重复目录树结构的组织中,可以通过使用宏来优化目录中使用的 ACI 的数量。减少目录树中 ACI 的数量使得管理访问控制策略更轻松,并且可以提高 ACI 内存使用的效率。

宏是用于表示 ACI 中的 DN 或 DN 的一部分的占位符。可以使用宏来代表 ACI 目标部分、绑定规则部分或两者中的 DN。实际上,当 Directory Server 获取一个传入 LDAP 操作时,ACI 宏与 LDAP 操作作为目标的资源进行匹配,以确定匹配的子字符串(如果有)。如果匹配,则将使用匹配的子字符串扩展绑定规则端的宏,并通过评估已扩展的绑定规则来确定对资源的访问权限。

宏 ACI 示例

使用示例可以更好地讲述宏 ACI 的优点以及工作方式。图 6-4 显示了一个目录树,其中使用宏 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 树中的任何条目的读取和搜索权限。

图 6-4 宏 ACI 的示例目录树

显示宏 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 位于 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 语法

为了简化本节中的讨论,用于提供诸如 userdnroledngroupdnuserattr 绑定凭证的 ACI 关键字统称为 ACI 的主题。主题确定 ACI 应用的对象。

宏 ACI 包括下列类型的表达式以替换 DN 或 DN 的一部分:

表 6-5 显示了在 ACI 的哪些部分可以使用 DN 宏:

表 6-5 ACI 关键字中的宏

ACI 关键字

($dn)

target、targetfilter、userdn、roledn、groupdn、userattr

[$dn]

targetfilter、userdn、roledn、groupdn、userattr

($attr.attrName)

userdn、roledn、groupdn、userattr

下面的限制适用:

匹配目标中的 ($dn)

ACI 的目标中的 ($dn) 宏通过与 LDAP 请求的目标条目相比较来确定替换值。例如,如果有目标为 cn=all,ou=groups,dc=subdomain1, dc=hostedCompany1,dc=example,dc=com 条目的 LDAP 请求,定义目标的 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"

宏扩展后,Directory Server 遵循正常的过程评估 ACI 以确定是否授予访问权限。


与标准 ACI 不同,使用宏替换的 ACI 不一定有必要授予对目标条目的子条目的访问权限。原因是当子条目的 DN 是目标时,替换可能不会在主题字符串中创建一个有效 DN。


替换主题中的 [$dn]

[$dn] 的替换机制与 ($dn) 的替换机制稍微有些不同。多次检查目标资源的 DN,每次都丢弃最左边的 RDN 组件,直到找到匹配为止。

例如,有目标为 cn=all,ou=groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com 子树的 LDAP 请求,以及下列 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
  3. 结果主题是 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=subdomain1,dc=hostedCompany1,dc=example,dc=com"。如果由于绑定 DN 是该组的成员而被授予访问权,则宏扩展停止,并评估 ACI。如果不是成员,则该过程继续。

  4. 将主题中的 [$dn] 替换为 dc=hostedCompany1
  5. 结果主题是 groupdn="ldap:///cn=DomainAdmins,ou=Groups, dc=hostedCompany1,dc=example,dc=com"。还要检测绑定 DN 是否为小组成员,如果是,ACI 将被完全评估。如果不是成员,宏扩展将在匹配值的最后一个 RDN 处停止并且此 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";)

它授予 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) 的宏匹配

($attr.attrname) 宏始终用在 DN 的主题部分。例如,可以定义下列 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"

然后 Directory Server 根据正常的 ACI 评估算法对 ACI 进行评估。

当在宏中命名的特性是多值时,每个值都用于扩展宏,并使用提供成功匹配的第一个值。


访问控制和复制

ACI 是作为条目的特性存储的,因此,如果包含 ACI 的条目是已复制后缀的组成部分,则 ACI 会像任何其他特性那样被复制。

ACI 始终是在为传入 LDAP 请求提供服务的目录服务器上进行评估的。这意味着,当使用者服务器接收到更新请求时,它返回的结果是引用主服务器,而不管主服务器是否可以处理该请求。


访问控制和链接

如果目录树使用链接功能分布在多个服务器上,则可以在访问控制语句中使用的关键字会有某些限制:有关详细信息,请参阅ACI “限制”

当已验证的用户访问链接后缀时,服务器会将此用户的身份发送到远程服务器。访问控制始终在远程服务器上进行评估。在远程服务器上评估的每个 LDAP 操作使用客户机应用程序(通过已代理的授权控件进行传递)的原始身份。只有当用户对远程服务器上包含的子树具有正确的访问控制时,操作才能在远程服务器上获得成功。这表示需要向远程服务器添加仅有少许限制的常规访问控制。有关详细信息,请参阅“通过已链接的后缀进行的访问控制”


记录访问控制信息

要获得错误日志中有关访问控制的信息,必须设置适当的日志等级。

要从控制台设置错误日志等级,请执行以下操作:

  1. 在 Directory Server Console 的顶级“目录”选项卡中,右键单击 cn=config 节点,然后从弹出菜单中选择“用通用编辑器进行编辑”。
  2. 显示的通用编辑器中具有 cn=config 条目的内容。

  3. 向下滚动特性值对的列表,找到 nsslapd-errorlog-level 特性。
  4. nsslapd-errorlog-level 字段中已显示的值加上 128。
  5. 例如,如果显示的值是 8192(复制调试),则应该将其更改为 8320。有关错误日志等级的完整信息,请参阅 《Directory Server Administration Reference》。

  6. 单击“确定”保存更改,并关闭通用编辑器。


与早期版本的兼容性

Directory Server 早期版本中使用的某些 ACI 关键字在 Directory Server 5.2 中已不再使用。但是,为了实现向后兼容性,这些关键字仍受支持。这些关键字包括:

因此,如果在旧版供应商服务器和使用者 Directory Server 5.2 之间设置了复制协议,就不应该在复制 ACI 时遇到任何问题。

不过,我们建议您使用 userattr 关键字的功能替换这些关键字,如“基于值匹配来定义访问”中所述。



上一章      目录      索引      下一章     


版权所有 2004 Sun Microsystems, Inc. 所有权利保留。