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 定义关联。 - 通过组合子树的 DN,其中 CoS 对模板执行一个级别搜索,以及其中一个目标条目的属性的值。这种类型的模板与典型的 CoS 定义关联。
7.2.3. Pointer CoS Works 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
管理员创建一个指针 CoS,它将与 dc=example,dc=com 下存储的所有条目共享一个通用后代码。此 CoS 的三个条目如 图 7.2 “Pointer CoS 示例” 所示。
图 7.2. Pointer CoS 示例
在本例中,模板条目由 CoS 定义条目中的 DN cn=exampleUS,cn=data 来标识。每次在条目 cn=wholiday,ou=people,dc=example,dc=com 上查询
postalCode 属性时,Directory 服务器会返回模板条目 cn=exampleUS,cn=data 中的值。
7.2.4. Indirect CoS Works 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
管理员会创建一个间接 CoS,它使用目标条目的
manager 属性来识别模板条目。有三个 CoS 条目,如 图 7.3 “Indirect CoS 示例” 所示。
图 7.3. Indirect CoS 示例
在本例中,William Holiday 的目标条目包含间接指定符,
manager 属性。William 的管理器是 Carla Fuentes,因此 manager 属性包含模板条目的 DN 的指针,cn=Carla Fuentes,ou=people,dc=example,dc=com。反过来的模板条目提供 departmentNumber 属性值 318842。
7.2.5. Classic CoS 如何工作 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
管理员会创建一个经典 CoS,它使用模板 DN 和 CoS 指定符的组合来识别包含邮政代码的模板条目。出现三个 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: 始终返回 CoS 生成的值,即使存储了条目的值。
- 操作 :只有在搜索中明确请求时才返回生成的属性。操作属性不需要通过 schema 检查来返回。使用 操作时,它还会覆盖任何现有的属性值。注意只有当属性定义为 schema 中的操作时,才能进行操作。例如,如果 CoS 为
description属性生成值,则无法使用 操作 限定符,因为此属性没有在 schema 中标记为操作。 - operational-default: 仅在没有与条目存储对应的属性值时才返回生成的值,如果在搜索中明确请求。
如果没有设置 qualifier,则假定为 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 属性的更多信息,请参阅 Red Hat Directory Server 配置、命令和文件参考。
7.2.7. 使用 CoS 处理多值属性 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
任何属性都可以使用服务类生成,包括多值属性。这给我们带来了混乱的可能性。哪个 CoS 提供值?它们中的任何一个或全部?如何选择竞争 CoS 模板的值?生成的属性是否使用单个值或多个值?
解决此问题的方法有两种:
- 创建将多个 CoS 生成的属性合并到目标条目中的规则。这会在目标条目中生成多个值。
- 设置优先级以从竞争 CoS 定义中选择一个 CoS 值。这会为目标条目生成一个值。
注意
间接 CoS 不支持
cosPriority 属性。
CoS 处理 CoS 属性的多个值的方式定义,无论它使用 merge-schemes qualifier。
cosAttribute: attribute override merge-schemes
注意
merge-schemes qualifier 不会影响 CoS 处理物理属性值或覆盖限定符的方式。如果有多个竞争 CoS 模板或定义,则对于每个竞争 CoS 定义,需要在每个
cosAttribute 中设置相同的 merge-schemes 和 override qualifiers。否则,从所有可能的 CoS 定义中任意选择一个组合。
使用 merge-schemes qualifier 告知 CoS 将告知 CoS 为 managed 属性生成多个值。有多值 CoS 属性的可能场景:
- 一个 CoS 模板条目包含多个 managed 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 定义,则任意选择该值。这是一个无法预计的选项。控制要使用的 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 定义的属性使用任何类型的索引(包括存在)进行索引,则 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 “Indirect CoS Entry 示例” 中展示了这一点。
例 7.3. Indirect CoS Entry 示例
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 属性中的set)来识别模板条目。例 7.4 “Classic CoS Entry 示例” 中展示了这一点。
例 7.4. Classic CoS Entry 示例
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 的目的是在多个条目之间提供属性值; cosAttribute 属性定义 CoS 为哪个属性生成值。
7.2.10.2. 从命令行创建 CoS 模板条目 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
每个模板条目都是 cosTemplate 对象类的实例。
注意
考虑将 LDAPsubentry 对象类添加到新模板条目中。使 CoS 模板条目条目为 LDAPsubentry 对象类的实例,允许正常搜索由配置条目执行 unhinder。但是,如果模板条目已存在并且用于其他条目,如用户条目,则不需要将 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 示例 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
Corporation 管理员示例正在创建一个指针 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 示例 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
Example Corporation 管理员正在创建一个典型的 CoS,它使用模板 DN 和
cosSpecifier 属性中指定的属性的组合自动生成 postal 代码。
- 使用 ldapmodify 向 dc=example,dc=com 后缀添加新的经典 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
classic CoS 定义条目应用到 dc=example,dc=com 后缀下的所有条目。根据条目和
cosTemplateDn 中的 businessCategory 属性的组合,它可以到达两个模板之一。销售模板之一,提供特定于销售部门的员工的邮政代码。marketing 模板提供了特定于营销部门的员工的邮政代码。
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 模式应用到的子树。schema 的 costargettree 的值和多个 CoS 模式可能会任意地重叠其目标树。
| OID | 2.16.840.1.113730.3.1.552 |
| 语法 | DirectoryString |
| multi 或 Single-Valued | 单值 |
| 定义于 | 目录服务器 |
7.2.11. 创建基于角色的访问控制的属性 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
经典 CoS 方案基于该条目所拥有的条目生成属性值。例如,可以使用基于角色的属性来按条目设置服务器查找限制。
要创建基于角色的属性,请使用
nsRole 属性作为 classic 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 属性不支持索引。
classic 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 定义和模板条目应位于目录树中的同一级别。