8.2. 使用角色
角色是一种条目分组机制,用于统一前面章节中描述的静态和动态组。角色设计为更高效、更易于用于应用程序。例如,应用程序可以通过查询条目本身来获取条目所属的角色列表,而不必选择组并浏览多个组的成员列表。
8.2.1. 关于角色
红帽有两种类型的组。静态组 具有有限的和定义的成员列表。动态组 使用过滤器来识别哪些条目是组的成员,因此当与组过滤器更改的条目时,组成员资格会不断改变。(这两种类型的组在 第 8.1 节 “使用组” 中进行了描述。)
角色(role)是一组混合组,可作为静态和动态组。在使用组时,条目作为成员添加到组条目中。使用角色时,role 属性添加到条目中,然后该属性用于自动识别角色条目中的成员。
角色 members 是具有角色的条目。成员可以显式指定或动态指定。指定角色成员资格的方式取决于角色的类型。目录服务器支持三种类型的角色:
- Managed roles 具有明确枚举的成员列表。
- Filtered roles 是分配给角色的条目,取决于每个条目包括的属性,在 LDAP filter 中指定。与过滤器匹配的条目具有角色。
- 嵌套角色是包含其他角色的角色。
受管角色可以执行通常可通过静态组完成的所有操作。角色成员可以使用过滤的角色进行过滤,类似于使用动态组的过滤。角色比组更容易使用,在它们的实施中更灵活,并降低客户端复杂性。
创建角色时,确定用户是否可以添加自己或从角色中删除自己。有关角色和访问控制的更多信息,请参阅 第 8.2.4 节 “安全地使用角色”。
注意
与评估组相比,评估角色对目录服务器的资源密集型,因为服务器能够为客户端应用工作。在带有角色时,客户端应用程序可以通过搜索
nsRole
属性来检查角色成员资格。nsRole
属性是一个计算属性,它标识条目所属的角色; nsRole
属性不存储在条目本身中。从客户端应用程序视图中,检查成员资格的方法统一并在服务器端执行。
红帽目录服务器部署指南 中介绍了使用角色的注意事项。
8.2.2. 使用命令行管理角色
您可以使用命令行查看、创建和删除角色。
8.2.2.1. 创建受管角色
受管角色具有明确枚举的成员列表。通过向条目中添加
nsRoleDN
属性,将受管角色添加到条目中。
8.2.2.1.1. 使用命令行创建受管角色
角色继承自 ldapsubentry 对象类,该对象类在 ITU X.509 标准中定义。另外,每个受管角色需要两个对象类,它们继承自 nsRoleDefinition 对象类:
- nsSimpleRoleDefinition
- nsManagedRoleDefinition
managed 角色还允许一个可选的
description
属性。
受管角色的成员在其条目中具有
nsRoleDN
属性。
这个示例创建了一个可分配给市场部门的角色。
- 使用带有
-a
选项的 ldapmodify 来添加受管角色条目。新条目必须包含 nsManagedRoleDefinition 对象类,后者从 LdapSubEntry、nsRoleDefinition 和 nsSimpleRoleDefinition 对象类继承。dn: cn=Marketing,ou=people,dc=example,dc=com objectclass: top objectclass: LdapSubEntry objectclass: nsRoleDefinition objectclass: nsSimpleRoleDefinition objectclass: nsManagedRoleDefinition cn: Marketing description: managed role for marketing staff
- 使用 ldapmodify 为市场员工成员分配角色:
dn: cn=Bob,ou=people,dc=example,dc=com changetype: modify add: nsRoleDN nsRoleDN: cn=Marketing,ou=people,dc=example,dc=com
条目的nsRoleDN
属性表示该条目是受管角色 cn=Marketing,ou=body,dc=example,dc=com 的成员。
8.2.2.2. 创建过滤的角色
根据条目是否具有角色中定义的特定属性,条目是否被分配给过滤的角色。角色定义为目标属性指定 LDAP 过滤器。与过滤器匹配的条目(检查成员)角色。
8.2.2.2.1. 使用命令行创建过滤的角色
角色继承自 ldapsubentry 对象类,该对象类在 ITU X.509 标准中定义。另外,每个过滤的角色都需要两个对象类,它们继承自 nsRoleDefinition 对象类:
- nsComplexRoleDefinition
- nsFilteredRoleDefinition
过滤的角色条目还需要
nsRoleFilter
属性来定义 LDAP 过滤器来确定角色成员。(可选)角色可以获取 description
属性。
过滤的角色成员是与
nsRoleFilter
属性中指定的过滤器匹配的条目。
这个示例创建了一个过滤的角色,适用于所有销售管理器。
- 运行带有
-a
选项的 ldapmodify 来添加新条目。 - 创建过滤的角色条目。角色条目具有 nsFilteredRoleDefinition 对象类,它继承 LdapSubEntry、nsRoleDefinition 和 nsComplexRoleDefinition 对象类。nsRoleFilter 属性为包含 Sales manager 值的
o
(organization)属性设置过滤器。dn: cn=SalesManagerFilter,ou=people,dc=example,dc=com changetype: add objectclass: top objectclass: LDAPsubentry objectclass: nsRoleDefinition objectclass: nsComplexRoleDefinition objectclass: nsFilteredRoleDefinition cn: SalesManagerFilter nsRoleFilter: o=sales managers Description: filtered role for sales managers
以下条目与过滤器匹配(将
o
属性与值 Sales manager匹配),因此它会自动是这个过滤角色的成员:
dn: cn=Pat Smith,ou=people,dc=example,dc=com objectclass: person cn: Pat sn: Smith userPassword: secret o: sales managers
8.2.2.3. 创建嵌套角色
嵌套角色是包含其他角色的角色。在可以创建嵌套角色前,必须存在另一个角色。嵌套在嵌套角色中的角色使用
nsRoleDN
属性来指定。
8.2.2.3.1. 使用命令行创建嵌套角色
角色继承自 ldapsubentry 对象类,该对象类在 ITU X.509 标准中定义。另外,每个嵌套角色需要两个对象类,它们继承自 nsRoleDefinition 对象类:
- nsComplexRoleDefinition
- nsNestedRoleDefinition
嵌套角色条目还需要
nsRoleDN
属性来识别容器角色内嵌套的角色。(可选)角色可以获取 description
属性。
嵌套角色的成员是嵌套角色定义条目的
nsRoleDN
属性中指定的角色的成员。
这个示例从受管市场角色中创建了一个角色,并过滤了销售经理角色。
- 运行带有
-a
选项的 ldapmodify 来添加新条目。 - 创建嵌套角色条目。嵌套角色有四个对象类:
- nsNestedRoleDefinition
- ldapsubentry (inherited)
- nsRoleDefinition (inherited)
- nsComplexRoleDefinition (inherited)
nsRoleDN
属性包含市场管理角色和销售管理器过滤角色的 DN。dn: cn=MarketingSales,ou=people,dc=example,dc=com objectclass: top objectclass: LDAPsubentry objectclass: nsRoleDefinition objectclass: nsComplexRoleDefinition objectclass: nsNestedRoleDefinition cn: MarketingSales nsRoleDN: cn=SalesManagerFilter,ou=people,dc=example,dc=com nsRoleDN: cn=Marketing,ou=people,dc=example,dc=com
上例中的这两个用户都是此新嵌套角色的成员。
8.2.2.4. 使用命令行查看条目的角色
角色分配不会通过命令行自动返回。
nsRole 属性是一个操作属性。在 LDAP 中,必须明确请求操作属性。默认情况下,它们不会被返回,并带有条目的 schema 中的常规属性。您可以通过列出单个操作属性或使用
+
输出结果对象的所有操作属性来明确请求它们。例如,除了条目的常规属性外,这个 ldapsearch 命令会返回哪些 uid=user_name 是成员的角色列表:
# ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -b "dc=example,dc=com" -s sub -x "(uid=user_name)"” \* nsRole dn: uid=user_name,ou=people,dc=example,dc=com ... nsRole: cn=Role for Managers,dc=example,dc=com nsRole: cn=Role for Accounting,dc=example,dc=com
8.2.2.5. 关于删除角色
删除角色会删除角色条目,但不会删除每个角色成员的
nsRoleDN
属性。要删除每个角色成员的 nsRoleDN
属性,请启用 referential Integrity 插件,并将其配置为管理 nsRoleDN
属性。有关参考完整性插件的详情,请参考 第 5 章 维护参考完整性。
8.2.3. 使用 LDAP 浏览器管理目录服务器中的角色
角色是一种分组机制,用于统一静态和动态组。
8.2.3.1. 在 LDAP 浏览器中创建角色
您可以使用 web 控制台中的
向导为 Red Hat Directory Server 条目创建角色。
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 选择一个 LDAP 条目并点击 Options 菜单。
- 从下拉菜单中,选择并点 。
- 按照向导中的步骤,在完成每个步骤后点按钮。
- 要创建角色,请查看步骤中的角色设置,再单击 。您可以点击 按钮来修改角色设置,或者点击 按钮取消角色创建。
- 要关闭向导窗口,请点击按钮。
验证
- 展开 LDAP 条目,并验证新角色出现在条目参数中。
8.2.3.2. 在 LDAP 浏览器中修改角色
您可以使用 web 控制台中的
修改 Red Hat Directory Server 条目的角色参数。
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 展开 LDAP 条目,再选择您要修改的角色。
- 点 Options 菜单,选择来修改角色的参数或 来重命名角色。
- 在向导窗口中,修改必要的参数,并在每个步骤后点,直到您观察 步骤。
- 检查更新的参数并点击或 。
- 要关闭向导窗口,请点击按钮。
验证
- 展开 LDAP 条目,并验证为角色列出了更新的参数。
8.2.3.3. 在 LDAP 浏览器中删除角色
您可以使用 web 控制台中的
从 Red Hat Directory Server 条目中删除角色。
先决条件
- 访问 Web 控制台。
- Red Hat Directory Server 中存在父条目。
流程
- 登录 Web 控制台并点击。
- Web 控制台加载界面后,单击 。
- 展开 LDAP 条目,再选择您要删除的角色。
- 打开 Options 菜单并选择。
- 验证您要删除的角色的数据,然后单击按钮,直到您到达 步骤。
- 将开关切换到location,再单击 按钮。
- 要关闭向导窗口,请点击按钮。
验证
- 展开 LDAP 条目,并验证角色不再是条目详细信息的一部分。
8.2.4. 安全地使用角色
并非所有角色都适合在安全上下文中使用。在创建新角色时,请考虑如何将角色分配给或从条目中删除。有时,用户可以轻松从角色中添加或删除自己。例如,如果有一个名为 Mountain Biking 的感兴趣的组角色,则感兴趣的用户应该可以轻松地添加或删除自己。
但是,对于某些安全情况,不适合于具有此类开放角色。一个潜在的安全风险是通过停用角色来取消激活用户帐户。不活动角色为其后缀定义了特殊的 ACI。如果管理员允许用户自由地从角色中添加和删除自己,那么在某种情形中,他们可能无法从不活跃的角色中删除自己,以防止其帐户被锁定。
例如,用户 A 具有受管角色 MR。MR 角色已在激活中使用 account 锁定。这意味着用户 A 无法绑定到服务器,因为
nsAccountLock
属性被计算为该用户的 true。但是,如果用户 A 已绑定到目录服务器,并注意到他现在通过 MR 角色锁定,用户可以从其条目中删除 nsRoleDN
属性,并在没有 ACI 阻止了 ACI 时解锁自己。
要防止用户删除
nsRoleDN
属性,请根据所使用的角色类型,使用以下 ACI。
- 受管角色。对于作为受管角色成员的条目,请使用以下 ACI 通过删除适当的
nsRoleDN
来防止用户解锁其自身:aci: (targetattr="nsRoleDN") (targattrfilters= add=nsRoleDN:(!(nsRoleDN=cn=AdministratorRole,dc=example,dc=com)), del=nsRoleDN:(!(nsRoleDN=cn=nsManagedDisabledRole,dc=example,dc=com))) (version3.0;acl "allow mod of nsRoleDN by self but not to critical values"; allow(write) userdn=ldap:///self;)
- 过滤的角色。作为过滤器一部分的属性应该受到保护,以便用户无法通过修改属性来重新简化过滤的角色。不应该允许用户添加、删除或修改过滤角色使用的属性。如果计算了 filter 属性的值,则所有可以修改 filter 属性的值的属性都应以同样的方式进行保护。
- 嵌套角色。嵌套角色由过滤和受管角色组成,因此两个 ACI 都应考虑修改组成嵌套角色的角色的属性(
nsRoleDN
或其他)。
有关激活中的帐户的详情,请参考 第 20.16 节 “手动取消激活用户和角色”。