IdP ID 注册和验证

bp idp-id-registration

本规范描述了使用 OS-FEDERATION APIs 进行身份验证后更安全的用戶映射。发布身份验证声明的身份提供者 (IdP) 被标识,以避免错误的用戶映射,因此其 ID 必须在 Keystone 中注册并在身份验证请求时进行验证。

问题描述

使用 OS-FEDERATION,可以使用外部身份提供者 (IdPs) 进行用戶身份验证。要进行身份验证的用戶需要访问包含 IdP 名称和协议的特定路径

/OS-FEDERATION/identity_providers/{identity_provider}/protocols/{protocol}/auth

然后,身份验证遵循所选协议所需的步骤,例如,在 SAML 的情况下,用戶将被重定向到 IdP,并且在流程结束时,用戶将使用身份验证声明返回到上述 URL。如果 Keystone 接受它,则声明属性将根据为 IdP 定义的映射进行转换,以识别要返回给用戶的新生成令牌的角色。

用于将声明属性转换为角色的映射取决于 URL,而 URL 与 IdP 密切相关。如果用戶可以向标识 IdP B 的 URL 提供由 IdP A 生成的声明,则属性将根据为 B 定义的映射进行转换。因此,用戶可能会获得为其他 IdP 指定角色的令牌,而 Keystone 无法进行任何控制。

当前,IdP 声明和 URL 之间的对应关系委托给一个 httpd Web 服务器,并利用了用于 SAML 身份验证的 Shibboleth 插件的一些特定功能。其他 SAML 插件或用于其他协议的插件可能不支持此配置。

提议的变更

当 IdP 在 Keystone 中注册时,其 ID(即,在 SAML 协议中,这将是 IdP 的 entity_id)必须与其它信息一起存储,并在身份验证期间用于验证发布声明的 IdP 与 URL 中指定的 IdP 是否匹配。该 ID 将使用一个新的属性提供,名为 remote_ids,并且该属性包含一个 ID 列表。为了保持向后兼容性,该属性应是可选的。

remote_ids 被定义为列表,以允许在 Keystone 中的单个 IdP 中映射多个外部 IdP。这可以简化 IdP 之间的映射共享,从而有利于管理。此用例的一个可能场景是,当 Keystone 需要连接到具有多个 IdP 的联合身份验证系统,并且所有 IdP 共享相同的属性和策略时。在这种情况下,可以管理所有 IdP,而无需在 Keystone 中注册所有 IdP。

由于 Keystone 部署应处理不同的协议和处理协议参数的不同模块,因此 remote_id 值存储的位置需要在 keystone.conf 中动态配置。Keystone 处理的每个协议都必须作为在 [auth] 部分中定义的身份验证方法存在,并且必须定义相应的节。在这样的节中,如果应验证 remote_ids,则应定义一个名为 remote_id_attribute 的参数。

keystone.conf 配置示例

[auth]
methods = saml2,oidc
saml2 = auth.plugins.mapped.Mapped
oidc = auth.plugins.mapped.Mapped

[saml2]
remote_id_attribute = "Shib-Identity-Provider"

[oidc]
remote_id_attribute = "Claim-Identity-Provider"

值得一提的是,在这种特定情况下,saml2oidc 协议也需要注册并绑定到身份提供者。

备选方案

维护当前实现,其中 IdP 和 URL 之间的映射由 Apache 执行,并且跳过 Keystone 中的任何控制。这种方法具有相同的安全级别,但每次添加/删除 IdP 时都需要更改配置。

安全影响

本规范通过引入一个新的检查来验证执行身份验证的 IdP 与身份验证 URL 中指定的 IdP 是否相同,从而提高了 OS-Federation 身份验证 API 的安全性。

通知影响

其他最终用户影响

需要更新 python-keystoneclient,以反映注册 IdP 的新 API。在当前实现中,那里 config 属性 remote_ids 不存在。该属性必须包含在 IdP 的创建/编辑期间。

性能影响

每次需要使用 IdP 进行身份验证时,都会调用新代码。这引入了对环境变量的新检查,但影响相对有限,因为有其他检查来验证来自 IdP 的信息。

其他部署者影响

引入了一个新的配置变量

``remote_id_attribute``

该变量是一个字符串,其值是要查找以获取当前 IdP 的 ID 的属性的名称。默认值为一个空字符串,在这种情况下,新代码不起作用,从而保持 OS-FEDERATION API 的先前行为。

开发人员影响

实现

负责人

主要负责人

  • Marco Fargetta <marco-fargetta>

  • Marek Denis <marek-denis>

工作项

  • 修改 IdP API 以包含新的属性 remote_ids

  • 修改 python-keystoneclient 以与修改后的 API 交互

依赖项

文档影响

需要使用拟议的更改更新 OS-Federation 和客户端的 API 文档。

参考资料

正在审查的此规范的部分实现:review 142743