通过映射规则到期的组成员¶
将联合用户添加到他们从映射规则接收的组中。此成员资格仅由令牌携带,不会持久化到数据库中。成员资格会过期,但当用户使用相同的组进行身份验证时可以续订。
问题描述¶
目前,通过映射到组获得授权的联合用户无法创建信任关系或应用程序凭证。创建将会失败,提示用户没有该角色。这是因为该角色分配仅在他们的令牌持续期间有效,并且不会永久添加到用户。
我们无法使组成员资格具体化,因为如果外部身份提供商中的用户状态发生变化,该用户将拥有这些权限。
该问题已被报告和讨论为 bug 1589993。
提议的变更¶
架构¶
当联合用户通过映射驱动程序进行身份验证时,组 ID 列表将添加到令牌中。我们将把该组成员资格持久化到数据库中。
每次用户通过联合身份验证时,都会重新评估组列表,并且已经存在的(已过期或未过期)成员资格将被续订,并添加新的成员资格。
每个组成员资格都可以单独过期和续订。
到期的组成员资格仅用于通过映射驱动程序的用户组成员资格,不用于其他驱动程序或后端。
用户将允许创建应用程序凭证。但是,在依赖于它们的到期组成员资格过期后,他们将无法使用它们进行身份验证。
成员资格的有效期将取决于用户进行身份验证的身份提供商。在 Keystone 中设置身份提供商时,云管理员将能够在此基础上为每个 idp 配置此设置。
实现¶
将创建一个新的模型 ExpiringUserGroupMembership,并带有相应的 sql 表。
_tablename__ = 'expiring_user_group_membership' user_id = sql.Column(sql.String(64), sql.ForeignKey('user.id'), primary_key=True) group_id = sql.Column(sql.String(64), sql.ForeignKey('group.id'), primary_key=True) idp_id = sql.Column(sql.String(64), sql.ForeignKey('identity_provider.id'), primary_key=True) last_verified = (sql.Date, nullable=False)
last_verified,它将存储用户从身份提供商进行适当成员资格的最后一次身份验证的时间。当用户通过任何其他方式而不是通过身份提供商登录时,该字段将不会更新。
同样,身份提供商模型将扩展到包含一个新的字段 authorization_ttl。这将是默认值,用于现有的身份提供商或在创建新的身份提供商时未指定自定义值的情况。
如果 current_time > last_active + authorization_ttl,则组成员资格将过期,用户将无法使用依赖于它的授权。
API /v3/users/{user_id}/groups 将扩展为返回到期组成员资格及其到期时间。
备选方案¶
与其使组成员资格过期,不如使整个用户失效。如果用户只能来自一个身份提供商,这将产生相同的最终效果。但是,这将阻止进一步的“关联帐户”计划以及用户根据其身份验证方法拥有不同级别的访问权限。
另一种选择是将组成员资格和角色分配持久化到应用程序凭证中,而不是将其添加到用户本身。然后,强制应用程序凭证对象上的到期和续订。这是在与 Keystone 团队和其他利益相关者讨论之前提出的初始建议。
安全影响¶
由于 Keystone 无法访问外部身份提供商以获取用户权限被撤销时的通知,因此用户权限被撤销与组成员资格到期之间将存在滞后。在此期间,他们将能够使用应用程序凭证,但将无法续订它。
通知影响¶
当使用联合身份验证的用户创建到期组成员资格时,将发出通知。在到期组成员资格续订和未续订到期时,也将发出通知。
其他最终用户影响¶
应用程序凭证和信任关系将可供联合用户使用。对 openstackclient 和 Python 客户端的更改。
性能影响¶
通过外部身份提供商进行身份验证将产生额外的负载,因为 Keystone 将自动检查和续订组员资格。
其他部署者影响¶
新的配置选项 default_authorization_ttl。
开发人员影响¶
无
实现¶
Assignee¶
Kristi Nikolla <knikolla>
工作项¶
添加配置选项
扩展数据库模型并编写迁移
扩展 API
编写文档和发行说明
依赖项¶
无
文档影响¶
该功能的新的文档。