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 示例

在本例中,模板条目由 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 示例

在本例中,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 示例

在本例中,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-schemes 和 override 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 设置的值的属性都不会通过搜索返回。例如:
如果 ldapsearch 命令使用过滤器 (postalCode=*),则会返回 Barbara Jensen 条目,而 Ted Morris 的条目没有被返回。
- Ted Morris 的
postalCode
属性由 CoS 定义。 - Barbara Jensen 的
postalCode
属性在她条目中设置。 postalCode
属性被索引。
如果没有 索引 CoS-defined 属性,则搜索中每个匹配的条目都会返回,无论属性值是本地设置的还是使用 CoS。例如:
如果 ldapsearch 命令使用过滤器 (postalCode=*),则返回 Barbara Jensen 和 Ted Morris 的条目。
- Ted Morris 的
postalCode
属性由 CoS 定义。 - Barbara Jensen 的
postalCode
属性在她条目中设置。 postalCode
属性 没有 索引。
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_stringcosSpecifier
: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 树中的所有条目共享一个通用后代码。
- 使用 ldapmodify 在 dc=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
- 创建模板条目:
# 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 模板条目,它因属性的不同值而异。
- 使用 ldapmodify 在 dc=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
属性中指定的属性自动生成后代码。
- 使用 ldapmodify 在 dc=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
- 为销售和销售部门创建模板条目。将 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
的值可能会随机地重叠其目标树。
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 定义和模板条目应当位于目录树中的同一级别。