让 Cinder 保持一致且安全,并支持 RBAC¶
https://blueprints.launchpad.net/cinder/+spec/s-rbac-ready-y
修改 Cinder 的策略定义,以支持一致且安全的默认 RBAC社区目标 [1]。
问题描述¶
Cinder 策略目前仅依赖于角色,不识别范围,而范围是在 Queens 中引入 Keystone 的。因此,实现例如只能执行非破坏性操作的管理员非常复杂且容易出错。(例如,请参阅 Cinder 文档中的策略配置 HOWTO。)
使用令牌范围以及 Keystone Queens 时代的其他改进,例如角色继承,可以定义识别一组有用“角色”的策略规则。如果所有 OpenStack 服务都定义策略规则以支持这一点(即“一致”的部分),则操作员无需重写策略来尝试创建这些角色,而是可以使用经过测试的默认策略(即“安全”的部分)。
用例¶
一些示例
操作员希望拥有一个只能执行非破坏性操作的管理员。
操作员希望在每个项目中使用不同级别的最终用户(例如,一个可以比“项目成员”做更多事情的“项目经理”)。
操作员希望拥有一个系统管理员,可以管理 cinder 服务,但不能干扰属于管理员不是成员的项目拥有的资源。
操作员希望拥有一个客户支持管理员,可以对各种项目拥有的资源执行仅管理员才能执行的操作,但不能修改 cinder 服务。
提议的变更¶
在 Xena 周期中进行的策略更改的描述,在 cinder 代码仓库中的基本策略定义文件中有一段很长的注释,描述了这些更改将如何延续到 Yoga。不幸的是,然而,随着服务开始实施一致且安全的 RBAC,最初的提案中发现了一些问题,导致了该努力的方向发生了变化 [2]。这意味着上述 Yoga 周期中 cinder 的策略 [3]必须完全修改。
方向的改变以以下方式影响 cinder
“system-*”角色被定义为尽可能地对服务本身(而不是项目拥有的资源)起作用。(在 Xena 中,这些角色被设想为 cinder 超级用户,因此能够对项目资源和系统本身执行所有操作。)
“project-admin”角色现在旨在成为一个管理员(即操作员的代表——绝对不是最终用户),可以对项目拥有的资源执行管理员类型的操作(例如,迁移卷)。
引入了一个新的“project-manager”角色。这旨在成为一个最终用户,在项目中比“普通”用户拥有一些额外的权限。例如,可以授予项目经理设置卷类型为项目默认类型的权限。
在 Yoga 中,我们将执行以下操作
Xena 中合并的 Cinder 策略角色和权限文档 [4]包含关于 Yoga 中将要做什么的展望信息。不幸的是,这不再准确。该文档的 stable/xena 版本应修改为仅描述 Xena 中的更改,以免误导操作员关于该努力的方向。
有一个补丁解决了这个问题:https://review.opendev.org/c/openstack/cinder/+/818696
Yoga 开发分支中的 Cinder 策略角色和权限文档需要修改
允许“system-*”角色执行的操作范围将限制为对 cinder 服务的操作。这些将是“系统范围”操作。
允许“project-admin”角色执行的操作范围将允许此人对该人具有“admin”角色的任何项目拥有的资源执行管理操作。这些将是“项目范围”操作。
“project-member”和“project-reader”操作可能不会从 Xena 更改,但它们将在 Yoga 中明确地“项目范围”。
将有一些多范围操作。例如,系统和项目角色都应该能够列出卷类型(尽管只有系统管理员才能创建卷类型)。
一旦文档被修改,我们将能够将“scope_types”字段添加到每个策略规则。
此外,我们将能够更新所有策略的检查字符串。
理想情况下,当 project-admin 发出
GET /v3/volumes?all_tenants=1调用时,例如,响应应包括由所有且仅由该 project-admin 具有“admin”角色的项目拥有的卷。对于 Yoga,我们将允许任何具有“admin”角色的用户查看所有项目的卷(就像现在一样)。(有关原因,请参阅社区目标声明中的“跨部署列出项目资源”的讨论 [5]。)
此时,我们将完成社区目标的第 1 阶段 [6]。这将允许 cinder 随 oslo.policy 配置选项 enforce_scope=True 在 Z 版本中一起发布。(重要的是,社区目标的第 3 阶段 [7]在服务需要 enforce_scope=True 之前无法实施。)
我们计划在 Z 开发周期中执行社区目标的第 2 阶段 [8]。有关详细信息,请参阅社区目标文档。
如上所述,通过在 Yoga 中完成第 1 阶段,我们还应该能够在 Z 开发周期中完成第 3 阶段。
备选方案¶
什么都不做。尽管我们在 Xena 中做了所有这些工作,但这仍然不是一个真正的选择,因为对于某些项目使用范围而另一些项目忽略它,同时在项目之间保持一致的角色是不可能的。因此,如果我们不升级我们的策略定义,我们将阻止所有 OpenStack 云使用一致且安全的策略。
数据模型影响¶
无。
REST API 影响¶
各种 Block Storage API 调用的能力已经由策略控制。
安全影响¶
总的来说,这应该通过向操作员提供一套合适的“角色”,这些角色将在他们开箱即用的项目中一致地运行,从而提高安全性,而不是实施他们自己的角色。
Active/Active HA 影响¶
无。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
没有,我们已经需要向 keystone 发出调用以验证令牌并检索用户权限。
其他部署者影响¶
无。
开发人员影响¶
没有,除了完成实施工作。
实现¶
负责人¶
主要负责人
rosmaita
abishop
其他贡献者
tosky
enriquetaso
eharney
geguileo
whoami-rajat
jobernar
工作项¶
更新 stable/xena 分支中的 Cinder 策略角色和权限文档。
更新 Yoga 策略更改的上述 Cinder 策略角色和权限文档在 master 分支中。
将适当的
scope_types添加到所有策略规则。更新策略检查字符串以将系统策略与项目策略分开。
更新所有测试以反映上述更改,并根据需要添加新测试。
支持系统范围的客户端更改:https://review.opendev.org/c/openstack/python-cinderclient/+/776469
依赖项¶
没有,完成第 1 阶段所需的更改很久以前就在 Keystone 和 oslo.policy 中合并了。
测试¶
继续使用 Xena 中开发的测试框架。
我们继续拥有 Xena 规范中提到的拉伸目标,即在 cinder-tempest-plugin 中进行安全 RBAC 测试,但我们不认为这是成功完成此规范的要求。
文档影响¶
Cinder 的主要面向用户的文档是 Cinder 服务配置指南 中的 策略角色和权限。
此外,我们预计鉴于这项工作的 OpenStack 范围,Keystone 文档中会有更多针对操作员的通用文档。