为 admin 项目标注 Token¶
为作用域限定于指定 ‘admin’ 项目的 Token 的验证响应添加额外的标识符。
问题描述¶
Keystone 的 rbac 模型在特定项目上授予用户角色,并且在 Keystone Redux 之后,不再存在“全局”角色。
然而,在某些情况下,需要一个允许用户执行超出单个项目相关范围的操作的 Token。例如
操作与项目无关的资源
为选定的用户提供云管理员能力
目前有两种方法可以实现这一点。第一种是所有默认策略文件的编写方式——如果用户在任何项目上拥有 admin 角色,他们实际上可以在任何其他项目上成为管理员。这显然是不希望看到的。实际上,这些策略文件应该检查 Token 中项目的范围,以确保用户确实在正在操作的项目上拥有适当的角色。但是,这样做会再次阻止上述两种示例的解决。
第二种方法是 keystone policy.v3cloudsample.json 示例中使用的,其中特定的域被“祝福”。如果您在该特殊域上拥有 admin 角色,那么您可以充当云管理员或操作与项目无关的资源。policy.v3cloudsample.json 方法的唯一问题是,它需要在设置时,将特殊管理员域的 ID 粘贴到策略文件中的一个规则中
“cloud_admin”: “role:admin and domain_id:<在此处插入 admin domain_id>”,
使用特殊项目或域似乎是提供所需功能的合适方法,但最好不要修改所有服务的策略文件,并使用特定的项目/域 ID。
提议的变更¶
建议 Keystone 支持一个配置选项,以指定特殊的 admin 项目。如果定义了该选项,则为该项目发出的任何作用域 Token 都会在 Token 中添加一个额外的标识符 is_admin_project。然后,服务策略文件在评估 API 的访问控制策略时,可以检查此标识符。
目前可能提出的一个问题是,如果我们希望为 nova、neutron、cinder 等服务拥有不同的管理员,他们可以在这些服务中操作与项目无关的资源,该怎么办? 这是否意味着我们需要支持每个服务的特殊项目? 答案是“否”,可以通过以下方式获得这种支持
为每个服务的管理员创建角色(例如 nova_admin、cinder_admin),这些角色将在每个服务的策略文件中进行检查,例如
“i_am_nova_admin”: “is_admin_project and role:nova_admin”
编写 Keystone 策略规则,用于角色分配,以便只有在特殊项目上拥有实际 admin 角色的用户才能将其他角色分配给该项目(即创建 nova、cinder、glance 管理员)。
另一个问题是这与当前 Keystone v3 示例如何关联,该示例使用特殊的管理员域。随着 Mitaka 中将域表示为具有 is_domain 属性的项目,Keystone 可以使用此功能提供相同的云管理员支持,例如
“cloud_admin”: “role:admin and is_domain and is_admin_project”
事实上,有了这个,我们应该能够使 v3 策略示例成为默认的 Keystone 策略文件(尽管会为此更改生成一个单独的规范)。
由于我们预计 v2 Token 将被支持很长时间,因此建议 is_admin_project 将同时支持 v2 和 v3 Token。
备选方案¶
仅在 admin 项目上颁发 admin 角色。解决了这个问题,但引入了更糟糕的问题,因为许多 API 假设用户可以获取作用域限定为具有 admin 角色的项目的 Token。
使角色全局化。破坏了许多现有的策略检查,这些检查假设角色作用域限定为现有的项目。实际上并没有解决任何问题。
像 v3cloud 示例一样模板化策略文件,并使用部署特定的配置管理系统使其保持同步。这需要在整个工具链中进行重大更改。
安全影响¶
此更改具有积极的安全影响,因为它允许部署者显著减少现有的一个风险区域——策略文件可能会授予比预期更多的用户管理员权限。但是,要利用此机制,需要对所有远程服务的策略文件进行一次修改。因此,在最初实施时不会产生任何影响。
通知影响¶
无。
其他最终用户影响¶
无。它将允许在 admin 项目上拥有 admin 的用户继续执行各种活动,并且只会限制在其他项目上拥有该角色的用户。
性能影响¶
最小,甚至没有。需要在创建 Token 时进行额外的 project_id 检查。
其他部署者影响¶
需要两个配置值:admin_domain_name 和 admin_project_name,以允许指定 admin 项目。如果仅指定 admin_domain_name,则将使用充当该域的项目。
开发人员影响¶
应该推动关闭 https://bugs.launchpad.net/keystone/+bug/968696 的所有项目。
实现¶
负责人¶
主要负责人:ayoung <Adam Young> ayoung@redhat.com
工作项¶
在 Keystone 服务器 Token 发行中实施更改
修改所有其他项目的策略文件
依赖项¶
无
文档影响¶
文档需要指示如何设置 admin_domain_name 和 admin_project_name 以限制 admin Token 的范围。