不可变资源

bug #1823258

Keystone 是云部署的关键部分。管理员在 Keystone 中进行配置更改时应格外小心,以避免将不良更改级联到云部署的其余部分,但 Keystone 也应更具鲁棒性,以防止意外的错误操作。

问题描述

Keystone 负责许多在 OpenStack 部署的其他服务中使用的资源。例如,角色本质上将权限映射到可以与角色分配关联的字符串。许多角色在 OpenStack 中重复使用,并且某些角色具有管理部署所需的提升的授权。在某些情况下,意外删除角色可能会对部署造成灾难性影响,因为删除角色会触发删除用户在任何作用域内对该角色拥有的所有角色分配。这对于服务用户尤其重要,服务用户通常具有管理员角色分配,如果没有该角色分配,它们就无法执行云可用所需的基本操作。在这种情况下,修复通常需要手动修改数据库条目,这在生产环境中是一种糟糕的做法。

Keystone 应实现一种更强大的机制,允许操作员锁定特定资源,例如重要的角色。锁定资源在解锁之前不应可删除,这为部署关键的 API 资源增加了一层保护,尤其是在命令行或恶意/有故障的管理员脚本中意外发生故障时。

提议的变更

Keystone 角色、用户、项目和域将获得一个 immutable 标志,作为 资源选项。不可变资源除非关闭不可变标志,否则不能被删除或更改。

对于大多数资源,用户将通过设置标志来选择锁定这些资源。最终,管理员角色应默认变为不可变。但是,硬编码不可变性将与向后兼容性严重不兼容,因此我们分步骤实施此功能

  1. 将一个 immutable 资源选项添加到角色模型。默认情况下,它始终关闭。

  2. keystone-manage bootstrap 命令中添加一个选择加入的标志 --immutable-roles,该标志将 immutable 资源选项设置为默认角色(adminmemberreader)为 true。该命令还应记录警告,如果他们不设置它,这将成为未来的默认行为。

  3. 添加一个 keystone-status 检查,以提醒操作员他们是否已使默认角色不可变。

  4. 更改 keystone-manage bootstrap 的行为,默认情况下使角色不可变,并提供 --no-immutable-roles 选项来退出。

备选方案

  • 使角色更像域,域必须先禁用然后才能删除。这不向后兼容。

  • 将角色更改为软删除。这不会改变角色分配被硬删除的事实,但由于角色 ID 仍然保留在数据库中,因此可能更容易恢复。

  • 更改 Horizon 以对删除管理员角色等潜在破坏性操作发出视觉警报。这不能防止恶意脚本。

安全影响

这没有直接的安全影响。

通知影响

此新的资源选项将不会允许任何通知。

其他最终用户影响

如果管理员确实想删除或更改角色,则需要取消设置角色的 immutable 标志。需要客户端更改才能允许管理员将角色设置为可变或不可变。非管理端用户不应看到任何差异。

性能影响

可忽略的性能影响。Keystone 必须在可写操作期间确定资源是否被锁定并相应地采取行动,这将被视为业务特定逻辑。

其他部署者影响

部署者将被提醒选择加入新行为。发布说明和命令帮助输出中将提供详细的升级说明。

开发人员影响

自定义角色后端开发人员需要了解新的属性。

实现

负责人

主要负责人

Colleen Murphy (cmurphy)

工作项

概述见 提议的变更

依赖项

需要 资源选项脚手架 实现角色驱动程序。

文档影响

这将需要更新 API 参考以及管理员指南中有关升级和管理角色的说明。

参考资料