基于角色的 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]

参考资料