为充当域的项目中的令牌添加 is_domain

bp add-isdomain-to-token

对于为充当域的项目颁发的项目范围令牌,令牌也应包含 is_domain=true。

问题描述

如今,策略文件中的“域管理员”等概念的创建依赖于域范围令牌的使用。对域令牌的支持实际上并不存在于 keystone 之外(甚至在 horizon 中),这存在问题。我们已经讨论过(并拒绝了)双范围令牌(即同时设置了项目 ID 和域 ID 的令牌,两者都设置为相同的 ID)。但是,如何使 keystone 的客户端能够执行策略保护的域相关操作仍然是一个问题。

提议的变更

此提案是简单地将 is_domain=true 添加到为充当域的项目颁发的任何令牌中。 这样一来,就可以编写策略规则,这些规则今天需要域令牌,而是可以使用常规项目令牌,同时仍然提供相同的保护级别。 例如,典型的策略规则

"identity:create_user": "rule:admin_required and domain_id:%(user.domain_id)s"

将被替换为

"identity:create_user": "rule:admin_required and project_id:%(user.domain_id)s and is_domain:True"

以类似的方式,这将允许 nova 策略文件指定,例如,不允许在充当域的项目中创建服务器

"compute:create": "role:vm-manager and is_domain:False"

这个简单的更改将允许重写整个策略文件,使其不再需要域范围令牌,为最终删除它们铺平了道路。

为了以这种方式使用项目令牌,当然,必须能够为充当域的项目请求项目范围令牌。 当前的问题是通过项目名称请求此令牌的潜在歧义,因为充当域的项目名称与该域中的某个项目名称之间可能存在冲突。 建议在按项目名称请求此类令牌时

  • 当前范围请求定义没有更改

  • 如果项目名称确实是唯一的,那么你将获得该项目

  • 如果域与项目之间存在冲突,你始终获得该项目

  • 如果,在这样的冲突情况下,你真的想要一个项目范围令牌来指向充当域的项目,那么你需要使用 ID 或首先重命名域或项目。

这样的令牌请求提案为未来留下了更全面的选项,例如传入层次结构定义,例如,如果我们想要转向仅要求项目名称在其直接父级中是唯一的。

备选方案

已经讨论了许多替代方案,到目前为止已被拒绝。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

为了利用这一点,部署者必须更改他们的策略文件。

开发人员影响

实现

负责人

主要负责人

henry-nash

工作项

  • 修改令牌生成检查代码以处理名称冲突

  • 将属性添加到令牌

  • 更新 v3sample 策略文件以匹配

依赖项

测试

除了常规单元测试之外,没有其他内容。

文档影响

对 Identity API 和 configuration.rst 的更改。

参考资料