Keystone Federation 介绍¶
什么是 Keystone Federation?¶
身份联合是指跨多个身份管理系统共享身份信息的能力。在 Keystone 中,这被实现为一种身份验证方法,允许用户直接使用另一个身份源进行身份验证,然后将一组用户属性提供给 Keystone。如果您的组织已经拥有主要的身份源,这将非常有用,因为这意味着用户不需要为云环境设置单独的凭据。它也适用于连接多个云环境,因为我们可以将另一个云环境中的 Keystone 用作身份源。使用 将 LDAP 作为身份后端 是 Keystone 从外部源获取身份信息的另一种方式,但它要求 Keystone 直接处理密码,而不是将身份验证卸载到外部源。
Keystone 支持两种联合身份配置模型。最常见的配置是使用 Keystone 作为服务提供商 (SP),使用外部身份提供商,例如 Keycloak 或 Google,作为身份源和身份验证方法。第二种类型的配置是“Keystone 到 Keystone”,其中两个 Keystone 相互链接,一个充当身份源。
本文档讨论涉及次要身份管理作为用户信息的真实来源的身份联合,具体涵盖 SAML2.0 和 OpenID Connect 协议,尽管 Keystone 可以与其他协议一起工作。一个类似的概念是 外部身份验证,其中 Keystone 仍然是其用户的真实来源,但身份验证由外部处理。另一个密切相关的主题是 无令牌身份验证,它使用此处描述的一些相同结构,但允许服务在不使用 Keystone 令牌的情况下验证用户。
词汇表¶
- 服务提供商 (SP)
服务提供商是提供最终用户请求的资源的的服务。在我们的例子中,这是 Keystone,它提供 Keystone 令牌,我们将其用于其他 OpenStack 服务。我们不将其他 OpenStack 服务称为“服务提供商”。 在这种情况下,我们关心的特定服务是令牌服务,因此它是我们的服务提供商。
- 身份提供商 (IdP)
身份提供商是接受凭据、验证凭据并生成是/否响应的服务。它将此响应以及有关用户的其他属性(例如他们的用户名、显示名称以及您配置的服务提供商接受的任何其他详细信息)返回。
- 实体 ID 或远程 ID
实体 ID 或远程 ID 都是服务提供商或身份提供商的唯一标识符字符串。它通常采用 URN 的形式,但 URN 不需要是可解析的 URL。远程 ID 在全局范围内是唯一的。两个身份提供商不能与相同的远程 ID 相关联。Keystone 使用从 HTTPD 环境变量检索到的远程 ID,以将传入请求与受信任的身份提供商匹配,并呈现适当的授权映射。
- SAML2.0
SAML2.0 是一种基于 XML 的联合协议。它通常用于面向内部的组织,例如大学或企业,在这些组织中,IT 服务提供给组织成员。
- OpenID Connect (OpenIDC)
OpenID Connect 是一种基于 JSON 的联合协议,建立在 OAuth 2.0 之上。它更常被公共服务(如 Google)使用。
- 断言
断言是来自身份提供商的格式化声明,声明用户已通过身份验证并提供有关用户的某些属性。身份提供商始终对断言进行签名,通常也会对其进行加密。
- 单点登录 (SSO)
单点登录 是一种与身份联合相关的机制,用户可以登录到其身份管理系统,并获得允许其访问多个服务提供商的令牌或票证。
身份验证流程¶
了解用户在身份验证过程中信息流是能够稍后进行调试的关键。
正常的 Keystone¶

在正常的 Keystone 流程中,用户直接从 Keystone 请求作用域令牌。Keystone 接受他们的凭据并对照其本地存储或其 LDAP 后端进行检查。然后它检查用户请求的作用域,确保他们具有正确的角色分配,并生成一个作用域令牌。用户可以使用作用域令牌在 OpenStack 中执行其他操作,例如请求服务器,但令牌生成之后发生的一切都与本次讨论无关。
SAML2.0¶
SAML2.0 WebSSO¶

此图显示了一个标准的 WebSSO 身份验证流程,不涉及 Keystone。WebSSO 是几个 SAML2.0 配置文件之一。它基于网络浏览器将充当中间媒介的想法,因此流程涉及浏览器可以理解和处理的概念,例如 HTTP 重定向和 HTML 表单。
首先,用户使用其网络浏览器请求服务提供商中的一些安全资源。服务提供商检测到用户尚未通过身份验证,因此生成一个 SAML 请求,对其进行 base64 编码,然后向身份提供商发出 HTTP 重定向。
浏览器遵循重定向并将 SAML 请求呈现给身份提供商。用户将被提示进行身份验证,可能通过在登录页面中填写用户名和密码。身份提供商使用 HTTP 成功响应并生成带有 HTML 表单的 SAML 响应。
浏览器自动将表单 POST 回服务提供商,服务提供商验证 SAML 响应。服务提供商最终发出另一个重定向回到用户最初请求的资源。
SAML2.0 ECP¶

ECP 是另一个 SAML 配置文件。通常,流程与 WebSSO 流程类似,但它专为原生理解 SAML 的客户端而设计,例如 keystoneauth 库(因此也包括 python-openstackclient CLI 工具)。ECP 与基于浏览器的流程略有不同,并非所有 SAML2.0 IdP 都支持它,因此使 WebSSO 正常工作并不一定意味着 ECP 正常工作,反之亦然。通常需要在身份提供商中显式启用 ECP 支持。
Keystone 和 Horizon 上的 WebSSO¶

Keystone 不是一个 Web 前端,这意味着 Horizon 需要处理成为服务提供商的一些部分才能实现 WebSSO。
在上面的图中,添加了 Horizon,并且将 Keystone 和 HTTPD 分开,以区分每个部分负责的部分,尽管通常将两者一起称为服务提供商。
在此模型中,用户通过从下拉菜单中选择联合身份验证方法来请求登录 Horizon。Horizon 会根据所选的身份提供商和协议自动生成一个 Keystone URL,然后将浏览器重定向到 Keystone。该位置等效于 SAML2.0 WebSSO 图中的 /secure 资源。浏览器遵循重定向,HTTPD 模块检测到用户尚未登录,并向身份提供商发出另一个重定向,其中包含 SAML 请求。此时,流程与正常的 WebSSO 模型相同。用户登录到身份提供商,SAML 响应 POST 回服务提供商,HTTPD 模块验证响应并发出重定向回到 Horizon 最初请求的位置,即一个特殊的联合身份验证端点。此时,Keystone 能够授予一个未作用域的令牌,并将其作为另一个 HTML 表单传递。浏览器会将该表单 POST 回 Horizon,从而触发正常的登录过程,选择一个项目进行作用域分配并从 Keystone 获取作用域令牌。
请注意,Horizon 充当中间人,因为它知道它从 Keystone 请求的安全资源的端点。
Keystone 到 Keystone¶

当 Keystone 用作 Keystone 到 Keystone 配置中的身份提供商时,身份验证流程是非标准的。它类似于 IdP 发起的身份验证流程。在这种情况下,用户首先直接转到身份提供商,然后再请求服务提供商的任何资源。用户将从 Keystone 获取令牌,然后使用该令牌通过 ECP 请求 SAML 响应。当收到该响应时,它会将其 POST 到服务提供商,服务提供商将授予令牌。
请注意,服务提供商必须接受来自身份提供商的数据,因此需要有一种信任它的方法。另一方面,身份提供商永远不需要接受来自服务提供商的数据。没有来回,用户只需在一个方面完成身份验证过程,并将结果呈现给另一方。
OpenID Connect¶
OpenID Connect 身份验证流程¶

OpenID Connect 与任何 SAML2.0 流程不同,因为协商不是完全由客户端处理的。服务提供商必须直接向身份提供商发出请求,这意味着如果服务提供商和身份提供商位于隔离的网络中,则此流程不适用。
当用户从服务提供商请求安全资源时,他们将被重定向到身份提供商进行登录。身份提供商然后使用已知的重定向 URI 将用户重定向回服务提供商,并提供授权码。服务提供商必须使用提供的代码直接向身份提供商发出反向通道请求,并将其交换为 ID 令牌。
Keystone 和 Horizon 上的 OpenID Connect¶

从 Horizon 和 Keystone 的角度来看,OpenID Connect 的身份验证流程与 SAML2.0 相同。只有 HTTPD OpenIDC 模块必须按照规范处理流程。