Sun ONE logo     上一章     目录     索引     文档主页     下一章    
Sun ONE Directory Server 管理指南



第 6 章   管理访问控制

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

在目录部署的规划阶段中,您应当定义一种访问控制策略,用来服务于整体安全策略。有关规划访问控制策略的提示,请参阅 Sun ONE Directory Server 部署指南 中的第 7 章“设计访问控制”。

本章包括以下主题:

访问控制的原理

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

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

ACI 结构

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

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

  • 目标 - 确定要应用权限的条目或属性。
  • 权限 - 定义被允许或被拒绝的操作。
  • 绑定规则 - 根据用户的绑定 DN 确定服从 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 限制

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

  • 如果目录树使用链接功能分布在多个服务器上,则某些限制应用于可以在访问控制语句中使用的关键字:
    • 依赖于组条目(groupdn 关键字)的 ACI 必须位于与组条目相同的服务器上。如果该组是动态的,那么该组的所有成员也必须在服务器上具有一个条目。如果该组是静态的,那么成员的条目可以位于远程服务器上。
    • 依赖于角色定义(roledn 关键字)的 ACI 必须位于与角色定义条目相同的服务器上。计划拥有角色的每个条目也必须位于相同的服务器上。

    然而,可以将存储在目标条目中的值与存储在绑定用户(例如,使用 userattr 关键字)的条目中的值进行值匹配。即使绑定用户在服务器上不具有持有该 ACI 的条目,也可以正常地对访问进行评估。

    有关如何链接访问控制评估的详细信息,请参阅“通过已链接的后缀进行的访问控制”

  • CoS 生成的属性并不能在所有 ACI 关键字中使用。具体来说,不应该将 CoS 生成的属性与 userattruserdnattr 关键字一起使用,因为访问控制规则将不起作用。详细信息,请参阅"使用 userattr 关键字"。有关 CoS 的详细信息,请参阅第 5 章“高级条目管理”
  • 访问控制规则始终是在本地服务器上进行评估的。一定不要在 ACI 关键字中使用的 LDAP URL 中指定服务器的主机名或端口号。如果这样做,LDAP URL 将根本不会被予以考虑。详细信息,请参阅 Sun ONE Directory Server 参考手册 中的附录 D“LDAP URL”
  • 授予代理权限时,不能授予用户作为目录管理员进行代理的权限,也不能向目录管理员授予代理权限。

默认 ACI

安装目录服务器时,下列默认 ACI 是在配置期间指定的根后缀中定义的:

  • 所有用户具有对目录的搜索、比较和读取操作的匿名访问权。
  • 绑定用户可以修改目录中他们自己的条目,但不能删除。他们不能修改 acinsrolednpasswordPolicySubentry 属性,也不能修改任何资源限制属性、口令策略状态属性或者帐户锁定状态属性。
  • 配置管理员(默认情况下,uid=admin,ou=Administrators, ou=TopologyManagement,o=NetscapeRoot)具有除代理权限之外的所有权限。
  • “配置管理员”组的所有成员都具有除代理权限之外的所有权限。
  • “目录系统管理员”组的所有成员都具有除代理权限之外的所有权限。
  • SIE 组的所有成员都具有除代理权限之外的所有权限。SIE 组是“管理服务器”中此目录的服务器组的管理员。

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

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

  • “配置管理员”组的所有成员都具有对 NetscapeRoot 子树的除代理权限之外的所有权限。这样,他们可以将新成员添加到“配置管理员”组中。
  • 所有用户具有对 NetscapeRoot 子树的进行搜索和读取操作的匿名访问权。
  • 组扩展 ACI 允许管理组的成员访问组定义。

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

ACI 语法

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



提示

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



aci 属性具有下列语法:

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

其中:

  • target 指定要控制其访问的条目、属性或条目和属性集。目标可以是可分辨的名称、一个或多个属性,或单个 LDAP 过滤器。目标是可选的。没有指定目标时,ACI 应用于定义 ACI 的整个条目及其所有子条目。
  • version 3.0 是标识 ACI 版本所必需的字符串。
  • "name" 是 ACI 的名称。名称可以是标识 ACI 的任何字符串。ACI 名称是必需的,并应该描述 ACI 的效果。
  • 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 "aci1"; allow (write) userdn="ldap:///self";)

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

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

定义目标

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

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

(keyword = "expression")

(keyword != "expression")

其中:

  • keyword 表示目标的类型。目标的下列类型是由表 6-1 中的关键字定义的:
    • 目录条目或其子树。
    • 条目的属性。
    • 匹配 LDAP 过滤器的一组条目或属性。
    • 匹配 LDAP 过滤器的属性值或值组合。

  • 等号 (=) 表示目标是 expression 中指定的对象,而不等号 (!=) 表示目标是 expression 中未指定的任何对象。
  • expression 取决于关键字,并标识目标。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")



注意

如果访问控制规则应用的条目的 DN 包含逗号,则必须使用单反斜杠 (\) 转义逗号。例如:

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



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

  • (target="ldap:///uid=*,dc=example,dc=com")
  • 匹配整个 example.com 树中的在条目的 RDN 中具有 uid 属性的每一个条目。此目标将与树中任意深度的条目相匹配,例如:

    uid=tmorris,ou=sales,dc=example,dc=com
    uid=yyorgens,ou=marketing,dc=example,dc=com
    uid=bjensen,ou=eng,ou=east,dc=example,dc=com

  • (target="ldap:///uid=*Anderson,ou=People,dc=example,dc=com")
  • 匹配 uid 以 Anderson 结尾的 ou=People 分支中的每个条目。

  • (target="ldap:///*Anderson,ou=People,dc=example,dc=com")
  • 匹配 RDN 以 Anderson 结尾的 ou=People 分支中的每个条目,不考虑其命名属性。

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



注意

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

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

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



将属性作为目标

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

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

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

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

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

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

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

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

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

将条目和属性作为目标

默认情况下,包含 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 搜索过滤器。有关过滤器语法的详细信息,请参阅 Sun ONE Directory Server 入门指南 中的第 4章“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")

其中:

    • add 代表创建属性的操作。
    • del 代表删除属性的操作。
    • attrn 代表目标属性。
    • Fn 代表只应用于关联属性的过滤器。

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

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

例如,请考虑下列属性过滤器:

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

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



注意

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



将单个目录条目作为目标

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

  • 通过创建绑定规则,以匹配绑定请求中的用户输入与目标条目中存储的属性值。详细信息,请参阅“基于值匹配来定义访问”
  • 通过使用 targetfilter 关键字。

使用 targetfilter 关键字可以指定仅出现在所需条目中的属性值。例如,在安装目录服务器期间,创建下列 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。

设定权限

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

设置权限有两部分:

  • 允许或拒绝访问
  • 指派权限

允许或拒绝访问

可以显式允许或拒绝对目录树的访问权限。有关何时允许访问以及何时拒绝访问的详细指导说明,请参阅 Sun ONE Directory Server 部署指南 中的第 7章“设计访问控制”。



注意

不能从 Server Console 显式拒绝访问,而只能授予权限。



指派权限

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

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

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

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

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

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

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

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

代理。表示指定的 DN 是否可以用另一个条目的权限访问目标。可以使用目录中任何用户的 DN 授予代理访问权限,但目录管理员 DN 除外。此外,也不能将代理权限授予目录管理员。“代理授权 ACI 示例”中提供了一个示例。有关代理访问的概述,请参阅 Sun ONE Directory Server 部署指南

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

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

LDAP 操作所需的权限

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

添加条目:

  • 授予针对被添加的条目的添加权限。
  • 授予针对该条目中的每个属性值的写入权限。默认情况下授予此权限,但可以使用 targattrfilters 关键字进行限制。

删除条目:

  • 授予针对要删除的条目的删除权限。
  • 授予针对该条目中的每个属性值的写入权限。默认情况下授予此权限,但可以使用 targattrfilters 关键字进行限制。

修改条目中的属性:

  • 授予针对属性类型的写入权限。
  • 授予针对每个属性类型值的写入权限。默认情况下授予此权限,但可以使用 targattrfilters 关键字进行限制。

修改条目的 RDN:

  • 授予针对该条目的写入权限。
  • 授予针对新 RDN 中使用的属性类型的写入权限。
  • 如果需要授予删除旧 RDN 的权限,则授予针对旧 RDN 中使用的属性类型的写入权限。
  • 授予针对新 RDN 中使用的属性类型值的写入权限。默认情况下授予此权限,但可以使用 targattrfilters 关键字进行限制。

比较属性的值:

  • 授予针对属性类型的比较权限。

搜索条目:

  • 授予针对搜索过滤器中使用的每个属性类型的搜索权限。
  • 授予针对该条目中使用的属性类型的读取权限。

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

% ldapsearch -h 主机 -s 后缀 -b "uid=bjensen,dc=example,dc=com" \
             objectclass=* mail

下列 ACI 用于确定是否可以为用户 bkolics 授予访问权:

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

搜索结果列表是空的,因为此 ACI 没有授予对 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 个以逗号分隔的关键字。有效的关键字有:readwriteadddeletesearchcompareselfwriteproxyall

在下列示例中,如果绑定规则被评估为 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 || DN

roledn

ldap:///DN || 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


simple
ssl
sasl authentication_method

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

定义用户访问 - userdn 关键字

使用 userdn 关键字定义用户访问。userdn 关键字需要一个或多个有效可分辨的名称,并采用以下格式:

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

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

  • userdn = "ldap:///anyone" - 同时适用于匿名用户和经过验证的用户。
  • userdn = "ldap:///all" - 仅适用于经过验证的用户。
  • userdn = "ldap:///self" - 仅适用于与 ACI 目标条目相同的用户。
  • userdn = "ldap:///parent" - 仅适用于 ACI 目标的父条目。

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

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



注意

如果 DN 包含逗号,则逗号前面必须要用反斜杠 (\) 转义符。



匿名访问(anyone 关键字)

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

一般访问(all 关键字)

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

自访问(self 关键字)

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

父访问(parent 关键字)

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

LDAP URL

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

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

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

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



注意

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



有关 LDAP URL 的详细信息,请参阅 Sun ONE Directory Server 入门指南 中的相应章节。

通配符

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

可以从 Server Console,在“访问控制编辑器”中设置用户访问。详细信息,请参阅“使用控制台创建 ACI”

示例

本节包含 userdn 语法的示例。

包含 LDAP URL 的关键字 Userdn:

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

如果用户使用指定模式的任何可分辨的名称绑定到目录,则绑定规则被评估为 true。例如,下列两个绑定 DN 将被评估为 true:

uid=ssarette,dc=example,dc=com
uid=tjaz,ou=Accounting,dc=example,dc=com

而下列绑定 DN 将被评估为 false:

cn=Babs Jensen,dc=example,dc=com

包含 LDAP URL 的逻辑 OR 的关键字 Userdn:

userdn="ldap:///uid=bj,c=example.com || ldap:///uid=kc,dc=example,dc=com";

如果客户机作为提供的两个可分辨名称中的任何一个绑定,则绑定规则被评估为 true。

排除特定 LDAP URL 的关键字 Userdn:

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

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

包含关键字 self 的 Userdn 关键字:

userdn = "ldap:///self";

如果用户正在访问由 DN(通过该 DN 用户绑定到目录)代表的条目,则绑定规则被评估为 true。即,如果用户已经绑定为 uid=ssarettedc=example,dc=com,并且用户正在尝试对 uid=ssarette,dc=example,dc=com 条目执行操作,那么绑定规则为 true。

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

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

包含 all 关键字的 Userdn 关键字:

userdn = "ldap:///all";

对于任何有效的绑定 DN,绑定规则被评估为 true。要为 true,在绑定操作期间,用户必须提供有效的可分辨名称和口令。

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

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

包含 anyone 关键字的 Userdn 关键字:

userdn = "ldap:///anyone";

绑定规则对于任何人被评估为 true;可以使用此关键字提供对目录的匿名访问。

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

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

包含 parent 关键字的 Userdn 关键字:

userdn = "ldap:///parent";

如果绑定 DN 是目标条目的父级,则绑定规则被评估为 true。

例如,如果需要授予对每个用户的子条目的写入访问,则可以在 dc=example,dc=com 节点创建下列 ACI:

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

如果用户属于 engineering 或 sales 子树,则绑定规则被评估为 true。

定义组访问 - groupdn 关键字

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

groupdn 关键字需要一个或多个有效的可分辨名称,并采用以下格式:

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

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



注意

如果 DN 包含逗号,则逗号必须要用反斜杠 (\) 进行转义。



可以从 Server Console,在“访问控制编辑器”上定义特定组。详细信息,请参阅“使用控制台创建 ACI”

示例

本节包含 groupdn 语法的示例。

包含 LDAP URL 的 Groupdn 关键字:

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 关键字:

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 关键字可用于指定哪些属性值必须在用于绑定的条目和目标条目之间进行匹配。

可以指定:

  • 用户 DN
  • 组 DN
  • 角色 DN
  • LDAP 过滤器,在 LDAP URL 中
  • 任何属性类型

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

userattr = "attrName#bindType"

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

userattr = "attrName#attrValue"

其中:

  • attrName 是用于进行值匹配的属性的名称
  • bindTypeUSERDNGROUPDNLDAPURL 中的某一个
  • attrValue 是代表属性值的任何字符串


  • 注意

    决不能将服务类 (CoS) 定义生成的属性与 userattr 关键字一起使用。包含取决于 CoS 生成的属性值的绑定规则的 ACI 将不工作。



下面几节提供具有各种可能的绑定类型的 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"

其中 :

  • inheritance_level 是逗号分隔的列表,表示目标下面多少级别将继承 ACI。可以包括目标条目下面五个级别 [0,1,2,3,4];零 (0) 表示目标条目。
  • attributeuserattrgroupattr 关键字针对的属性。
  • bindType 可以为 USERDNGROUPDNLDAPURLROLEDN 绑定类型不支持继承性。

例如:

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

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

具有 userattr 继承性的示例

下图中的示例表示用户 bjensen 被允许读取和搜索 cn=Profiles 条目以及包括 cn=mailcn=news 的第一个级别的子条目,从而允许她搜索她自己的邮件和新闻 ID。

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

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

  • 为用户 bjensen 显式设置针对目录中 cn=Profilescn=mail 以及
    cn=news 条目的读取和搜索访问。
  • cn=mailcn=news 条目添加值为 bjensen 的 owner 属性,然后将下列 ACI 添加到 cn=mailcn=news
  • aci:(targetattr="*") (version 3.0; acl "profiles access"; allow
     (read,search) userattr="owner#USERDN";)

使用 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 是一个或多个以逗号分隔的元素列表,可能为以下任意值:

  • 特定 IPv4 地址: 123.45.6.7
  • 带有通配符的 IPv4 地址用来指定子网络: 12.3.45.*
  • 带有子网掩码的 IPv4 地址或子网络: 123.45.6.*+255.255.255.115
  • 以任意合法形式出现的 IPv6 地址,如 RFC 2373 (http://www.ietf.org/rfc/rfc2373.txt) 中定义。以下地址是等效的:
    • 12AB:0000:0000:CD30:0000:0000:0000:0000
    • 12AB::CD30:0:0:0:0
    • 12AB:0:0:CD30::

  • 带有子网前缀长度的 IPv6 地址:12AB::CD30:0:0:0:0/60

如果访问目录的客户机位于指定的 IP 地址,则绑定规则被评估为 true。对于只允许从特定子网或计算机进行的某些类型的目录访问非常有用。

可以从 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 点之间进行访问。用于评估访问权限的时间是目录服务器上的时间,而不是客户机上的时间。

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

timeofday operator"time"

其中 operator 可以是下列符号之一:等号 (=)、不等号 (!=)、大于号 (>)、大于等于号 (>=)、小于号 (<) 或小于等于号 (<=)。

timeofday 关键字要求以 24 小时时钟格式的小时和分钟表示的时间(0 到 2359)。



注意

使用服务器上的时间进行评估,而不是客户机上的时间。



设置基于星期内的绑定规则的 LDIF 语法如下所示:

dayofweek = "day1, day2 ..."

dayofweek 关键字的可能值是星期几的三个英语字母缩写:sunmontuewedthufrisat

示例

下面是 timeofdaydayofweek 语法的示例:

timeofday = "1200";

如果客户机正好在中午访问目录,则绑定规则是 true。

timeofday != "0100";

如果客户机在上午 1 点之外的任何时间访问目录,则绑定规则被评估为 true。

timeofday > "0800";

如果客户机在上午 8 点以后的任何时间访问目录,则绑定规则被评估为 true。

timeofday < "1800";

如果客户机在下午 6 点之前的任何时间访问目录,则绑定规则被评估为 true。

timeofday >= "0800";

如果客户机在上午 8 点或之后访问目录,则绑定规则被评估为 true。

timeofday <= "1800";

如果客户机在下午 6 点或之前访问目录,则绑定规则被评估为 true。

dayofweek = "Sun, Mon, Tue";

如果客户机在星期日、星期一或星期二访问目录,则绑定规则被评估为 true。

定义基于验证方法的访问

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

  • None - 不需要验证。这是默认值。它代表匿名访问。
  • Simple - 客户机必须提供用户名和口令才能绑定到目录。
  • SSL - 客户机必须通过安全套接字层 (SSL) 或传输层安全性 (TLS) 连接绑定到目录。
  • 在 SSL 的情况下,建立到 LDAPS 第二个端口的连接;在 TLS 的情况下,通过开始 TLS 操作建立连接。在这两种情况下,都必须提供证书。有关设置 SSL 的信息,请参阅第 11 章“实现安全性”

  • SASL - 客户机必须通过简单验证和安全层 (SASL) 连接绑定到目录。注意,Sun ONE Directory Server 不提供 SASL 模块。

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

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

authmethod = "authentication_method"

其中 authentication_methodnonesimplessl"sasl sasl_mechanism"。

示例

下面是 authmethod 关键字的示例:

authmethod = "none";

在绑定规则评估期间不检查验证。

authmethod = "simple";

如果客户机使用用户名和口令访问目录,则绑定规则被评估为 true。

authmethod = "ssl";

如果客户机通过 LDAPS 使用证书向目录进行验证,则绑定规则被评估为 true。如果客户机通过 LDAPS 使用简单验证(绑定 DN 和口令)进行验证,则不会为 true。

authmethod = "sasl DIGEST-MD5";

如果客户机使用 SASL DIGEST-MD5 机制访问目录,则绑定规则被评估为 true。其他受支持的 SASL 机制有 EXTERNAL 和 GSSAPI(仅限 Solaris 系统)。

使用布尔绑定规则

绑定规则可以是使用布尔表达式 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";)

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

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

  • 首先从内到外对括号表达式进行评估
  • 从左向右对所有表达式进行评估
  • NOT 先于 AND 或 OR 运算符

布尔 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 控制台的顶级“目录”标签中,右键单击带有 ACI 的条目,并选择“用通用编辑器进行编辑”菜单项。然而,aci 值通常是难以在此对话框中查看和编辑的长字符串。

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

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

% ldapsearch -h 主机 -p 端口 -D "cn=Directory Manager" -w 口令 \
             -b entryDN -s base aci

结果为 LDIF 文本,可以将其复制到新的 LDIF ACI 定义中以便用于编辑。



注意

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



使用控制台创建 ACI

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

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

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

查看条目的 ACI

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

图 6-2    “访问控制管理”对话框

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

  • 单击“新建”,在选定对象及其整个子树上定义新的访问权限。显示“ACI 编辑器”,如下图所示。
  • 图 6-3    “ACI 编辑器”对话框

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

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

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

    创建新的 ACI

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

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

    3. 在“ACI 名称”文本框中键入名称来对 ACI 进行命名。
    4. 名称可以是任何字符串,用于唯一地标识该 ACI。如果没有输入名称,服务器将使用 unnamed 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 entry。注意,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=example-people,dc=example, dc=com 条目。

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

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

      3. 将“搜索”区域设置为“特殊权限”,并从搜索结果列表中选择“自身”。
      4. 单击“添加”按钮,在被授予访问权限的用户列表中列出“自身”。
      5. 单击“确定”,关闭“添加用户和组”对话框。

    4. 在“权限”标签上,选中写权限的复选框。确保其他复选框都被清除。
    5. 在“目标”标签上,单击“此条目”,在目标目录条目字段中显示 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=example-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=example-people 分支的完全访问权,以使他们可以更新雇员目录。这部分在 ACI“HR” 示例中进行说明。

    ACI“HR”

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

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

    此示例假设 ACI 被添加到 ou=example-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)") (version 3.0; acl "Create Group";
     allow (read,search,add) (userdn= "ldap:///uid=*,ou=example-people,
     dc=example,dc=com") and dns="*.example.com";)



    注意

    此 ACI 不授予写权限,这意味着条目创建者无法修改条目。



    此示例假设 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)")

      LDIF 语句的形式应该如下:

      (targetattr = "*") (targattrfilters="add=objectClass:(objectClass=groupOfNames)") (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 Comittee 分支下修改或删除他们所拥有的组条目的权限,可以写入下列语句:

    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)创建目录系统管理员角色。它希望这些公司能够管理其自己的数据,并实现自己的访问控制规则,同时防止入侵者。因此,Company333 和 Company999 具有对目录树中他们各自的分支的完全访问权限,前提是满足下列条件:

    • 通过 SSL 使用证书验证连接
    • 在上午 8 点和下午 6 点之间,星期一到星期四请求访问,以及
    • 每个公司从指定 IP 地址请求访问。

    这些条件在每个公司的单个 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=example-people,dc=example,dc=com") ;)

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

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

    1. 在“目录”标签上,右键单击左导航树中 example.com 节点下的 example-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:dc=example.com Bolivia\, S.A.,dc=com
    objectClass:top
    objectClass:organization
    aci:(target="ldap:///dc=example.com Bolivia\,
     S.A.,dc=com")(targetattr="*") (version 3.0; acl "aci 2"; allow
     (all) groupdn = "ldap:///cn=Directory Administrators,dc=example.com
     Bolivia\, S.A.,dc=com";)

    代理授权 ACI 示例

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

    对于此示例,假设:

    • 客户机应用程序的绑定 DN 是 "uid=MoneyWizAcctSoftware, ou=Applications,dc=example,dc=com"。
    • 客户机应用程序请求对其进行访问的目标子树是 ou=Accounting,dc=example,dc=com
    • 目录中已经存在具有对 ou=Accounting,dc=example,dc=com 子树访问权限的 Accounting Administrator。

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

    • Accounting Administrator 必须具有对 ou=Accounting,dc=example,dc=com 子树的访问权限。例如,下面的 ACI 将所有权限授予 Accounting Administrator 条目:
    • aci:(target="ldap:///ou=Accounting,dc=example,dc=com")
       (targetattr="*") (version 3.0; acl "allowAll-AcctAdmin"; allow
       (all) userdn="uid=AcctAdministrator,ou=Administrators,
       dc=example,dc=com")

    • 目录中必须存在下列 ACI 向客户机应用程序授予代理权限:
    • aci:(target="ldap:///ou=Accounting,dc=example,dc=com")
       (targetattr="*") (version 3.0; acl "allowproxy-
       accountingsoftware"; allow (proxy) userdn=
       "uid=MoneyWizAcctSoftware,ou=Applications,dc=example,dc=com")

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

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

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

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



    注意

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



    查看有效权限

    在目录的条目上维护访问策略时,知道对您定义的 ACI 安全性产生的影响非常有帮助。Sun ONE Directory Server 5.2 引入了一种新机制,用于评估现有的 ACI,并报告它们为给定用户授予的针对给定条目的有效权限。

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



    警告

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



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

    使用“获得有效权限”控制

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

    • -c "dn:DN" - 搜索结果将显示与给定 DN 绑定的用户的有效权限。此选项允许管理员检查另一个用户的有效权限。选项 -c "dn:"将显示匿名验证的有效权限。
    • -X "attributeName ..." - 搜索结果还将包括指定属性的有效权限。使用此选项指定将不出现在搜索结果中的属性。例如,使用此选项确定用户是否具有权限,添加条目中当前不存在的属性。

    使用 -c-X 属性中的某一个或两者时,隐含了具有“获得有效权限”控制 OID 的 -J 选项,因此不必指定。

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



    注意

    aclRightsaclRightsInfo;logs 属性具有虚拟操作属性的行为。它们不存储在目录中,因此除非明确请求,它们将不返回。这些属性是由 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 口令 -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 口令 \
                 -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 口令 \
                 -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

    aclRightsaclRightsInfo;logs 属性的格式在 Sun ONE Directory Server 部署指南 第 7 章中的“了解有效权限结果”进行详细描述。

    高级访问控制:使用宏 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 位于 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 的一部分:

    • ($dn) - 用于与目标匹配及在主题中直接替换。
    • [$dn] - 用于替换主题子树中的多个 RDN。
    • ($attr.attributeName) - 用于将 attributeName 属性的值从目标条目替换至主题。

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

    表 6-3    ACI 关键字中的宏

    ACI 关键字

    ($dn)

    target、targetfilter、userdn、roledn、groupdn、userattr

    [$dn]

    targetfilter、userdn、roledn、groupdn、userattr

    ($attr.attrName)

    userdn、roledn、groupdn、userattr

    下面的限制适用:

    • 使用主题中的 ($dn)[$dn] 宏时,必须定义包含 ($dn) 宏的目标。
    • 可以将主题中的 ($dn) 宏(但不是 [$dn])与 ($attr.attrName) 宏合并。

    匹配目标中的 ($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 请求提供服务的 Directory Server 上进行评估的。这意味着,当使用者服务器接收到更新请求时,它在评估之前返回的结果是引荐主服务器,而不管主服务器是否可以处理该请求。

    记录访问控制信息

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

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

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

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

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

    与早期版本的兼容性

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

    • userdnattr
    • groupdnattr

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

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


    上一章     目录     索引     文档主页     下一章    
    版权所有 2003 Sun Microsystems, Inc. 保留所有权利。