基于用户ID的策略执行

https://blueprints.launchpad.net/nova/+spec/user-id-based-policy-enforcement

Policy.json 是一个图灵完备的混乱集合。只有勇敢的人才敢穿梭其中。只有幸运的人才能毫发无损地出来。没有人真正探索过从这个怪物身上可以创造什么,我们每天都在发现新的奇迹。

问题描述

在遗留的 v2 Nova API 代码库中,结果发现有一个后门特性,允许操作的范围限定为“user_id”而不是“project_id”。Nova 团队中的没有人意识到这一点。它并没有内置到 3 年前开始工作的当前 Nova API 堆栈中。

正如所有软件的伟大承诺一样,如果一个特性/bug 存在,并且被发布,最终有人会使其对其软件的使用至关重要。

在这种情况下,它被用作缺乏分层项目的后门。这才是真正的解决方案。而且,根据这个特性的使用情况,简单的一层分层项目,只有在顶层进行配额管理,就足以满足许多人的需求。

使用方式是将大量用户(约 150 人)放入一个项目中,为他们提供一个配额,但不允许用户操作彼此的服务器。

本规范建议我们支持对服务器进行非常有限的集合操作,以检查策略中的 user_id。这些操作被认为是破坏服务器的操作。

用例

像 CERN 这样的大型部署发现为每个需要不同人员组努力创建 Keystone 项目非常繁琐。对于这些更短暂的努力,他们会创建大型“总揽”项目并将用户放入其中。

这些用户正在从事不同的事情,没有在传统的 Keystone 项目边界内进行协作,甚至可能不知道他们的“项目”中还有谁。因此,他们希望防止用户意外地破坏彼此的工作。这是通过更新策略,将许多操作的范围限定为 user_id 而不是 project_id 来完成的。

注意

这与 OpenStack 设计的权限模型完全背道而驰。我们真的不希望 Nova 中有这个特性,也不希望它被使用。本规范完全是一个垫片,直到基本的分层项目支持存在,之后它将被删除。

提议的变更

以下操作将在策略中进行检查,并考虑 user_id(如果在 policy.json 中配置)。

  • DELETE /servers/{server_id} - 破坏性

  • PUT /servers/{server_id} - 允许更改服务器名称

以及以下服务器操作

  • changePassword

  • lock

  • pause

  • rebuild

  • resize

  • rescue

  • os-stop

  • suspend

  • 撤离

  • forceDelete

  • shelve

  • crashDump

这些被认为是破坏性操作。其他仅具有破坏性的操作,例如 reboot 将被允许。 此外,其他安全漏洞,例如 show console 将不会被解决。OpenStack 的安全边界是 项目。这只是对现有站点关心的某些服务器破坏性行为的一种安全保障。这个操作列表在 这里 得到了关键利益相关者(例如 CERN)的认可,他们最初提出了这个问题。

这将作为已弃用的结构添加,并在未来删除。它应该给人们一些时间来迁移到其他模型,并意识到这在未来将不再被支持。这种改变会引入互操作性问题,这就是为什么它会受到使用的限制。

最终的解决方案将是分层项目。正如从这个用例中看到的,许多分层项目的使用只需要在顶层进行配额管理。因此,在处理分层配额之前,应该将其视为第一步。

备选方案

什么都不做。这是一个有点边缘的特性。

数据模型影响

无。

REST API 影响

这改变了我们在 API 调用系列中执行策略的方式。

对于选择执行此操作的部署,他们应该意识到他们正在破坏基本的互操作性结构,即所有服务器构造的权限都是项目级别的权限结构。最好有一些 Tempest 测试来检查这一点。

安全影响

我们明确不处理所有安全敏感的 API 点。这只是为了防止最糟糕的资源意外破坏(就像 rm -rf / 不再执行可怕的事情)。

在同一个项目内操作的用户应该被认为是协作的多任务处理者,可以访问彼此的资源。

通知影响

无。

其他最终用户影响

默认情况下,无。

性能影响

无。策略检查所需的所有数据都已经存在。

其他部署者影响

默认情况下,无。

由于部署者在 Liberty 中使用了遗留 v2 堆栈的此特性,我们应该考虑将其回移植到 Mitaka,甚至可能到 Liberty,以平滑过渡。

开发人员影响

无。

实现

负责人

主要负责人

Ghanshyam Mann <ghanshyam.mann@nectechnologies.in>

工作项

  • 实现对上述列出的调用的策略检查

  • 为这些调用中的每一个实现自定义策略测试

  • 回移植到 Mitaka

  • 可能回移植到 Liberty

依赖项

无。

测试

所有这些都将在树中进行测试,使用单元/功能测试和使用 user_id 规则的自定义策略。目前没有测试,这就是为什么我们删除了这个后门特性并且没有注意到它。

文档影响

同时,我们应该删除 OpenStack 文档中所有引用 Nova 中基于 user_id 的策略的内容,以便新用户不要开始使用它。

唯一的例外是 keypairs,它一直是 Nova 中有点奇怪的元素。

参考资料

历史

修订版

发布名称

描述

Newton

引入