使用 oslo.policy 用于 Monasca APIs

https://storyboard.openstack.org/#!/story/2001233

目前,monasca-api 和 monasca-log-api 都没有使用 oslo.policy。相反,它们包含自己的策略执行代码。如果没有 oslo.policy,它们将无法实现 Queens[0] 的代码社区目标,该目标要求使用 oslo 机制来定义和执行策略。

问题描述

由于 monasca-api 和 monasca-log-api 都没有使用 oslo.policy 进行策略执行,因此它们无法使用 oslo.policy 机制来描述它们的策略,这是社区目标[0] 要求的。

用例

本规范提出的更改将改善上述情况,具体如下

  1. 策略将以 OpenStack 范围内标准的方式由 oslo.policy 执行。这减少了 Monasca 开发人员的维护负担,因为他们不再需要维护 Monasca 自己的策略执行代码。

  2. 所有默认策略规则都将以标准格式提供给所有相关方,从而实现社区目标。

  3. 操作员将能够使用 policy.json 文件覆盖 Monasca API 和 Monasca Log API 默认策略,并运行命令行工具生成完整的 policy.json 文件,用于任一服务(例如,用于审计目的)。

  4. 能够使用 oslo.policy 中的新工具,让开发人员以操作员可以使用的形式弃用或更改策略默认值。

提议的变更

本规范建议对 monasca-commonmonasca-apimonasca-log-api 和即将推出的 monasca-events-api 进行以下更改

  1. monasca_common.policy 中实现策略执行引擎。我们可以将其建模为 Nova 的策略执行引擎[1]。我们必须对其进行修改,以考虑到我们有多个 API 使用相同的策略引擎这一事实。

  2. monasca-apimonasca-log-api 中定义一个包含默认策略规则的模块,并将其暴露给执行引擎(在 monasca-events-api 中已经存在这样的模块)。Nova 的采用 list_rules() 方法[2] 的方法对我们来说应该可以很好地工作。我们可以选择复制 Nova 的方法,将各个端点的策略聚合到该中心模块[3] 中,或者直接将它们放在那里。

  3. 通过代码修改 monasca-apimonasca-log-apimonasca-events-api 中的现有策略执行代码,以使用 monasca-common 中的执行引擎。

  4. 添加 monasca-api-policy 和 monasca-log-api-policy 命令行入口点,允许用户为这两个 API 生成 policy.json 文件。

备选方案

没有,因为这是一个社区目标。可以以不同的方式进行的事情是策略执行引擎:在 monasca-api 和 monasca-log-api 中拥有独立的执行器实现是可行的。但是,这会不必要地违反 DRY 原则。

数据模型影响

此更改不会影响数据模型。

REST API 影响

此更改必须以不会对 API 的消费者产生明显影响的方式实现。

客户端影响

N/A

配置更改

此更改将继续使用我们已经用于策略执行的相同的 monasca-apimonasca-log-api 配置设置

  • agent_authorized_rolesdefault_authorized_rolesdelegate_authorized_rolesread_only_authorized_roles 用于 monasca-api

  • default_rolesagent_rolesdelegate_roles 用于 monasca-log-api

唯一的区别是现在将使用不同的实现 (monasca-common.policy)。

此外,策略执行器将允许操作员为每个 API 服务创建一个 policy.json 文件,以覆盖代码中的默认值。

安全影响

此更改引入了一种方式,让操作员可以通过配置文件影响 monasca-api 和 monasca-log-api 策略。如果他们以错误的方式配置策略,可能会允许未经授权的用户发送或检索指标和日志。

其他最终用户影响

N/A

性能影响

N/A

其他部署者影响

N/A

开发者影响

引入新的 API 操作的开发人员需要在实现此功能后为这些端点注册策略规则。

实现

负责人

主要负责人

amofakhar

工作项

  1. 将策略执行模块添加到 monasca-common。 最好有一个扩展机制,用于策略的目标,类似于 Magnum 中的这个[1],以考虑到 monasca-apimonasca-log-api 所需的配置文件的不同角色变量。 这样就可以创建一个通用的策略执行器,使其灵活到可以根据策略规则表达 monasca-apimonasca-log-api 之间的所有角色差异。

  2. 退役 monasca-events-api 中的策略执行代码,转而使用 monasca-common 中的策略执行模块。

  3. 将策略注册代码添加到 monasca-api

  4. monasca_api.v2.reference.helpers.validate_authorization() 中使用策略执行模块

  5. 将策略注册代码添加到 monasca-log-api

  6. monasca_log_api.middleware.role_middleware.(用于验证代理角色)和 monasca_log_api.app.base.request 中删除策略执行代码,并将其替换为使用来自 monasca-common.policymonasca_log_api.middleware.role_middleware.monasca_log_api.app.base_request(以便在一个地方进行集中执行)。

  7. monasca-api-policy 控制台脚本添加到 monasca-api

  8. monasca-log-api-policy 控制台脚本添加到 monasca-log-api

依赖项

N/A

测试

现有的策略执行测试可能需要进行重大修改。

文档影响

需要为操作员记录以下内容

  1. 他们新添加的创建 Monasca API 服务 policy.json 文件的能力

  2. monasca-api-policymonasca-log-api-policy 脚本的功能

参考资料

[0] https://governance.openstack.org/tc/goals/queens/policy-in-code.html

[1] https://github.com/openstack/nova/blob/master/nova/policy.py

[2] https://github.com/openstack/nova/blob/master/nova/policy.py#L207

[3] https://github.com/openstack/nova/blob/master/nova/policies/__init__.py

[2] https://github.com/openstack/magnum/blob/master/magnum/common/policy.py#L102

历史记录

修订版

发布名称

描述

Queens

引入