基于角色的 QoS 策略访问控制¶
https://bugs.launchpad.net/neutron/+bug/1512587
为 Neutron 中的 QoS 策略添加基于角色的访问控制。
问题描述¶
目前,在 neutron 中 QoS 策略无法在租户子集之间共享。本提案讨论使用 RBAC [1] 用于 QoS 策略,并使其能够在租户之间共享。
提议的变更¶
引入一个新的 QosPolicyRBAC 表,用于控制 Neutron QoS 策略在租户之间的共享。现有的共享策略逻辑随后将被更新,以利用新的 RBAC 代码作为第一个实现。qos-policy 上的当前“shared”属性将作为新表中的通配符条目呈现,以保留向后兼容的 API(更多详细信息如下)。
此规范仅影响允许哪些用户应用 qos-policies - 不影响它们如何应用或之后发生什么。由于此功能利用现有的 RBAC 代码,它将仅采用白名单模式。即,action 列不能是表示某个租户不能执行某事的否定。租户将能够删除他们拥有的策略,但是,如果策略被共享并正在使用(例如,附加到其他租户的网络),则删除将被禁止。
数据模型影响¶
为 qos 策略添加 RBAC 模型,参考现有的 RBAC for Data 模型 [2]。
QosPolicyRBAC 表结构
属性名称 |
类型 |
访问 |
默认值 |
验证/转换 |
描述 |
|---|---|---|---|---|---|
id |
字符串 (UUID) |
R |
生成 |
N/A |
RBAC 条目的 ID |
tenant_id |
字符串 (UUID) |
R |
自动 |
N/A |
RBAC 条目的所有者 |
object_id |
字符串 (UUID) |
RW |
N/A |
对象存在 |
受 RBAC 影响的对象 |
object_type |
string |
RW |
N/A |
具有 RBAC 表的类型 |
对象类型 |
target_tenant |
string |
RWU |
string |
条目影响的租户 ID。* 表示所有 |
|
操作 |
string |
RW |
N/A |
对象上的操作 |
允许的操作对象上的租户操作 |
示例条目¶
一个遗留的共享 qos 策略
object_id = <某个_qos_policy_id>
target_tenant = ‘*’
action = ‘access_as_shared’
id = <uuid> # 自动生成
tenant_id = <策略创建者的 uuid> # 由 API 生成
共享给特定租户的 qos 策略
object_id = <某个_qos_policy_id>
target_tenant = <某个_tenant_id>
action = ‘access_as_shared’
id = <uuid> # 自动生成
tenant_id = <策略创建者的 uuid> # 由 API 生成
所有条目都是为了允许它们描述的操作。目前不会有任何“拒绝”规则。
对象 ID 只是将应用 RBAC 条目的策略的 UUID。
target_tenant 将是授予执行目标对象上操作权限的租户(也称为项目)ID。此条目也可能是星号,以表示它适用于所有租户。
action 将描述租户可以对对象执行的操作。此规范仅处理一个操作 - ‘access_as_shared’,表示租户可以像访问共享策略一样访问它。将来可以将其扩展到包含类似‘deny’的内容,以提供 RBAC 黑名单功能。支持的操作可以通过 API 发现。
最后,每个 RBAC 条目还将具有一个租户 ID,指示创建策略的租户。通常,这将与共享对象相同的租户,但对于为其他租户创建的管理员创建的策略,可能并非如此。
REST API 影响¶
现有的 RBAC API 将扩展以接受新参数 - 将在现有的 CLI 中添加一个新的“object-type”选项。
{
'rbac_policy': {
'action': 'access_as_shared',
'tenant_id': 'cc4abd64f6e5409da3ae6c04124f6d37',
'object_type': 'qos-policy',
'target_tenant': '1b245fd28a13435bb075dadac5951f8d',
'object_id': 'f60eb0dc-ce07-419c-aa80-1114aafd38a7',
}
}
安全影响¶
租户将能够相互共享 qos 策略。这不应该成为一个主要问题,因为所有权永远不会改变。实际上,每个租户将负责其策略的使用。
通知影响¶
N/A
其他最终用户影响¶
最终用户将能够指定 qos 策略作为对象类型。将向现有的 CLI 添加一个新的“object-type”选项。不需要新的 CLI。
将新的 RBAC 附加到现有的 qos-policy
neutron rbac-create <qos-policy-uuid|qos-policy-name> --type qos-policy --target-tenant \
<tenant-uuid> --action access_as_shared <RBAC_OBJECT>
不应影响常规的全局共享 qos 策略工作流程。新的 API 用法仅需要用于细粒度的条目。
从共享了策略的租户的角度来看,该策略将显示为“shared”,就像全局共享策略一样。
性能影响¶
检查 qos-policy 的“shared”属性现在涉及连接到另一个表。同样适用于策略列表和更新。
IPv6 影响¶
N/A
开发人员影响¶
N/A
社区影响¶
此更改不应以任何重大方式影响社区,因为遗留 API 仍然存在。
工作项¶
添加 DB 模型。
调整现有的“shared”属性以使用 rbac 并添加迁移脚本。
更新客户端以 CRUD 新的 RBAC 类型。
为 Neutron 服务器添加 UT。
添加 API 测试。
依赖项¶
N/A
测试¶
Tempest 测试¶
不需要测试。API 测试就足够了。
功能测试¶
对于这项工作,可能不需要功能测试。所有这些都在 API 层,不会影响数据平面。
API 测试¶
执行 RBAC 条目的基本 CRUD。
确保 qos 策略随着 RBAC 条目的更改而显示和隐藏
文档影响¶
用户文档¶
将为 qos 策略条目添加 RBAC 的工作流程需要添加到 [3]。