OSSN/OSSN-0047
Keystone 不验证身份提供者是否与联合映射匹配
总结
Keystone 的 OS-FEDERATION 扩展未强制身份提供者与联合映射之间的关联。这可能导致来自一个身份提供者的断言或声明被用于本应与另一个身份提供者一起使用的映射,从而导致用户获得他们不应具有的资源访问权限。
受影响的服务 / 软件
Keystone, Juno, Kilo
讨论
Keystone 的 OS-FEDERATION 扩展允许来自受信任身份提供者的一组环境变量用作映射输入,以确定组 membership(最终确定角色分配)。映射规则旨在针对特定的身份提供者,因为不同的身份提供者以不同的形式提供其断言或声明。
在 Keystone 的 Juno 版本中,Keystone 本身没有能力强制来自身份提供者的断言或声明实际上是否正在用于与该身份提供者关联的映射。来自一个受信任身份提供者的恶意用户可以访问与另一个受信任身份提供者关联的 Keystone 联合身份验证 URL。根据断言或声明的内容和映射规则,这可能导致用户获得他们不应访问的资源访问权限。
考虑一个示例部署,其中 Keystone 配置为信任两个身份提供者('idp1' 和 'idp2')。'idp1' 的联合映射可能导致 'devops' 组的用户在特定项目上具有 'admin' 角色。如果一个断言或声明来自 'idp2' 的用户表明他们属于 'devops' 组,并使用与 'idp1' 关联的身份验证 URL,他们也可能会被授予 'admin' 角色,就像他们是来自 'idp1' 的 'devops' 用户一样。不应允许此访问。
建议的操作
即使 Juno 版本的 Keystone 没有能力强制身份提供者和映射匹配,也可以配置用于部署 Keystone 的前端 Web 服务器来执行此强制。Keystone 支持的每个身份提供者都有其自己的身份验证 URL。建议 Web 服务器配置将其底层的联合插件配置为加密地强制身份提供者仅对其关联的身份验证 URL 有效。
例如,SAML 协议使用非对称密钥对对在身份提供者和服务提供者(在本例中为 Keystone)之间传输的请求和响应进行签名。当将 Apache HTTPD 作为 Keystone 的 Web 服务器时,可以为每个联合身份验证 URL 使用单独的 'Location' 指令。定义处理 SAML 协议的底层 HTTPD 模块的身份提供者证书的指令可以在身份提供者特定的 'Location' 指令中定义。这将确保来自一个受信任身份提供者的签名 SAML 断言仅在使用适当的身份验证 URL 时才能成功验证。
这是一个使用 mod_auth_mellon HTTPD 模块的示例
<Location /v3/OS-FEDERATION/identity_providers/idp1/protocols/saml2/auth> AuthType "Mellon" MellonEnable "auth" ... MellonIdPMetadataFile /etc/httpd/mellon/idp1-metadata.xml MellonEndpointPath /v3/OS-FEDERATION/identity_providers/idp1/protocols/saml2/auth/mellon </Location> <Location /v3/OS-FEDERATION/identity_providers/idp2/protocols/saml2/auth> AuthType "Mellon" MellonEnable "auth" ... MellonIdPMetadataFile /etc/httpd/mellon/idp2-metadata.xml MellonEndpointPath /v3/OS-FEDERATION/identity_providers/idp2/protocols/saml2/auth/mellon </Location>
在上面的示例中,我们有两个身份提供者('idp1' 和 'idp2')。每个身份提供者都有其自己的 'Location' 指令,并且 'MellonIdPMetadataFile' 指令指向包含身份提供者证书的元数据,该元数据特定于每个 'Location' 指令。此配置不允许来自 'idp1' 的签名断言用于 'idp2' 的身份验证 URL。尝试这样做将被 mod_auth_mellon 拒绝,并且实际上永远不会到达 Keystone 的 OS-FEDERATION 扩展。
建议阅读 Keystone 联合文档以及您用于联合方法的 HTTPD 模块的文档。此文档的一些有用链接在本文档的参考部分中提供。
在 Kilo 版本的 Keystone 中,也可以让 Keystone 强制断言实际上来自与身份验证 URL 关联的身份提供者。这是通过将断言或声明中的身份提供者标识符值与 Keystone 中身份提供者的一部分中存储的标识符进行比较来完成的。
要启用此功能,必须在 keystone.conf 中设置 'remote_id_attribute' 设置,该设置定义包含身份提供者标识符的环境变量。然后,必须将 'remote_id_attribute' 将包含的标识符值作为 Keystone 中关联身份提供者的 'remote_ids' 值之一添加。可以使用 Identity API 直接完成此操作,也可以通过 'openstack' 命令行实用程序完成此操作。
建议使用具有身份提供者特定 'Location' 指令的 Web 服务器配置,如上所述,以及使用 Kilo 版本中的新的 'remote_ids' 检查。
联系方式 / 参考文献
- 作者:Nathan Kinder, Red Hat
- 此 OSSN:https://wiki.openstack.org/wiki/OSSN/OSSN-0047
- 原始 LaunchPad Bug:https://bugs.launchpad.net/keystone/+bug/1390124
- OpenStack Security ML:openstack-security@lists.openstack.org
- OpenStack Security Group:https://launchpad.net/~openstack-ossg
- Keystone Federation Docs:https://docs.openstack.org/developer/keystone/configure_federation.html
- mod_auth_mellon Docs:https://github.com/UNINETT/mod_auth_mellon/wiki
- mod_shib Docs:https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPApacheConfig
- mod_auth_openidc Docs:https://github.com/pingidentity/mod_auth_openidc