允许通过信任进行重新委托

bp trusts-redelegation

为信任添加支持,以便信任的消费者之间(受托人,对于当前预期的用例而言是服务)可以进行重新委托。

问题描述

Heat 使用信任来使服务能够在 Heat 堆栈生命周期内的延迟操作期间代表用户执行操作,例如,在响应自动伸缩事件时创建新的实例。

使用方式如下

  1. 用户(信任委托人)创建一个 Heat 堆栈。

  2. Heat 在信任委托人和 Heat 服务用户(受托人)之间创建一个信任。

  3. 在堆栈完成后的某个时间点,Heat 使用信任来模拟信任委托人,通常是为了执行某些延迟任务。

如果创建 Heat 堆栈的请求来自另一个也使用信任的服务,则会产生一个问题,因为请求中的令牌将限定于一个信任,因此将无法执行步骤 (2) 中创建信任的操作。

此用例的主要目的是 Solum,它希望以类似于 Heat 的方式使用信任,通过信任执行延迟操作,这些操作可能包括创建 Heat 堆栈,从而需要创建允许从信任范围令牌进行重新委托的信任。

另一个潜在的用例是,当 Heat 使用 Ceilometer 创建警报时,我们希望 Ceilometer 创建一个信任,以便它可以模拟拥有堆栈的用户,在向 Heat 发送异步警报信号时(这可能会触发堆栈的创建,从而创建信任)。

提议的变更

建议 Keystone 信任添加对链式委托的可选支持,这将使信任能够通过在创建时设置标志来指定允许重新委托。

在创建信任时,可以指定一个新的 allow_redelegation 参数,如果省略该参数,则默认值为 False,这意味着当前默认行为保持不变,即不允许重新委托。

如果 allow_redelegationTrue,则可以显式重新委托信任委托的所有或部分角色,最多可重新委托的次数由与每个信任关联的 redelegation_count 可配置的最大数量,并且每次发生重新委托时都会递增该计数。

因此,以下操作成为可能

  1. Solum 创建 trust1allow_redelegation=Trueredelegation_count0

  2. Solum 使用来自 trust1 的信任范围令牌创建一个 Heat 堆栈

  3. Heat 使用信任范围令牌创建 trust2allow_redelegation=Trueredelegation_count1

  4. Heat 使用来自 trust2 的信任范围令牌创建一个 Ceilometer 警报。

  5. Ceilometer 使用信任范围令牌创建一个信任,redelegation_count 变为 2

提议的变更

  • allow_redelegation 接口添加到 OS-TRUST API 规范。

  • 更新信任实现,将 allow_redelegationredelegation_count 添加到 DB 和内部数据模型。

  • 实现控制器逻辑,该逻辑处理在创建信任时检查 allow_redelegation / redelegation_count

  • 实现链式,以便在父信任被删除或过期时使通过重新委托创建的信任失效。

  • 当信任失效时,所有重新委托的信任也都会失效。

备选方案

  • 考虑过在服务之间传递 OAuth 访问/密钥,但目前已不再考虑,因为没有非全局的方法可以禁用 accesskey 过期。

  • 迁移到一种模型,其中一个信任可以有多个受托人用户(例如,多个服务可以消耗相同的信任)。

数据模型影响

一个新数据库列和一个表示信任的数据结构中的项目,类似于在 Icehouse 期间添加的“remaining_uses”。

REST API 影响

一个表示信任的字典中的一个新的可选项目,allow_redelegation

通过在控制器内部将其默认设置为零(如果用户未传递该参数)来保持向后兼容性。

安全影响

没有其他影响,除了允许在当前不允许重新委托的情况下进行显式重新委托。

为了限制重新委托的最大次数,将有一个新的全局配置选项 max_redelegation_count,默认设置为一个较小的数字(例如 3)。

如果 redelegation_count 在创建信任时大于 max_redelegation_count,则请求将被拒绝。

通知影响

其他最终用户影响

目前预计这主要对使用信任的层叠服务有用,但其他用例可能包括支持用户之间重新委托的工作流程。

但这不会对最终用户产生实际影响,因为默认行为没有改变。

性能影响

对信任创建上递减计数器的额外逻辑的性能惩罚应该可以忽略不计。

其他部署者影响

开发人员影响

没有其他影响,除了允许完全解决 bug bug #1317293

实现

负责人

主要负责人

shardy (Steven Hardy)

工作项

  • 更新数据模型以添加 allow_redelegation

  • 实现控制器逻辑以默认/递减 allow_redelegation

  • 实现控制器逻辑以级联到过期/删除

  • 更新 python-keystoneclient 以支持 allow_redelegation

依赖项

没有其他影响,但与修复 Solum/Heat bug #1317293 相关

测试

编写一个新的 tempest 测试会是一个好主意。我将在实现过程中执行此操作,确切的测试项目待定,但可能包括

  • 测试默认值(无重新委托)

  • 测试正 allow_redelegation 并证明当它通过链式创建信任达到零时,重新委托被阻止。

  • 证明重新委托后的范围(项目和角色)与父信任中的相同,并且不可能进行权限升级。

  • 证明删除上的级联失效有效

  • 证明到期上的级联失效有效

文档影响

identity-api 文档需要更新。

参考资料