5.3. LDAP 和 RBAC
RBAC(基于角色的访问控制)是一种为管理用户指定一组权限(角色)的机制。这允许用户获得不同的管理职责,而无需给予他们完全、不受限制的访问权限。有关 RBAC 的详情,请参阅 JBoss EAP 安全架构 指南 中的基于角色的访问控制小节。
RBAC 仅用于授权,身份验证需单独处理。由于 LDAP 可以用于身份验证和授权,因此可使用以下方式配置 JBoss EAP:
- 仅将 RBAC 用于授权,并且仅将 LDAP 或其他机制用于身份验证。
- 使用 RBAC 和 LDAP 在管理界面中做出授权决策。
5.3.1. 独立使用 LDAP 和 RBAC 复制链接链接已复制到粘贴板!
JBoss EAP 允许在安全域中独立配置身份验证和授权。这样,可以将 LDAP 配置为身份验证机制和 RBAC,并配置为授权机制。如果以这种方式配置,用户尝试访问管理界面时,将首先使用配置的 LDAP 服务器进行身份验证。如果成功,则用户的角色和配置权限将仅使用 RBAC,而不考虑 LDAP 服务器中的任何组信息。
有关仅将 RBAC 用作管理接口的授权机制的更多详细信息,请参阅 如何为 JBoss EAP 配置服务器 安全性。有关配置 LDAP 以使用管理接口进行身份验证的更多详细信息,请参见 上一节。
5.3.2. 组合 LDAP 和 RBAC 进行授权 复制链接链接已复制到粘贴板!
使用 LDAP 服务器或使用属性文件进行身份验证的用户可以是用户组的成员。用户组只是可分配给一个或多个用户的任意标签。RBAC 可以配置为使用此组信息自动为用户分配角色或将用户从角色中排除。
LDAP 目录包含用户帐户和组的条目,可通过属性来引用。根据 LDAP 服务器配置,用户实体可以映射用户通过 memberOf 属性属于的组;组实体可以通过 uniqueMember 属性或两者的组合来映射属于该用户的组。用户通过 LDAP 服务器成功身份验证后,将执行组搜索来加载该用户的组信息。根据使用的目录服务器,组搜索可使用其 SN(通常是身份验证中使用的用户名),或者通过使用目录中用户条目的 DN 执行。将 LDAP 设置为安全域中的授权机制时,会配置组搜索(group)之间的映射。
-search)以及用户名和可分辨名称(用户名到dn
从 LDAP 服务器确定用户组成员资格信息后,将在 RBAC 配置中使用映射来确定用户具有哪些角色。此映射被配置为明确包含或排除组以及单个用户。
用户连接到服务器的身份验证步骤始终先发生。成功验证用户后,服务器将加载用户的组。身份验证步骤和授权步骤各自都需要连接 LDAP 服务器。安全域通过为组加载步骤重复利用身份验证连接来优化此过程。
5.3.2.1. 使用 group-search 复制链接链接已复制到粘贴板!
搜索组成员资格信息时可使用两种不同的样式:组先于组 ,组 为 Principal。组的主体具有用户的条目,其中包含使用 memberOf 属性对其所属组的引用。组到 Principal 具有组的条目,其条目包含对属于其成员的用户的引用(使用 uniqueMember 属性)。
JBoss EAP 支持组以及主要搜索的组(Principal)支持,但建议将组 Principal 改为 Principal。如果使用主要到组,则可以通过读取已知区分名称的属性直接加载组信息,而无需执行任何搜索。组到 Principal 需要大量的搜索来识别所有引用用户的组。
Principal 到 Group 和 Group to Principal 使用 group-search,它包含以下属性:
| 属性 | 描述 |
|---|---|
| group-name |
此属性用于指定应当用于作为用户所属组列表返回的组名的格式。这可以是组名的简单形式,也可以是组的可分辨名称。如果区分名称是必需的,可将此属性设置为 |
| 迭代 |
此属性用于指示在确定用户所属组后,它也应该根据组反复搜索,以识别这些组所属的组。如果启用了迭代搜索,它将持续到检测到任何其他组或循环时到达非成员的组。默认值为 |
| group-dn-attribute |
在组的条目中,属性是其可分辨的名称。默认值为 to |
| group-name-attribute |
在组的条目中,属性是其简单名称。默认为 |
cyclic 组成员身份不是问题。将保留每个搜索的记录,以防止已搜索的组再次被搜索。
若要使迭代搜索起作用,组条目需要与用户条目相同。然后,使用相同方法识别用户所属组。如果组成员身份的组、用于交叉引用的属性名称或参考方向有变化时,则无法做到这一点。
组搜索的组主体(memberOf)
例如,一个示例是 Group One 的成员,而 又是 GroupOne GroupFive 的成员。组成员身份将通过在成员级别使用 memberOf 属性来显示。这意味着,TestUserOne 会将 memberOf 属性设置为 GroupOne 的 the dn。反过来,GroupOne 会将 memberOf 属性设置为 GroupFive 的 The dn。
要使用这种类型的搜索,将 principal-to-group 元素添加到 group-search 元素中:
组、memberOf、配置主体
/core-service=management/security-realm=ldap-security-realm:add
batch
/core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection)
/core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=principal-to-group:add(group-attribute="memberOf",iterative=true,group-dn-attribute="dn", group-name="SIMPLE",group-name-attribute="cn")
run-batch
上面的示例假定您已定义了 ldap-connection。您还需要配置 本节前面 涵盖的身份验证机制。
注意 group-attribute 属性与 group-search=principal-to-group 一起使用。作为参考:
| 属性 | 描述 |
|---|---|
| group-attribute |
用户条目上与用户所属组的可分辨名称匹配的属性名称。默认值为 |
| preference-original-connection |
这个值用于指示在引用后应该使用的组信息。每次加载主体时,来自每个组成员资格的属性都会随后被加载。每次加载属性时,都可以使用来自最后一次引用的原始连接或连接。默认值为 |
Group to Principal, uniqueMember, group Search
考虑与 Principal 相同的示例,其中 user TestUserOne 是 GroupOne 的成员,而 GroupOne 又是 GroupFive 的成员。不过,在这种情况下,组成员资格将通过在组级别上设置的 uniqueMember 属性来显示。这意味着 GroupFive 会将 uniqueMember 设置为 GroupOne 的 The dn。反过来,GroupOne 会将 uniqueMember 设置为 Test UserOne 的值。
要使用这种类型的搜索,在 group- 元素:
search 元素中添加 group-to- principal
Group to Principal, uniqueMember, Configuration
/core-service=management/security-realm=ldap-security-realm:add
batch
/core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection)
/core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME")
run-batch
上面的示例假定您已定义了 ldap-connection。您还需要配置 本节前面 涵盖的身份验证机制。
注意 principal-attribute 属性用于 group-search=group-to-principal。Group-to-principal 用于定义如何搜索引用用户条目的组,而 principal-attribute 则用于定义引用主体的组条目。
作为参考:
| 属性 | 描述 |
|---|---|
| base-dn | 用于开始搜索的可分辨上下文名称。 |
| 递归 |
是否也搜索子上下文。默认值为 |
| search-by |
搜索中使用的角色名称的形式。有效值为 |
| preference-original-connection | 这个值用于指示在引用后应该使用的组信息。每次加载主体时,来自每个组成员资格的属性都会随后被加载。每次加载属性时,都可以使用来自最后一次引用的原始连接或连接。 |
| 属性 | 描述 |
|---|---|
| principal-attribute |
引用用户条目的组条目上的 属性名称。默认为 |
5.3.2.2. 使用用户名to-dn 复制链接链接已复制到粘贴板!
可以在授权部分中定义规则,将用户的简单用户名转换为其可分辨名称。username-to-dn 元素指定如何将用户名映射到 LDAP 目录中条目的可分辨名称。这个元素 是可选的,只有在以下两者都满足时才需要:
- 身份验证和授权步骤针对不同的 LDAP 服务器。
- 组搜索使用可分辨名称。
如果已执行 LDAP 身份验证,可以使用身份验证期间发现的 DN,这也适用于安全域支持 LDAP 和 Kerberos 身份验证以及 Kerberos 需要转换的实例。
它包含以下属性:
| 属性 | 描述 |
|---|---|
| force |
当 force 属性设置为 |
使用以下方法之一配置 用户名至dn :
- username-is-dn
这将指定远程用户输入的用户名是用户的可分辨名称。
username-is-dn 示例
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME") /core-service=management/security-realm=ldap-security-realm/authorization=ldap/username-to-dn=username-is-dn:add(force=false) run-batch这将定义 1:1 映射,并且没有额外的配置。
- username-filter
将搜索指定属性与提供的用户名匹配。
username-filter 示例
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME") /core-service=management/security-realm=ldap-security-realm/authorization=ldap/username-to-dn=username-filter:add(force=false, base-dn="dc=people,dc=harold,dc=example,dc=com", recursive="false", attribute="sn", user-dn-attribute="dn") run-batchExpand 属性 描述 base-dn
要开始搜索的可分辨上下文名称。
递归
搜索是否扩展至子上下文。默认值为
false。attribute
用户条目的属性,以尝试和匹配提供的用户名。默认为
uid。user-dn-attribute
要读取的属性以获取用户的可分辨名称。默认值为 to
dn。- advanced-filter
此选项使用自定义过滤器来查找用户的可分辨名称。
advanced-filter 示例
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME") /core-service=management/security-realm=ldap-security-realm/authorization=ldap/username-to-dn=advanced-filter:add(force=true, base-dn="dc=people,dc=harold,dc=example,dc=com", recursive="false", user-dn-attribute="dn",filter="sAMAccountName={0}") run-batch对于与
username-filter 示例中的那些属性,其含义和默认值相同。还有一个额外的属性:Expand 属性 描述 filter
用于搜索用户条目的自定义过滤器,用户名将在
{0}占位符中替换。重要这必须在过滤器定义后保持有效,以便在使用任何特殊字符(如
&)时确保使用正确的格式。例如和 字符:和 字符。
5.3.2.3. 将 LDAP 组信息映射到 RBAC 角色 复制链接链接已复制到粘贴板!
创建与 LDAP 服务器的连接并正确配置了组搜索后,需要在 LDAP 组和 RBAC 角色之间创建映射。此映射可以是包含的,也可以是独占性的,并且能够根据用户的组成员资格自动分配给用户一个或多个角色。
如果尚未配置 RBAC,请在这样做时密切关注,特别是切换到新创建的 LDAP 域时。在没有正确配置用户和角色的情况下启用 RBAC 可能会导致管理员无法登录 JBoss EAP 管理界面。
显示的管理 CLI 命令假定您在运行 JBoss EAP 单机服务器。有关将管理 CLI 用于 JBoss EAP 受管域的更多详细信息,请参见 JBoss EAP 管理 CLI 指南。
确保已启用并配置 RBAC
在可以使用 LDAP 和 RBAC 角色之间的映射前,RBAC 必须启用并初始配置。
/core-service=management/access=authorization:read-attribute(name=provider)
它应产生以下结果:
{ "outcome" => "success", "result" => "rbac" }
有关启用和配置 RBAC 的更多信息,请参阅 如何为 JBoss EAP 配置服务器安全性 中的 基于角色的访问控制 。
验证现有角色列表
使用 read-children-names 操作获取配置的角色的完整列表:
/core-service=management/access=authorization:read-children-names(child-type=role-mapping)
这应该会产生一个角色列表:
{
"outcome" => "success",
"result" =>
[ "Administrator", "Deployer", "Maintainer", "Monitor", "Operator", "SuperUser" ]
}
另外,可以检查角色的所有现有映射:
/core-service=management/access=authorization/role-mapping=Administrator:read-resource(recursive=true)
{
"outcome" => "success",
"result" =>
{
"include-all" => false,
"exclude" => undefined,
"include" => {
"user-theboss" => {
"name" => "theboss",
"realm" => undefined,
"type" => "USER"
},
"user-harold" => {
"name" => "harold",
"realm" => undefined,
"type" => "USER"
},
"group-SysOps" => {
"name" => "SysOps",
"realm" => undefined,
"type" => "GROUP"
}
}
}
}
配置 Role-Mapping 条目
如果角色还没有 Role-Mapping 条目,则需要创建一个。例如:
/core-service=management/access=authorization/role-mapping=Auditor:read-resource()
{
"outcome" => "failed",
"failure-description" => "WFLYCTL0216: Management resource '[ (\"core-service\" => \"management\"), (\"access\" => \"authorization\"), (\"role-mapping\" => \"Auditor\") ]' not found"
}
添加角色映射:
/core-service=management/access=authorization/role-mapping=Auditor:add()
{
"outcome" => "success"
}
验证:
/core-service=management/access=authorization/role-mapping=Auditor:read-resource()
{
"outcome" => "success",
"result" => {
"include-all" => false,
"exclude" => undefined,
"include" => undefined
}
}
将组添加到 Role for Inclusion 和 Exclusion
可以添加组以包含或从角色中排除。
排除映射具有优先权或包含映射。
为包含添加组:
/core-service=management/access=authorization/role-mapping=Auditor/include=group-GroupToInclude:add(name=GroupToInclude, type=GROUP)
为排除添加组:
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-GroupToExclude:add(name=GroupToExclude, type=GROUP)
检查结果:
/core-service=management/access=authorization/role-mapping=Auditor:read-resource(recursive=true)
{
"outcome" => "success",
"result" => {
"include-all" => false,
"exclude" => {
"group-GroupToExclude" => {
"name" => "GroupToExclude",
"realm" => undefined,
"type" => "GROUP"
}
},
"include" => {
"group-GroupToInclude" => {
"name" => "GroupToInclude",
"realm" => undefined,
"type" => "GROUP"
}
}
}
}
删除组,使其无法排除或包含在 RBAC 角色绑定中
从包含中删除组:
/core-service=management/access=authorization/role-mapping=Auditor/include=group-GroupToInclude:remove
要删除组,请排除:
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-GroupToExclude:remove