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 属性。
这个示例创建了一个可分配给市场部门的角色。
  1. 使用带有 -a 选项的 ldapmodify 来添加受管角色条目。新条目必须包含 nsManagedRoleDefinition 对象类,后者从 LdapSubEntrynsRoleDefinitionnsSimpleRoleDefinition 对象类继承。
    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
  2. 使用 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 属性中指定的过滤器匹配的条目。
这个示例创建了一个过滤的角色,适用于所有销售管理器。
  1. 运行带有 -a 选项的 ldapmodify 来添加新条目。
  2. 创建过滤的角色条目。
    角色条目具有 nsFilteredRoleDefinition 对象类,它继承 LdapSubEntrynsRoleDefinitionnsComplexRoleDefinition 对象类。
    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 属性中指定的角色的成员。
这个示例从受管市场角色中创建了一个角色,并过滤了销售经理角色。
  1. 运行带有 -a 选项的 ldapmodify 来添加新条目。
  2. 创建嵌套角色条目。嵌套角色有四个对象类:
    • 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 控制台中的 LDAP 浏览器 向导为 Red Hat Directory Server 条目创建角色。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 选择一个 LDAP 条目并点击 Options 菜单。
  4. 从下拉菜单中,选择 New 并点 Create a new role
  5. 按照向导中的步骤,在完成每个步骤后点 Next 按钮。
  6. 要创建角色,请查看 Create Role 步骤中的角色设置,再单击 Create 按钮。您可以点击 Back 按钮来修改角色设置,或者点击 Cancel 按钮取消角色创建。
  7. 要关闭向导窗口,请点击 Finish 按钮。

验证

  • 展开 LDAP 条目,并验证新角色出现在条目参数中。

8.2.3.2. 在 LDAP 浏览器中修改角色

您可以使用 web 控制台中的 LDAP 浏览器 修改 Red Hat Directory Server 条目的角色参数。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 展开 LDAP 条目,再选择您要修改的角色。
  4. 点 Options 菜单,选择 Edit 来修改角色的参数或 Rename 来重命名角色。
  5. 在向导窗口中,修改必要的参数,并在每个步骤后点 Next,直到您观察 LDIF 声明 步骤。
  6. 检查更新的参数并点击 Modify EntryChange Entry Name
  7. 要关闭向导窗口,请点击 Finish 按钮。

验证

  • 展开 LDAP 条目,并验证为角色列出了更新的参数。

8.2.3.3. 在 LDAP 浏览器中删除角色

您可以使用 web 控制台中的 LDAP 浏览器 从 Red Hat Directory Server 条目中删除角色。

先决条件

  • 访问 Web 控制台。
  • Red Hat Directory Server 中存在父条目。

流程

  1. 登录 Web 控制台并点击 Red Hat Directory Server
  2. Web 控制台加载 Red Hat Directory Server 界面后,单击 LDAP 浏览器
  3. 展开 LDAP 条目,再选择您要删除的角色。
  4. 打开 Options 菜单并选择 Delete
  5. 验证您要删除的角色的数据,然后单击 Next 按钮,直到您到达 Deletion 步骤。
  6. 将开关切换到 Yes, I'm sure location,再单击 Delete 按钮。
  7. 要关闭向导窗口,请点击 Finish 按钮。

验证

  • 展开 LDAP 条目,并验证角色不再是条目详细信息的一部分。

8.2.4. 安全地使用角色

并非所有角色都适合在安全上下文中使用。在创建新角色时,请考虑如何将角色分配给或从条目中删除。有时,用户可以轻松从角色中添加或删除自己。例如,如果有一个名为 Mountain Biking 的感兴趣的组角色,则感兴趣的用户应该可以轻松地添加或删除自己。
但是,对于某些安全情况,不适合于具有此类开放角色。一个潜在的安全风险是通过停用角色来取消激活用户帐户。不活动角色为其后缀定义了特殊的 ACI。如果管理员允许用户自由地从角色中添加和删除自己,那么在某种情形中,他们可能无法从不活跃的角色中删除自己,以防止其帐户被锁定。
例如,用户 A 具有受管角色 MRMR 角色已在激活中使用 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 节 “手动取消激活用户和角色”