通过 Keystone 添加项目验证,用于配额和风味管理

https://blueprints.launchpad.net/nova/+spec/validate-project-with-keystone

当管理员对其他租户执行操作时,他们必须指定一个项目 ID 来标识租户。Nova 目前不检查管理员提供的此项目 ID 的有效性。

此蓝图的范围是向配额管理(即配额默认值、配额详情、配额显示、配额更新)和风味访问管理(即风味访问添加)添加项目 ID 验证。将项目 ID 验证添加到配额和风味管理之外的任何功能都超出此蓝图的范围。

问题描述

Nova 配额集管理和风味访问管理通过 CLI 需要管理员指定一个项目 ID。实际上没有任何东西会检查此项目 ID 是否确实存在,因此管理员可以轻松指定一个无效的项目。

如果向配额更新命令提供无效的项目 ID,在更新特定配额类别的配额时,Nova 会报告意外的配额信息。用户指定的项目 ID 最终会出现在 Nova 的 project_user_quotas 表中的 project_id 字段中。当项目 ID 与 project_user_quotas 表中的内容不匹配时,将设置无效的配额。对具有配额检查的项目执行的任何操作都不会以管理员期望的方式受到影响。

例如,如果管理员想要增加给定项目 ID 的浮动 IP 地址数量,因为该项目已经用完了其配额,并且向 quota-update 提供了错误的 project ID,那么任何尝试添加额外的浮动 IP 地址都会意外失败。 历史上,调试此问题的管理员已对 Nova 配额管理提交了无效的错误报告。

用例

作为管理员,当我尝试修改我的项目的配额或风味访问信息时,并且我不小心提供了一个无效的项目 ID

  • 我希望知道我提供的项目 ID 无效。

  • 我不想在提供无效的项目 ID 时更新我现有的配额或风味访问数据。

提议的变更

Nova 将使用请求者的用户令牌向 Keystone 查询。Keystone 响应将确定对项目的访问权限,并指示项目是否存在。

Keystone 将返回以下结果之一,这些结果将被转换为 Nova 响应

  • 200 - 项目存在,Nova 继续

  • 404 - 项目不存在,Nova 返回 400 错误响应,表明未找到该项目 ID

  • 403 - 用户没有权限提出问题,我们将处理为成功,但记录我们没有权限进行验证。

  • 其他任何情况 - 出了严重的问题。Nova 将处理为成功,但我们将记录响应作为警告。

由于此更改依赖于 Keystone 和 Nova 之间正确设置的策略信息,因此我们需要为设置此策略的运营商提供指导。此更新需要发布说明和文档更新。

API 更改将仅应用于 v2.1;API v2.0 当前已冻结。

备选方案

现状:不验证项目 ID,让用户通过“keystone tenant-list”弄清楚合适的项目 ID。这将继续成为最终用户的糟糕体验,Nova 团队将继续收到有关不准确的配额和风味访问值的错误报告。

另一种选择是让 python-novaclient 验证项目 ID,并期望其他客户端(例如第三方)也这样做。这并不能解决 Nova 本身的问题,即无效的项目 ID 最终会进入数据库。让 CLI 处理项目名称验证是有意义的,因为此更改仅适用于项目 ID 验证。

在 Newton 会议的跨项目会议期间讨论的另一种方案是使用 Nova 服务用户令牌访问 Keystone 中的数据。这被驳回,因为它模糊了用户对哪些资源的访问权限,并可能带来潜在的安全风险。

最后,过去探索的另一个选项是简单地进行 UUID 验证。这种方法被拒绝,因为我们不需要项目 ID 是 UUID,因此有效的项目 ID 会被拒绝。

数据模型影响

无。如果存在任何 project_id 设置为无效 ID 的条目,可以使用相关的删除命令删除它们。删除操作不应触发项目 ID 验证。

REST API 影响

项目 ID 验证将为某些 API 方法创建一个新的错误条件。

如果存在用于验证项目 ID 的 Keystone 服务帐户,并且项目 ID 无效,则 API 将从 POST 和 GET 请求返回带有错误文本的 HTTPBadRequest。

以下 API 方法将受到影响

  • quota-defaults

  • quota-detail

  • quota-show

  • quota-update

  • flavor-access-add

安全影响

无。这是使用现有的授权机制,没有引入任何新的逻辑。

通知影响

性能影响

性能影响很小。虽然需要向 Keystone 发出请求来验证项目 ID,但由于配额/风味访问不经常更改,因此这将是一项低频操作。

其他最终用户影响

用户需要有关如何配置他们的 Keystone 和 Nova 策略以利用此更新的文档。

尝试显示无效项目 ID 的现有条目将导致 400 错误。未来的工作应该为用户提供清理错误条目的机制。

其他部署者影响

如果 Keystone 不存在,或者 Keystone 策略未正确设置为项目 ID 验证,则配额和风味操作不应被阻止。在这种情况下,应记录警告消息,指示项目 ID 验证不可用。应每次记录此警告,以提高对运营商的可见性,以便他们可以修复其策略。

开发人员影响

实现

负责人

主要负责人

sdague

工作项

  • 通过当前上下文访问用户令牌

  • 实现通过给定 ID 获取项目的方法。

  • 修改 nova/api/openstack/compute/quotas.py 中的 QuotaSetsController 类,以验证提供的项目 ID(如果提供)。

  • 修改 nova/api/openstack/compute/flavor_access.py 中的 FlavorActionController 类,以验证提供的项目 ID(如果提供)。

  • 创建 Tempest 测试用例以及 Nova 单元和功能测试用例来验证功能。

  • 使用策略示例更新 Keystone DocImpact 错误,以便可以更新文档。

依赖项

测试

Tempest 测试用例以及 Nova 单元和功能测试用例将用于验证项目 ID 验证。

Tempest 测试覆盖范围

  • Keystone 验证

  • Tempest 中的一个功能切换器,用于告诉它是否配置了 Keystone(在 devstack 中)以使策略生效

需要使用验证进行测试的命令

  • quota-defaults

  • quota-detail

  • quota-show

  • quota-update

  • flavor-access-add

每个命令的测试用例

  • 有效项目 ID - 200

  • 无效项目 ID - 400

  • 用户有权访问有效项目 - 200

  • 用户没有权访问有效项目 - 403

  • Keystone 不可用 - 记录警告

需要不进行验证进行测试的命令

  • quota-delete

  • flavor-access-delete

每个命令的测试用例

  • 预先存在的无效项目 ID - 200

  • 新的无效项目 ID - 200(当前行为)

    ** 不应创建一个新条目然后删除它

文档影响

参考资料