11.3. 使用权限委派域管理
您可以使用细粒度 admin 权限功能将域管理委派给其他管理员,即 realm 管理员。与 Global 和 Realm 特定角色 提供的基于角色的访问控制(RBAC)机制不同,此功能提供了对如何根据定义良好的操作集合访问和管理域资源的更精细的控制。
通过依赖于基于策略的访问控制,服务器管理员可以定义域资源的权限,如用户、组和客户端、使用不同的策略类型或访问控制方法,以便域管理员访问域资源及其操作的子集。
该功能提供了上述 RBAC 机制的替代选择,但它不会替换它。您仍然能够授予管理角色,如 view-users 或 manage-clients,将访问权限委派给域管理员,但这样做将跳过此功能提供的机制。
只有在通过管理控制台或 Admin API 管理资源时,才应用对域资源的强制访问。
11.3.1. 了解 Realm 资源类型 复制链接链接已复制到粘贴板!
在域中,您可以管理不同类型的资源,如用户、组、客户端、客户端范围、角色等。作为域管理员,在管理身份时,您要持续管理这些资源,以及它们验证方式并被授权访问 realm 和应用程序。
此功能提供了在管理域资源时强制访问控制所需的机制,仅限于:
- 用户
- 组
- 客户端
- 角色
您可以管理给定资源类型的所有资源的权限,如域中所有用户或特定域资源,如特定用户或域中一组用户。
11.3.2. 了解访问范围 复制链接链接已复制到粘贴板!
每个 realm 资源都支持一组定义良好的管理操作或范围,它们可以在它们上执行,如 查看、管理 以及特定于资源的操作,如 view-members。
在管理权限时,您要从资源类型中选择一个或多个范围的集合,以允许 realm 管理员对资源类型执行特定的操作。例如,授予 视图 范围将授予对 realm 管理员的访问权限,以列出、搜索和查看 realm 资源。另一方面,管理 范围将允许管理员执行更新并删除它们。
范围相互完全独立。如果您授予 管理域 资源的访问权限,这并不表示会自动授予 视图 范围。范围之间没有传输依赖关系。虽然这可能会在管理权限时影响整体用户体验,因为您需要选择单个范围,但好处是您可以更轻松地识别强制访问特定范围的权限。
来自资源类型的某些范围具有关系(而不是传输依赖项)到另一资源类型中的范围。当您管理代表一组域资源的资源类型(如 realm 组及其成员)时,这个关系主要为 true。
11.3.2.1. 用户资源类型 复制链接链接已复制到粘贴板!
Users realm 资源类型表示域中的用户。您可以根据以下范围集管理用户的权限:
| 影响范围 | 描述 | 也授予 |
|---|---|---|
| view | 定义域管理员是否可以查看用户。每当您想要时,应设置此范围 |
|
| 管理 | 定义域管理员是否可以管理用户。 |
|
| manage-group-membership | 定义域管理员可以向组分配或取消分配用户到/从组分配或取消分配用户。 | None |
| map-roles | 定义域管理员是否可以为/从用户分配或取消分配角色。 | None |
| impersonate | 定义域管理员是否可以模拟其他用户。 |
|
用户资源类型与您可以设置为组的一些权限有强大的关系。大多数时候,用户都是组的成员,并授予组 或 view -membersmanage-members 的访问权限,也应该允许 realm 管理员 查看和管理 该组的成员。
这个功能不支持对联邦资源的强制访问,但这个限制会考虑以后的改进。
11.3.2.2. 组资源类型 复制链接链接已复制到粘贴板!
Groups realm 资源类型表示域中的组。您可以根据以下管理操作集管理组的权限:
| 操作 | 描述 |
|---|---|
| view | 定义 realm 管理员是否可以查看组。每当您要从查询提供组时,应设置此范围。 |
| 管理 | 定义 realm 管理员是否可以管理组。 |
| view-members | 定义域管理员是否可以查看组成员。此操作适用于组层次结构中的任何子组。这可以通过为特定子组明确拒绝权限来防止。 |
| manage-members | 定义域管理员是否可以管理组成员。此操作适用于组层次结构中的任何子组。这可以通过为特定子组明确拒绝权限来防止。 |
| impersonate-members | 定义域管理员是否可以模拟组成员。此操作适用于组层次结构中的任何子组。这可以通过为特定子组明确拒绝权限来防止。 |
| manage-membership | 定义域管理员是否可以向组中添加或删除成员。 |
11.3.2.3. 客户端资源类型 复制链接链接已复制到粘贴板!
Clients realm 资源类型表示域中的客户端。您可以根据以下管理操作集管理客户端的权限:
| 操作 | 描述 |
|---|---|
| view | 定义域管理员是否可以查看客户端。每当您要使客户端可从查询获得时,应设置此范围。 |
| 管理 | 定义域管理员是否可以管理客户端。 |
| map-roles | 定义域管理员是否可以将客户端定义的任何角色分配给用户。 |
| map-roles-composite | 定义域管理员是否可以将客户端定义的任何角色作为复合分配给另一个角色。 |
| map-roles-client-scope | 定义域管理员是否可以将客户端定义的任何角色分配给客户端范围。 |
map-roles 操作不授予管理用户或分配角色的权限。管理员还必须对用户具有用户角色映射权限。
11.3.2.4. 角色资源类型 复制链接链接已复制到粘贴板!
Roles realm 资源类型表示域中的角色。您可以根据以下管理操作集来管理角色的权限:
| 操作 | 描述 |
|---|---|
| map-role | 定义域管理员是否可以为用户分配角色(或多个角色)。 |
| map-role-composite | 定义域管理员是否可以为另一个角色分配角色(或多个角色)作为复合。 |
| map-role-client-scope | 定义域管理员是否可以将角色(或多个角色)应用到客户端范围。 |
map-roles 操作不授予管理用户或分配角色的权限。管理员还必须对用户具有用户角色映射权限。
如果 map-roles、map-roles-composite 或 map-roles -client-scope 范围有客户端资源类型权限,它将优先于角色资源类型权限(如果角色是客户端角色)。
11.3.3. 为域启用 admin 权限 复制链接链接已复制到粘贴板!
要在域中启用精细的 admin 权限,请按照以下步骤操作:
- 登录管理控制台。
- 单击 Realm settings。
- 启用管理权限 并单击 保存。
启用后,会在管理控制台的左侧菜单中会出现一个 Permissions 部分。
在本节中,您可以管理 realm 资源的权限。
11.3.4. 管理权限 复制链接链接已复制到粘贴板!
Permissions 选项卡提供域中所有活动权限的概述。在此,管理员可以创建、更新、删除或搜索权限。您还可以预先评估您创建的权限,以检查它们是否按预期强制访问 realm 资源。如需了解更多详细信息,请参阅 评估权限。
要创建权限,请点击 Create permission 按钮并选择您要保护的资源类型。
选择资源类型后,现在可以定义如何为所选类型的一组一个或多个资源强制实施访问权限:
在管理权限时,您可以定义以下设置:
- 名称 :权限的唯一名称。该名称也不应与任何策略名称冲突
- 描述 :可选的描述,用于更好地描述权限
- 授权范围 :一个或多个范围的集合,代表您要保护所选资源类型的操作。管理员必须为每个操作分配显式权限才能执行对应的操作。例如,仅分配 没有 视图 的管理将阻止用户可见。
- 强制访问 :定义权限是否应该强制访问所选类型的所有资源或域中特定资源的访问权限。
- 策略 :定义应评估的一个或多个策略的集合,以授予或拒绝对所选资源的访问。
创建权限后,它会在强制访问(所有)资源和您选择的范围时自动生效。请记住,在生产环境中创建和更新权限时请注意。
11.3.4.1. 定义查看域资源的权限 复制链接链接已复制到粘贴板!
此功能依赖于部分评估机制来部分评估域管理员在列出和查看域资源时具有的权限。此机制将预先抓取为域管理员直接引用或间接引用视图相关范围的所有权限。
授予 查看特定类型的 realm 资源的访问权限,必须使用以下策略之一使其可从查询中获得:
-
用户 -
组 -
角色
通过使用上述任何策略,红帽构建的 Keycloak 可以预先计算域管理可查看的一组资源,方法是查找直接(如果使用用户策略)或间接(如果使用角色或组策略)引用 realm 管理员。因此,部分评估机制涉及使用在数据库级别运行的访问控制来减少查询。此功能主要重要的是,正确地允许分页资源,并避免在为查询返回的每个域资源评估权限时,在服务器端出现额外的开销。
只有在启用了该功能到域时,才会进行部分评估和过滤,如果用户没有使用与查看相关的管理角色(如 view-users 或 view-clients )授予了与视图相关的管理角色。例如,对于具有 admin 角色的常规服务器管理员,它不会发生。
在查询资源时,部分评估机制可以正常工作:
- 解析引用域管理员的特定资源类型的所有权限
- 预评估每个权限以检查域管理员是否有权限与权限关联的资源
- 根据赋予或拒绝的资源声明数据库查询
因此,查询的结果集将仅包含 realm 管理员有权访问任何与视图相关的范围的域资源。
11.3.4.2. 搜索权限 复制链接链接已复制到粘贴板!
管理控制台提供了几种搜索权限的方法,支持以下功能:
- 在 名称中搜索包含特定字符串的权限
- 搜索特定资源类型的权限,如用户
-
搜索应用到特定资源的特定资源类型的权限(如用户
myadmin的 Users 资源类型)。 - 使用给定范围搜索特定资源类型的权限(如具有 管理 范围 的用户 资源类型权限)。
-
搜索适用于特定资源的特定资源类型的权限,并具有特定的范围(如 Users 资源类型权限,其管理范围为
myadmin)。
细粒度权限搜索
这些功能允许服务器管理员对其权限执行查询,并确定哪些是强制访问一个或多个域资源及其范围。与 评估 选项卡上的评估工具相结合,它们提供了一个密钥管理工具,用于在域中管理权限。如需了解更多详细信息,请参阅 评估权限。
11.3.5. 管理策略 复制链接链接已复制到粘贴板!
Policies 选项卡允许管理员使用不同的访问控制方法定义条件,以确定是否应该为试图对域资源执行操作的管理员授予权限。在管理权限时,您必须关联至少一个策略来授予或拒绝对 realm 资源的访问。
策略基本上是评估 GRANT 或 DENY 的条件。其结果将决定是否应授予或拒绝其权限。
只有在所有关联的策略评估 GRANT 时,才会授予权限。否则,权限被拒绝,域管理员将无法访问受保护的资源。
Red Hat build of Keycloak 提供了一组内置策略,您可以从中选择:
当您拥有域定义良好且稳定的权限模型后,就无需创建策略。您可以重复使用现有策略来创建更多权限。
有关每种策略类型的详情,请参阅 管理策略。
11.3.6. 评估权限 复制链接链接已复制到粘贴板!
Evaluation 选项卡提供了一个测试环境,管理员可以确认权限是否按预期强制访问。当强制访问特定资源以及结果是什么时,管理员可以看到哪些权限。
您需要提供一组字段才能运行评估:
-
用户、realm 管理员或访问资源的主题 -
资源类型,您要评估的资源类型 -
Resource Selector,根据所选的资源类型,系统会提示您选择一个特定的域资源,如用户、组或客户端。 -
授权范围、您要评估的范围或操作。如果没有提供,则会对所选资源类型的所有范围进行评估。
细粒度权限评估选项卡
通过单击 Evaluate 按钮,服务器将评估与所选资源和范围关联的所有权限,就像选择的用户在使用管理控制台或 Admin API 时试图访问该资源一样。
例如,在上面的示例中,您可以看到用户 myadmin 可以管理 用户 user-1,因为 允许管理所有域用户权限 作为 PERMIT 权限,从而授予 管理 范围的访问权限。但是,所有其他范围都被拒绝。
与 Permissions 选项卡中搜索功能相结合,您可以执行故障排除来识别任何不如预期影响的权限。
在评估权限时,会应用以下规则:
- 特定于资源的权限的结果优先于更广泛的权限,从而授予对特定类型的所有资源的访问权限
- 如果特定资源没有权限,则会根据授予对特定类型的所有资源的访问权限来授予访问权限
- 来自强制访问特定资源的不同权限的结果只有在它们都允许访问资源时,才会授予访问权限
11.3.6.1. 解决冲突的权限 复制链接链接已复制到粘贴板!
权限可以关联有多个策略。随着授权模型的演进,一些策略通常适用于权限内,甚至与特定资源相关的不同权限。
当任何权限被评估为"DENY"时,评估结果都将"密度"。如果有多个与同一资源相关的权限,它们都必须授予访问权限才能"声明"。
细粒度 admin 权限允许您为单个资源或资源类型本身(如所有用户、所有组等)设置权限。如果存在与特定资源相关的权限或权限,在评估过程中不会考虑"all-resource"权限。如果没有特定的权限,则回退将进入 "all-resource" 权限。这种方法有助于解决相应的场景,如允许 realm-admins 组的成员管理 realm-admins 组的成员,但阻止他们管理 realm-admins 组的成员。
11.3.7. 以 Realm Administrator 身份访问 Realm 管理控制台 复制链接链接已复制到粘贴板!
域管理员可以访问专用的域特定管理控制台,允许他们管理其所分配的域中的资源。此控制台与红帽构建的 Keycloak 管理控制台独立,通常由服务器管理员使用。
有关专用域管理控制台和可用角色的更多详细信息,请参阅: 专用管理控制台。
要访问管理控制台,域管理员必须分配至少以下角色之一,具体取决于需要管理的资源:
- query-users - 需要查询域用户。
- query-groups - 需要查询域组。
- query-clients - 查询域客户端需要查询。
通过向域用户授予任何这些角色,他们将能够访问管理控制台,但仅适用于对应于授予的角色的区域。例如,如果您分配 query-users 角色,域管理员将只能访问管理控制台中的 Users 部分。如果管理员对多个资源类型(如用户和组)负责,则必须分配所有对应的 "query channel" 角色。
这些角色启用对查询资源的基本访问权限,但不授予查看或修改它们的权限。要授予或拒绝访问 realm 资源,您需要为每种资源类型提供的任何操作设置权限。如需了解更多详细信息,请参阅 管理权限。
11.3.7.1. 角色和权限关系 复制链接链接已复制到粘贴板!
细粒度权限用于授予其他权限。您不能覆盖内置 admin 角色的默认行为。如果为域管理员分配有一个或多个 admin 角色,它将阻止评估权限。这意味着,如果为域管理员分配了对应的 admin 角色,则将绕过权限评估,并授予访问权限。
| 管理员角色 | 描述 |
|---|---|
| query-users | 域管理员可以在管理控制台中看到 Users 部分,并可在域中搜索用户。它不授予 查看用户的权限。 |
| query-groups | 域管理员可以在管理控制台中看到 Groups 部分,并可搜索域中的组。它不授予 查看组的权限。 |
| query-clients | 域管理员可以在管理控制台中看到 Clients 部分,并且可以在域中搜索客户端。它不授予 查看 客户端的权限。 |
| view-users | 域 管理员可以查看 域中的所有用户和组。 |
| manage-users | realm 管理员可以查看,map-roles, manage -group-membership,并管理 域中的所有用户,以及查看 域中的组、管理 成员和管理组。 |
| 模拟 | 域管理员可以 模拟 域中的所有用户。 |
| view-clients | 域 管理员可以查看 域中的所有客户端。 |
| manage-clients | 域管理员可以 查看和管理 域中的所有客户端和客户端范围。 |
11.3.8. 了解一些常见用例 复制链接链接已复制到粘贴板!
请考虑一个情况,管理员希望允许一组管理员管理域中的所有用户,但属于管理员组的用户除外。本例包括 测试 域和 test-admins 组。
11.3.8.1. 允许按一组管理员管理用户 复制链接链接已复制到粘贴板!
创建用户权限权限,允许查看和管理 test-admins 组成员的域中所有用户:
- 导航到管理控制台中的 Permissions 选项卡。
- 点 Create permissions 并选择 Users resource type。
-
填写名称,如
Disallow managing test-admins。 - 选择 查看和管理 授权范围,保留选中 所有用户。
- 创建一个条件,要求通过单击 Create new policy 来获取访问权限。
-
填写名称
Allow test-admins,选择 Group as Policy type。 -
单击 Add groups 按钮,再选择
test-admins组,单击 Save。 - 点 Save on Create permission 页。
11.3.8.2. 允许按 admins 组而不是组成员管理用户 复制链接链接已复制到粘贴板!
让我们排除组成员本身,因此 test-admins 无法管理其他管理员。
- 单击 Create permissions 来创建 新权限。
- 这一次选择 Groups 资源类型。
-
填写名称,如
Disallow managing test-admins。 - 选择 manage-members 授权范围。
-
选择 Specific Groups 并选择
test-admins组。 - 创建类型为 Group 的新策略。
-
填写名称
Disallow test-admins,再选择test-admins组。 - 切换到策略的 Negative Logic,保存策略
- 保存 权限
11.3.8.3. 允许为分配有特定角色的组成员模拟用户 复制链接链接已复制到粘贴板!
- 为您要允许模拟的特定用户(或所有用户)创建"用户权限"。
-
创建"组策略",允许访问
test-admins的成员。 -
创建"角色策略",允许访问分配了
impersonation-admin角色的用户。 - 将这两个策略分配给权限。
11.3.8.4. 将特定用户列入黑名单 复制链接链接已复制到粘贴板!
- 为您要阻止的特定用户创建 用户权限。
- 创建评估为 deny 的任何策略(如没有选择用户的用户策略)。
- 将策略分配给权限,以便有效地为所选用户阻止模拟。
11.3.8.5. 允许查看用户,但不为分配了定义的角色的管理员管理用户 复制链接链接已复制到粘贴板!
- 使用所有用户的 查看 范围创建一个"用户权限"。
- 创建"角色策略",允许访问分配了特定角色的用户。
-
不要 分配
管理范围,以防止修改用户详情。
11.3.8.6. 允许管理组成员的用户和角色分配 复制链接链接已复制到粘贴板!
- 使用 管理的,为所有用户映射角色 范围创建"用户权限"。
-
创建"组策略",允许访问
test-admins的成员。
11.3.8.7. 允许查看和管理组成员,但不能查看和管理其子组的成员 复制链接链接已复制到粘贴板!
-
使用特定组
mygroup的 view-members 和 manage-members 范围创建一个"组权限"。 -
为它分配一个"组策略"以
test-admins为目标。 -
创建一个带有特定组的 view-members 和 manage-members 范围的另一个"组权限",选择
mygroup的所有子组。 -
为
test-admins创建负的"组策略",并将它分配给"子组"权限。
11.3.8.8. 允许模拟特定组的成员 复制链接链接已复制到粘贴板!
-
使用特定组
mygroup的 impersonate-members 创建"组权限"。 -
分配以
mygroup-helpdesk为目标的"组策略"
11.3.9. 性能考虑 复制链接链接已复制到粘贴板!
在为域启用功能时,在 realm 管理员管理任何受支持的资源类型时,还有额外的开销。执行这些操作时,这主要是如此:
- 列出和搜索
- 更新或删除
该功能会在列出或管理 realm 资源时引入额外的检查,以便根据您定义的权限强制访问。当查询 realm 资源时,这主要是因为额外开销来部分评估域管理员的权限,以过滤和分页结果。
对域管理员用户以及可以访问的大部分资源的权限越少。例如,如果要将访问权限委托给域管理员来管理用户,最好让这些用户作为组的成员。通过这样做,您不仅在评估权限时提高了性能,还要创建更易于管理的权限模型。
访问强制的主要影响是在查询域资源时。例如,如果域管理员通过用户、角色或组策略在数千个权限中引用的中引用,在查询域资源时会发生部分评估机制将从数据库查询所有这些权限。更简洁且优化的模型有助于获取较少的权限,但有足够的权限授予或拒绝访问 realm 资源。
例如,授予域管理员访问权限以查看和管理域中用户,最好使用组权限而不是为域中的每个用户创建单独的权限。还要确保与某个权限关联的策略通过直接引用(用户策略)或间接(角色或组策略)引用来引用域管理员,无论资源类型如何,都不跨越多个(千计)权限。
例如,假设您在域中有三个用户,并且您想要允许 bob (一个域管理员) 来查看和 管理它们。非优化权限模型会为每个用户创建三种不同的权限,用户策略将授予对 bob 的访问权限。相反,您可以拥有单个组权限,甚至是一个用户权限,在仍使用同一用户策略授予对 bob 的访问权限时。
如果要向这三个用户授予更多域管理员访问权限,则也是如此。您可以考虑使用组或角色策略,而不是创建单独的策略。权限模型是特定于用例的,但这些建议很重要,不仅能提供更好的管理性,还在管理域资源时提高服务器的整体性能。
在服务器配置中,根据您的域的大小以及您拥有的权限和策略数量,您可以考虑更改缓存配置以增加以下缓存的大小:
-
realms -
users -
授权
考虑查看这些缓存的服务器指标,以查找在调整部署的大小时的最佳值。
在过滤资源时,部分评估机制最终依赖 SQL 语句中的 IN 子句来过滤结果。根据您的数据库,您可能会对 IN 子句的参数数量有限制。这是对 Oracle 数据库的旧版本的情况,对 1000 参数具有硬性限制。要避免这些问题,请记住有关授予或拒绝访问单个域管理员的权限数的注意事项。