7.2. 分配服务类

一类服务定义 (CoS)以对应用程序透明的方式在条目间共享属性。COS 简化了条目管理并降低存储要求。
目录服务器的客户端读取用户条目中的属性。使用 CoS 时,一些属性值可能无法存储在条目本身中。相反,这些属性值由服务逻辑类生成,因为条目发送到客户端应用程序。
每个 CoS 都由目录中的两种类型的条目组成:
  • COS 定义条目。CoS 定义条目标识使用的 CoS 类型。与角色定义条目一样,它继承自 LDAP 子条目 对象类。CoS 定义条目低于其有效的分支。
  • 模板条目。CoS 模板条目包含共享属性值的列表。对模板条目属性值的更改会自动应用到 CoS 范围内的所有条目。单个 CoS 可能会有多个与它关联的模板条目。
CoS 定义条目和模板条目交互,为其目标条目提供属性信息,在 CoS 范围内任何条目。

7.2.1. 关于 CoS 定义条目

CoS 定义条目是 cosSuperDefinition 对象类的实例。CoS 定义条目还包含三种对象类中的一个,用于指定它用来生成条目的模板条目类型。与 CoS 交互的目标条目共享与 CoS 定义条目相同的父项。
CoS 有三种类型,使用三种类型的 CoS 定义条目定义:
  • 指针 CoS。指针 CoS 仅使用模板 DN 识别模板条目。
  • 间接 CoS。间接 CoS 使用其中一个目标条目属性的值来识别模板条目。例如,间接 CoS 可能会指定目标条目的 manager 属性。然后,使用 manager 属性的值来标识模板条目。
    目标条目的属性必须是单值,并包含一个 DN。
  • 经典 CoS。经典 CoS 使用模板条目的基本 DN 和其中一个目标条目的属性的组合来识别模板条目。
有关与每种 CoS 关联的对象类和属性的更多信息,请参阅 第 7.2.10 节 “从命令行管理 CoS”
如果 CoS 逻辑检测到条目包含生成值的属性,CoS 默认为客户端应用程序提供条目本身中的属性值。但是,CoS 定义条目可以控制此行为。

7.2.2. 关于 CoS 模板条目

CoS 模板条目包含 CoS 逻辑生成的属性的值或值。CoS 模板条目包含 cosTemplate 的常规对象类。给定 CoS 的 CoS 模板条目存储在目录树中,以及 CoS 定义。
模板条目的相对可分辨名称(RDN)由以下之一决定:
  • 仅模板条目的 DN。这种类型的模板与指针 CoS 定义关联。
  • 目标条目的属性之一的值。用于向模板条目提供相对 DN 的属性使用 cosIndirectSpecifier 属性在 CoS 定义条目中指定。这种类型的模板与间接 CoS 定义关联。
  • 通过组合使用 CoS 对模板执行一个级别的搜索,以及其中一个目标条目属性的值。这种类型的模板与经典 CoS 定义关联。

7.2.3. A Pointer CoS Works

管理员会创建一个指针 CoS,它将通用后代码与存储在 dc=example,dc=com 下的所有条目共享。这个 CoS 的三个条目如 图 7.2 “Pointer CoS 示例” 所示。

图 7.2. Pointer CoS 示例

Pointer CoS 示例
在本例中,模板条目由 CoS 定义条目中的 DN cn=exampleUS,cn=data 来标识。每次查询 postalCode 属性时,条目 cn=wholiday,ou=body,dc=example,dc=com 都会返回模板条目 cn=exampleUS,cn=data 中可用的值。

7.2.4. 间接 CoS 工作方式

管理员会创建一个间接 CoS,它使用目标条目的 manager 属性来识别模板条目。三个 CoS 条目如 图 7.3 “Indirect CoS 示例” 所示。

图 7.3. Indirect CoS 示例

Indirect CoS 示例
在本例中,William Holiday 的目标条目包含间接指定符( manager 属性)。William 的管理器是 Applela Fuentes,因此 管理器 属性包含指向模板条目的 DN cn=Carla Fuentes,ou=body,dc=example,dc=com 的指针。然后,模板条目提供了 departmentNumber 属性值 318842

7.2.5. 经典 CoS 工作方式

管理员会创建一个典型的 CoS,它使用模板 DN 和 CoS specifier 来标识包含 postal 代码的模板条目。出现三个 CoS 条目,如 图 7.4 “Classic CoS 示例” 所示:

图 7.4. Classic CoS 示例

Classic CoS 示例
在本例中,CoS 定义条目的 cosSpecifier 属性指定 employeeType 属性。此属性与模板 DN 相结合,将模板条目识别为 cn=sales,cn=exampleUS,cn=data。然后,模板条目向目标条目提供 postalCode 属性的值。

7.2.6. 处理物理属性值

cosAttribute 属性包含由服务类管理的另一个属性的名称。此属性允许在属性值后 覆盖 限定符,该属性值在 CoS 在生成属性值时如何处理条目上的现有属性值。
cosAttribute: attribute_name override
有四个 覆盖 限定符:
  • Default :只有在没有与该条目存储的对应属性值时,才会返回生成的值。
  • override: Always 返回 CoS 生成的值,即使条目存储了值。
  • 操作 :仅在搜索中明确请求时返回生成的属性。操作属性不需要传递 schema 检查才能返回。使用 操作时,它还会覆盖任何现有属性值。
    注意
    属性只能在 schema 中定义为可操作时才可以正常工作。例如,如果 CoS 为 description 属性生成一个值,则无法使用 操作 限定符,因为此属性没有在 schema 中标记为操作。
  • Operation-default :只有在没有与条目存储的对应属性值且搜索中明确请求时,才会返回生成的值。
如果没有设置限定符,则假定 默认值
例如,此指针 CoS 定义条目表示它与模板条目 cn=exampleUS,ou=data,dc=example,dc=com 相关联,它生成 postalCode 属性的值。覆盖 限定符表示这个值优先于 postalCode 属性的条目存储的值:
dn: cn=pointerCoS,dc=example,dc=com
objectclass: top
objectclass: cosSuperDefinition
objectclass: cosPointerDefinition
cosTemplateDn: cn=exampleUS,ou=data,dc=example,dc=com
cosAttribute: postalCode override
注意
如果条目包含 CoS 生成的属性值,如果属性使用操作或覆盖限定符定义,则无法 手动更新该属性值。
有关 CoS 属性的更多信息,请参阅 红帽目录服务器配置、命令和文件参考

7.2.7. 使用 CoS 处理多值属性

可以使用 service 类生成任何属性 - 包括多值属性。这引入了混淆的可能性。哪个 CoS 提供值?它们中的任何一个或全部?从竞争 CoS 模板中选择的值如何?生成的属性是否使用单个值或多个值?
可以通过两种方式解决这个问题:
  • 创建一个规则,将多个 CoS 生成的属性合并到目标条目中。这会在目标条目中生成多个值。
  • 设置 priority 以从竞争 CoS 定义中选择一个 CoS 值。这会为目标条目生成一个值。
注意
间接 CoS 不支持 cosPriority 属性。
CoS 处理 CoS 属性的多个值的定义方式在它使用了 merge-schemes 限定符。
cosAttribute: attribute override merge-schemes
注意
merge-schemes 限定符不会影响 CoS 处理物理属性值 或覆盖 限定符的方式。如果有多个竞争 CoS 模板或定义,则对于每个竞争 CoS 定义,需要在每个 cosAttribute 中设置相同的 merge-schemesoverride qualifiers。否则,会从所有可能的 CoS 定义中随机选择一个组合。
使用 merge-schemes 限定符告知 CoS 将为受管属性生成多个值。具有多值 CoS 属性可能有两个可能的情况:
  • 一个 CoS 模板条目包含多个受管 CoS 属性实例,从而在目标条目上生成多个值。例如:
    dn: cn=server access template,dc=example,dc=com
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    accessTo: mail.example.com
    accessTo: irc.example.com
    注意
    这个方法只适用于经典 CoS。
  • 多个 CoS 定义可以为同一目标属性定义一系列服务,因此有多个模板条目。例如:
    dn: cn=mail template,dc=example,dc=com
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    accessTo: mail.example.com
    
    dn: cn=chat template,dc=example,dc=com
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    accessTo: irc.example.com
但是,即使有多个 CoS 定义,也应该只为属性生成一个值。如果有多个 CoS 定义,则会随机选择该值。这是一个无法预测的、unwieldy 选项。控制要使用的 CoS 模板的方式是在模板中设置排名 - 优先级 - 以及最高优先级 CoS 始终"wins"并提供值。
通常会完成多个模板,以提供值。例如,CoS 定义条目中可以有一个多值 cosSpecifier 属性。使用 cosPriority 属性设置模板优先级。此属性代表特定模板的全局优先级。优先级为零是最高优先级。
例如,用于生成部门数的 CoS 模板条目如下所示:
dn: cn=data,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: cosTemplate
departmentNumber: 71776
cosPriority: 0
此模板条目包含 departmentNumber 属性的值。它的优先级为零,这意味着此模板优先于定义不同的 departmentNumber 值的任何其他冲突模板。
不包含 cosPriority 属性的模板被视为最低优先级。其中两个或更多模板被认为提供属性值,并且它们具有相同的(或无)优先级,则会随机选择值。
注意
在 Directory Server 中没有定义负的 cosPriority 值的行为,因此不要输入负值。

7.2.8. 搜索 CoS-Specified 属性

COS 定义为条目中的属性提供值。例如,CoS 可以为子树中的每个条目设置 postalCode 属性。但是,搜索这些 CoS 定义的属性并不像对常规条目的搜索一样。
如果 CoS-defined 属性使用任何类型的索引(包括存在)进行索引,那么任何具有由 CoS 设置的值的属性都不会通过搜索返回。例如:
  • Ted Morris 的 postalCode 属性由 CoS 定义。
  • Barbara Jensen 的 postalCode 属性在她条目中设置。
  • postalCode 属性被索引。
如果 ldapsearch 命令使用过滤器 (postalCode=*),则会返回 Barbara Jensen 条目,而 Ted Morris 的条目没有被返回。
如果没有 索引 CoS-defined 属性,则搜索中每个匹配的条目都会返回,无论属性值是本地设置的还是使用 CoS。例如:
  • Ted Morris 的 postalCode 属性由 CoS 定义。
  • Barbara Jensen 的 postalCode 属性在她条目中设置。
  • postalCode 属性 没有 索引。
如果 ldapsearch 命令使用过滤器 (postalCode=*),则返回 Barbara Jensen 和 Ted Morris 的条目。
COS 允许 覆盖,为 CoS 条目中的 cosAttribute 属性给出的标识符,这意味着属性的本地值可以覆盖 CoS 值。如果在 CoS 上设置了覆盖,则 ldapsearch 操作会返回一个条目的值,即使属性被索引,只要条目有一个本地值。具有 CoS 但没有本地值的其他条目仍会在 ldapsearch 操作中返回。
由于在 CoS 定义的属性上运行 LDAP 搜索请求的潜在问题,请在决定使用 CoS 生成哪些属性时要小心。

7.2.9. 访问控制和 CoS

服务器控制对 CoS 生成的属性的访问,其方式与常规存储的属性完全相同。但是,根据 CoS 生成的属性值,访问控制规则将无法正常工作。这与在搜索过滤器中使用 CoS 生成的属性的限制相同。

7.2.10. 从命令行管理 CoS

由于所有配置信息和模板数据都作为条目存储在目录中,因此标准 LDAP 工具可用于 CoS 配置和管理。

7.2.10.1. 从命令行创建 CoS 定义条目

每种 CoS 类型都需要在定义条目中指定特定的对象类。所有 CoS 定义对象类都继承自 LDAPsubentry 对象类和 cosSuperDefinition 对象类。
指针 CoS 使用 cosPointerDefinition 对象类。此对象类使用 cosTemplateDn 属性中指定的条目 DN 值来标识模板条目,如 例 7.2 “一个 Pointer CoS Entry 示例” 所示。

例 7.2. 一个 Pointer CoS Entry 示例

 dn: cn=pointerCoS,dc=example,dc=com
 objectclass: top
 objectclass: cosSuperDefinition
 objectclass: cosPointerDefinition  
 cosTemplateDn:DN_string  
 cosAttribute:list_of_attributes qualifier  
 cn: pointerCoS
间接 CoS 使用 cosIndirectDefinition 对象类。这种类型的 CoS 根据目标条目的属性的值标识模板条目,如 cosIndirectSpecifier 属性中指定的。这在 例 7.3 “一个间接 CoS 条目示例” 中显示。

例 7.3. 一个间接 CoS 条目示例

 dn: cn=indirectCoS,dc=example,dc=com
 objectclass: top
 objectclass: cosSuperDefinition
 objectclass: cosIndirectDefinition  
 cosIndirectSpecifier:attribute_name  
 cosAttribute:list_of_attributes qualifier  
 cn: indirectCoS
经典 CoS 使用 cosClassicDefinition 对象类。这通过使用模板条目的 DN ( cosTemplateDn 属性中的设置)和其中一个目标条目的属性(在 cosSpecifier 属性中设置)来识别模板条目。这在 例 7.4 “经典 CoS 条目示例” 中显示。

例 7.4. 经典 CoS 条目示例

 dn: cn=classicCoS,dc=example,dc=com
 objectclass: top
 objectclass: cosSuperDefinition
 objectclass: cosClassicDefinition  
 cosTemplateDn:DN_string  
 cosSpecifier:attribute_name  
 cosAttribute:list_of_attributes qualifier  
 cn: classicCoS
对于服务类,对象类定义 CoS 的类型,支持的属性通过定义 CoS 模板来识别影响哪些目录条目。每个 CoS 都有一个额外的属性,可为其定义: cosAttribute。CoS 的目的是在多个条目间提供属性值;cos Attribute 属性定义 CoS 为哪个属性生成值。

7.2.10.2. 从命令行创建 CoS 模板条目

每个模板条目都是 cosTemplate 对象类的实例。
注意
考虑将 LDAPsubentry 对象类添加到新模板条目中。使 CoS 模板条目成为 LDAP 子条目 对象类的实例,允许执行常规搜索。但是,如果模板条目已存在,并且用于其他项,如用户条目,则 LDAPsubentry 对象类不需要添加到模板条目中。
CoS 模板条目还包含由 CoS 定义条目的 cosAttribute 属性生成的属性,以及该属性的值。
例如,为 postalCode 属性提供值的 CoS 模板条目如下:
dn:cn=exampleUS,ou=data,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: cosTemplate
postalCode: 44438
以下小节提供了模板条目示例,以及每种 CoS 定义条目的示例。

7.2.10.3. Pointer CoS 示例

公司管理员创建指针 CoS 的示例,其与 dc=example,dc=com 树中的所有条目共享一个通用后代码。
  1. 使用 ldapmodifydc=example,dc=com 后缀中添加一个新的指针 CoS 定义条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=pointerCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: cosSuperDefinition
    objectclass: cosPointerDefinition
    cosTemplateDn: cn=exampleUS,ou=data,dc=example,dc=com
    cosAttribute: postalCode
  2. 创建模板条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=exampleUS,ou=data,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    postalCode: 44438
CoS 模板条目(cn=exampleUS,ou=data,dc=example,dc=com)提供存储在其 postalCode 属性中的值到 dc=example,dc=com 后缀下的任何条目。这些条目是目标条目。

7.2.10.4. Indirect CoS 示例

此间接 CoS 使用目标条目的 manager 属性来识别 CoS 模板条目,它因属性的不同值而异。
  1. 使用 ldapmodifydc=example,dc=com 后缀中添加一个新的间接 CoS 定义条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=indirectCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: cosSuperDefinition
    objectclass: cosIndirectDefinition
    cosIndirectSpecifier: manager
    cosAttribute: departmentNumber
如果目录或修改管理器条目已经包含 departmentNumber 属性,则不需要将其他属性添加到管理器条目中。定义条目在目标后缀( dc=example,dc=com下的条目)中查找包含 manager 属性的条目,因为此属性是在定义条目的 cosIndirectSpecifier 属性中指定的。然后,它会在列出的 manager 条目中检查 departmentNumber 值。departmentNumber 属性的值将自动转发到具有 manager 属性的所有管理器下级。departmentNumber 的值会根据不同管理器条目中列出的部门号而有所不同。

7.2.10.5. 经典 CoS 示例

示例公司管理员创建一个经典 CoS,它使用模板 DN 和 cosSpecifier 属性中指定的属性自动生成后代码。
  1. 使用 ldapmodifydc=example,dc=com 后缀中添加一个新的 classic CoS 定义条目:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=classicCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: cosSuperDefinition
    objectclass: cosClassicDefinition
    cosTemplateDn: cn=classicCoS,dc=example,dc=com
    cosSpecifier: businessCategory
    cosAttribute: postalCode override
  2. 为销售和销售部门创建模板条目。将 CoS 属性添加到模板条目。模板的 cn 在目标条目中设置 businessCategory 属性的值,然后根据模板中的值添加或覆盖属性:
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: cn=sales,cn=classicCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    postalCode: 44438
    -
    dn: cn=marketing,cn=classicCoS,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: cosTemplate
    postalCode: 99111
经典 CoS 定义条目应用到 dc=example,dc=com 后缀下的所有条目。根据条目中找到的 businessCategory 属性和 cosTemplateDn 的组合,它可以到达两个模板之一。销售模板( Sales 模板)提供了一个特定于销售部门员工的发布代码。市场模板提供了一个特定于市场部门员工的发布代码。

7.2.10.6. 搜索 CoS 条目

COS 定义条目是 操作 条目,默认情况下不会在常规搜索中返回。要在搜索中返回 CoS 定义条目,请将 ldapSubEntry 对象类添加到 CoS 定义条目中。例如:
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=pointerCoS,ou=People,dc=example,dc=com
changetype: add
objectclass: ldapSubEntry
然后,使用带有 ldapsearch 工具的 (objectclass=ldapSubEntry) 过滤器来搜索包含 ldapSubEntry 对象类的条目。例如:
# ldapsearch -x -s sub -b ou=People,dc=example,dc=com "(|(objectclass=*)(objectclass=ldapSubEntry))"
除了 ou=People,dc=example,dc=com 子树中的 CoS 定义条目外,此搜索会返回所有常规条目。

7.2.10.7. costargettree 属性

costargettree 属性定义 CoS 模式应用到的子树。模式和多个 CoS 模式的 costargettree 的值可能会随机地重叠其目标树。

表 7.1. costargettree 属性

OID 2.16.840.1.113730.3.1.552
语法 DirectoryString
multi 或 Single-Valued single-valued
定义于 目录服务器

7.2.11. 创建基于角色的属性

Classic CoS 方案根据条目拥有的角色为条目生成属性值。例如,基于角色的属性可用于基于条目设置服务器查找限制。
要创建基于角色的属性,请使用 nsRole 属性作为经典 CoS 的 CoS 定义条目中的 cosSpecifier。因为 nsRole 属性可以是多值,所以可以定义 CoS 方案,它们具有多个可能的模板条目。要解决要使用的模板条目的不确定性,请在 CoS 模板条目中包含 cosPriority 属性。
例如,这个 CoS 允许 manager 角色的成员超过标准邮箱配额。manager 角色条目为:
dn: cn=ManagerRole,ou=people,dc=example,dc=com
objectclass: top
objectclass: nsRoleDefinition
objectclass: nsComplexRoleDefinition
objectclass: nsFilteredRoleDefinition
cn: ManagerRole
nsRoleFilter: ou=managers
Description: filtered role for managers
警告
nsRoleFilter 属性无法接受虚拟属性值。
不要索引虚拟属性值。对虚拟属性运行搜索可能会导致意外的系统性能或搜索结果不正确。未索引的搜索会破坏使用搜索过滤器中的虚拟属性的搜索操作。虚拟属性是动态生成的,不存储在目录服务器后端中。因此,virual 属性不支持索引。
经典 CoS 定义条目类似如下:
dn: cn=managerCOS,dc=example,dc=com
objectclass: top
objectclass: cosSuperDefinition
objectclass: cosClassicDefinition
cosTemplateDn: cn=managerCOS,dc=example,dc=com
cosSpecifier: nsRole
cosAttribute: mailboxquota override
cosTemplateDn 属性提供一个值,与 cosSpecifier 属性中指定的属性(例如,目标条目的 nsRole 属性)结合使用,用于标识 CoS 模板条目。CoS 模板条目为 mailboxquota 属性提供值。额外的 覆盖符 告知 CoS 覆盖目标条目中任何现有的 mailboxquota 属性值。
对应的 CoS 模板条目类似如下:
dn:cn="cn=ManagerRole,ou=people,dc=example,dc=com",cn=managerCOS,dc=example,dc=com
objectclass: top
objectclass: extensibleObject
objectclass: cosTemplate
mailboxquota: 1000000
该模板为 mailboxquota 属性 1000000 提供值。
注意
角色条目和 CoS 定义和模板条目应当位于目录树中的同一级别。