使用 OpenID Connect 配置 Elastic Stack 的单点登录
编辑使用 OpenID Connect 配置 Elastic Stack 的单点登录编辑
Elastic Stack 支持使用 OpenID Connect 通过 Kibana 进行单点登录 (SSO),使用 Elasticsearch 作为保存大部分功能的后端服务。Kibana 和 Elasticsearch 共同代表一个 OpenID Connect 依赖方 (RP),支持 OpenID Connect 规范中定义的授权代码流和隐式流。
本指南假设您有一个 OpenID Connect 提供程序,将在其中注册 Elastic Stack 依赖方。
Kibana 中的 OpenID Connect 领域支持旨在将其作为该 Kibana 实例用户的首选身份验证方法。《配置 Kibana》部分介绍了这意味着什么,以及如何在必要时设置它以支持其他领域。
OpenID Connect 提供程序编辑
OpenID Connect 提供程序 (OP) 是 OpenID Connect 中负责对用户进行身份验证并授予必要令牌的实体,这些令牌包含依赖方要使用的身份验证和用户信息。
为了使 Elastic Stack 能够使用您的 OpenID Connect 提供程序进行身份验证,需要在 OP 和 RP 之间建立信任关系。在 OpenID Connect 提供程序中,这意味着将 RP 注册为客户端。OpenID Connect 定义了一个动态客户端注册协议,但这通常面向实时客户端注册,而不是跨安全域单点登录的信任建立过程。所有 OP 还允许通过用户界面或(较少情况下)通过使用元数据文档来手动注册 RP 作为客户端。
注册 Elastic Stack RP 的过程因 OP 而异,遵循提供程序的相关文档是谨慎的做法。您通常需要为注册提供的 RP 信息如下:
-
依赖方名称
:依赖方的任意标识符。规范和 Elastic Stack 实现都没有对此值施加任何约束。 -
重定向 URI
:这是 OP 在身份验证后将用户浏览器重定向到的 URI。此值的适当值取决于您的设置以及 Kibana 是否位于代理或负载均衡器之后。它通常是${kibana-url}/api/security/oidc/callback
(对于授权代码流)或${kibana-url}/api/security/oidc/implicit
(对于隐式流),其中 *${kibana-url}* 是 Kibana 实例的基本 URL。您可能还会看到它被称为回调 URI
。
在注册过程结束时,OP 将为 RP(Elastic Stack)分配一个客户端标识符和一个客户端密钥以供使用。请记下这两个值,因为它们将在 Elasticsearch 配置中使用。
为 OpenID Connect 身份验证配置 Elasticsearch编辑
以下是启用 Elasticsearch 中使用 OpenID Connect 进行身份验证所需的配置步骤摘要:
为 HTTP 启用 TLS编辑
如果您的 Elasticsearch 集群在生产模式下运行,则必须先将 HTTP 接口配置为使用 SSL/TLS,然后才能启用 OpenID Connect 身份验证。
有关更多信息,请参阅《加密 Elasticsearch 的 HTTP 客户端通信》。
启用令牌服务编辑
Elasticsearch OpenID Connect 实现使用 Elasticsearch 令牌服务。如果您在 HTTP 接口上配置了 TLS,则会自动启用此服务,并且可以通过在 elasticsearch.yml
文件中包含以下内容来显式配置它:
xpack.security.authc.token.enabled: true
创建 OpenID Connect 领域编辑
通过在 Elasticsearch 的身份验证链中配置适当的领域来启用基于 OpenID Connect 的身份验证。
此领域有一些强制设置和许多可选设置。可用的设置在《OpenID Connect 领域设置》中有详细说明。本指南将探讨最常见的设置。
在您的 elasticsearch.yml
文件中创建一个 OpenID Connect(领域类型为 oidc
)领域,类似于以下所示:
下面使用的值只是一个示例,并非适用于所有用例。配置代码段下面的详细信息提供了一些见解和建议,可帮助您根据 OP 配置选择适当的值。
xpack.security.authc.realms.oidc.oidc1: order: 2 rp.client_id: "the_client_id" rp.response_type: code rp.redirect_uri: "https://kibana.example.org:5601/api/security/oidc/callback" op.issuer: "https://op.example.org" op.authorization_endpoint: "https://op.example.org/oauth2/v1/authorize" op.token_endpoint: "https://op.example.org/oauth2/v1/token" op.jwkset_path: oidc/jwkset.json op.userinfo_endpoint: "https://op.example.org/oauth2/v1/userinfo" op.endsession_endpoint: "https://op.example.org/oauth2/v1/logout" rp.post_logout_redirect_uri: "https://kibana.example.org:5601/security/logged_out" claims.principal: sub claims.groups: "http://example.info/claims/groups"
上面示例中使用的配置值为:
- xpack.security.authc.realms.oidc.oidc1
- 这定义了一个名为“oidc1”的新
oidc
身份验证领域。有关领域的更多说明,请参阅《领域》。 - order
- 您应该在身份验证链中的每个领域上定义唯一的顺序。建议将 OpenID Connect 领域放在身份验证链的底部(即,它具有*最高*顺序)。
- rp.client_id
- 这个通常不透明的任意字符串是 OP 在注册时分配给 Elastic Stack RP 的客户端标识符。
- rp.response_type
-
这是一个标识符,用于控制此 RP 支持哪个 OpenID Connect 身份验证流,以及此 RP 请求 OP 应遵循哪个流。支持的值为:
-
code
,这意味着 RP 想要使用授权代码流。如果您的 OP 支持授权代码流,则应选择此选项而不是隐式流。 -
id_token token
,这意味着 RP 想要使用隐式流,并且我们还从 OP 请求一个 oAuth2 访问令牌,我们可能会将其用于后续请求(UserInfo)。如果 OP 在其配置中提供了 UserInfo 端点,或者您知道角色映射所需使用的声明在 ID 令牌中不可用,则应选择此选项。 -
id_token
,这意味着 RP 想要使用隐式流,但对同时获取 oAuth2 令牌不感兴趣。如果您确定所有必要的声明都将包含在 ID 令牌中,或者 OP 没有提供用户信息端点,请选择此选项。
-
- rp.redirect_uri
- OP 在身份验证后将重定向浏览器到的重定向 URI。这需要与在 OP 注册时配置的完全相同,通常为
${kibana-url}/api/security/oidc/callback
,其中 *${kibana-url}* 是 Kibana 实例的基本 URL。 - op.issuer
- OpenID Connect 提供程序的可验证标识符。颁发者标识符通常是区分大小写的 URL。此设置的值应由您的 OpenID Connect 提供程序提供。
- op.authorization_endpoint
- OP 中授权端点的 URL。这是用户浏览器将被重定向到以启动身份验证过程的位置。此设置的值应由您的 OpenID Connect 提供程序提供。
- op.token_endpoint
- OpenID Connect 提供程序中令牌端点的 URL。这是 Elasticsearch 将发送请求以将代码交换为 ID 令牌的端点。当您使用隐式流时,此设置是可选的。此设置的值应由您的 OpenID Connect 提供程序提供。
- op.jwkset_path
- 包含 JSON Web 密钥集的文件或 URL 的路径,该密钥集包含 OpenID Connect 提供程序用于对令牌和声明响应进行签名的密钥材料。如果设置了路径,则相对于 Elasticsearch 配置目录解析该路径。Elasticsearch 将自动监视此文件的更改,并在更新时重新加载配置。您的 OpenID Connect 提供程序应为您提供此文件或其可用的 URL。
- op.userinfo_endpoint
- (可选)OpenID Connect 提供程序中 UserInfo 端点的 URL。如果需要,可以查询 OP 的此端点以获取更多用户信息。此设置的值应由您的 OpenID Connect 提供程序提供。
- op.endsession_endpoint
- (可选)OpenID Connect 提供程序中结束会话端点的 URL。如果该领域配置为 RP 发起的单点注销并且 OP 支持,则这是在本地注销后用户浏览器将被重定向到的端点。此设置的值应由您的 OpenID Connect 提供程序提供。
- rp.post_logout_redirect_uri
- (可选)OpenID Connect 提供程序在成功进行单点注销后应将用户重定向到的重定向 URL(假设还设置了上面的
op.endsession_endpoint
)。这应该设置为不会触发新的 OpenID Connect 身份验证的值,例如${kibana-url}/security/logged_out
或${kibana-url}/login?msg=LOGGED_OUT
,其中 *${kibana-url}* 是 Kibana 实例的基本 URL。 - claims.principal
- 请参阅《声明映射》。
- claims.groups
- 请参阅《声明映射》。
OpenID Connect 领域的最后一步配置是设置在 OP 注册期间分配给 RP 的 客户端密钥
。这是一个安全设置,因此未在 elasticsearch.yml
的领域配置中定义,而是添加到elasticsearch 密钥库中。例如:
bin/elasticsearch-keystore add xpack.security.authc.realms.oidc.oidc1.rp.client_secret
对 client_secret
的更改需要重新启动 Elasticsearch 节点才能生效。
根据 OpenID Connect 规范,OP 还应在其众所周知的 URL 上提供其配置,该 URL 是其 颁发者
值与 .well-known/openid-configuration
字符串的串联。例如:https://op.org.com/.well-known/openid-configuration
该文档应包含在 Elasticsearch 中配置 OpenID Connect 领域所需的所有必要信息。
声明映射编辑
声明和范围编辑
当使用 OpenID Connect 向 Kibana 进行身份验证时,OP 将以 OpenID Connect Claims 的形式提供有关用户的信息,这些信息可以包含在 ID 令牌中,也可以从 OP 的 UserInfo 端点检索。声明被定义为 OP 为已认证用户断言的一条信息。简而言之,声明是一个包含用户信息的名称/值对。与声明相关,我们还有 OpenID Connect Scopes 的概念。范围是用于请求访问特定声明列表的标识符。该标准定义了一组可以请求的范围标识符。唯一强制性的是 openid
,而常用的则是 profile
和 email
。profile
范围请求访问 name
、family_name
、given_name
、middle_name
、nickname
、preferred_username
、profile
、picture
、website
、gender
、birthdate
、zoneinfo
、locale
和 updated_at
声明。email
范围请求访问 email
和 email_verified
声明。该过程是 RP 在身份验证请求期间请求特定的范围。如果 OP 隐私政策允许并且进行身份验证的用户同意,则相关声明将返回给 RP(在 ID 令牌中或作为 UserInfo 响应)。
支持的声明列表将根据您使用的 OP 而有所不同,但您可以预期 标准声明 在很大程度上得到支持。
将声明映射到用户属性编辑
声明映射的目标是以能够将指定的返回声明的值映射到 Elasticsearch 支持的 用户属性 之一的方式配置 Elasticsearch。然后,这些用户属性用于在 Kibana UI 或审计日志中标识用户,并且还可以用于创建 角色映射 规则。
配置 OpenID 声明映射的建议步骤如下
- 查阅您的 OP 配置,以查看它可能支持哪些声明。请注意,OP 的元数据或 OP 的配置页面中提供的列表是潜在支持的声明的列表。但是,出于隐私原因,它可能不是完整的列表,或者并非所有支持的声明都可供所有经过身份验证的用户使用。
- 通读 Elasticsearch 支持的 用户属性 列表,并确定哪些对您有用,并且可以由您的 OP 以声明的形式提供。至少需要
principal
用户属性。 -
将您的 OP 配置为将这些声明“发布”到您的 Elastic Stack 依赖方。此过程因提供程序而异。您可以使用静态配置,而其他配置将支持 RP 请求与要在身份验证时“发布”的声明相对应的范围。有关如何配置要请求的范围的详细信息,请参阅
rp.requested_scopes
。为了确保互操作性并最大程度地减少错误,您应该只请求 OP 支持的范围,以及您打算映射到 Elasticsearch 用户属性的范围。NOTE: You can only map claims with values that are strings, numbers, boolean values or an array of the aforementioned.
-
在 Elasticsearch 中配置 OpenID Connect 领域,以将 Elasticsearch 用户属性(请参阅下面的 列表)与您的 OP 将发布的声明的名称相关联。在上面的示例中,我们配置了
principal
和groups
用户属性,如下所示-
claims.principal: sub
:这指示 Elasticsearch 在 OP 为用户颁发的 ID 令牌(或 UserInfo 响应中)中查找名为sub
的 OpenID Connect 声明,并将此声明的值分配给principal
用户属性。sub
是 OP 中用户标识符的常用声明,它也是 ID 令牌的必需声明,因此可以保证它可用。但是,它在这里仅用作示例,OP 可能会提供更适合您需求的其他声明。 -
claims.groups: "http://example.info/claims/groups"
:类似地,这指示 Elasticsearch 在 ID 令牌或 UserInfo 响应中查找名称为http://example.info/claims/groups
的声明(请注意,这是一个 URI - 标识符,被视为字符串,而不是指向将被检索的位置的 URL),并将它的值映射到 Elasticsearch 中的用户属性groups
。规范中没有用于在 OP 中表达已认证用户的角色或组成员身份的标准声明,因此应在此处映射的声明名称在不同提供程序之间会有很大差异。有关更多详细信息,请查阅您的 OP 文档。
-
Elasticsearch 用户属性编辑
可以将 Elasticsearch OpenID Connect 领域配置为将 OpenID Connect 声明映射到已认证用户的以下属性
- principal
-
(必需)这是将应用于针对此领域进行身份验证的用户的用户名。
principal
出现在 Elasticsearch 审计日志等位置。
如果 principal 属性无法从声明中映射,则身份验证失败。
- groups
-
(推荐)如果您希望使用 OP 的组或角色概念作为用户 Elasticsearch 权限的基础,则应使用此属性映射它们。
groups
直接传递到您的 角色映射规则。 - name
- (可选)用户的全名。
- (可选)用户的电子邮件地址。
- dn
- (可选)用户的 X.500 专有名称。
从 OpenID Connect 声明中提取部分值编辑
在某些情况下,声明的值可能包含比您希望在 Elasticsearch 中使用的信息更多。一个常见的例子是 OP 仅使用电子邮件地址,但您希望用户的 principal
使用电子邮件地址的*本地名称*部分。例如,如果他们的电子邮件地址是 [email protected]
,那么您希望他们的 principal 只是 james.wong
。
这可以使用 Elasticsearch 领域中的 claim_patterns
设置来实现,如下面的领域配置所示
xpack.security.authc.realms.oidc.oidc1: order: 2 rp.client_id: "the_client_id" rp.response_type: code rp.redirect_uri: "https://kibana.example.org:5601/api/security/oidc/callback" op.authorization_endpoint: "https://op.example.org/oauth2/v1/authorize" op.token_endpoint: "https://op.example.org/oauth2/v1/token" op.userinfo_endpoint: "https://op.example.org/oauth2/v1/userinfo" op.endsession_endpoint: "https://op.example.org/oauth2/v1/logout" op.issuer: "https://op.example.org" op.jwkset_path: oidc/jwkset.json claims.principal: email_verified claim_patterns.principal: "^([^@]+)@staff\\.example\\.com$"
在这种情况下,用户的 principal
从 email_verified
声明映射,但在将其分配给用户之前,会对该值应用正则表达式。如果正则表达式匹配,则使用第一个组的结果作为有效值。如果正则表达式不匹配,则声明映射失败。
在此示例中,电子邮件地址必须属于 staff.example.com
域,然后使用本地部分(@
之前的任何内容)作为 principal。任何尝试使用其他电子邮件域登录的用户都将失败,因为正则表达式与其电子邮件地址不匹配,因此他们的 principal 用户属性(这是必需的)将不会被填充。
这些正则表达式中的小错误可能会导致严重的安全后果。例如,如果我们不小心从上面的示例中遗漏了尾随的 $
,那么我们将匹配域以 staff.example.com
开头的任何电子邮件地址,这将接受诸如 [email protected]
之类的电子邮件地址。确保您的正则表达式尽可能精确非常重要,这样您就不会无意中为用户冒充攻击打开了大门。
第三方发起的单点登录编辑
Elasticsearch 中的 Open ID Connect 领域支持 相关规范 中所述的第三方发起的登录。
这允许 OP 本身或 RP 以外的其他第三方启动身份验证过程,同时请求将 OP 用于身份验证。请注意,Elastic Stack RP 应该已经为此 OP 配置,以便此过程成功。
OpenID Connect 注销编辑
Elasticsearch 中的 OpenID Connect 领域支持 规范的相关部分 中所述的 RP 发起的注销功能
在此过程中,OpenID Connect RP(在本例中为 Elastic Stack)将在成功完成本地注销后,将用户的浏览器重定向到 OP 的预定义 URL。然后,OP 也可以根据配置注销用户,最后应该将用户重定向回 RP。领域配置中的 op.endsession_endpoint
确定浏览器将被重定向到的 OP 中的 URL。rp.post_logout_redirect_uri
设置确定在 OP 注销用户后将用户重定向到的 URL。
配置 rp.post_logout_redirect_uri
时,应注意不要将其指向会触发用户重新身份验证的 URL。例如,当使用 OpenID Connect 支持 Kibana 的单点登录时,可以将其设置为 ${kibana-url}/security/logged_out
(这将向用户显示一条用户友好的消息)或 ${kibana-url}/login?msg=LOGGED_OUT
(这会将用户带到 Kibana 中的登录选择器)。
OpenID Connect 领域 SSL 配置编辑
OpenID Connect 依赖于 TLS 来提供安全属性,例如传输中加密和端点身份验证。RP 需要与 OP 建立反向通道通信,以便在授权码授予流程中交换代码以获取 ID 令牌,并从 UserInfo 端点获取其他用户信息。此外,如果您将 op.jwks_path
配置为 URL,则 Elasticsearch 将需要从托管在那里的文件中获取 OP 的签名密钥。因此,Elasticsearch 能够验证和信任 OP 用于 TLS 的服务器证书非常重要。由于系统信任库用于传出 https 连接的客户端上下文,因此如果您的 OP 使用来自受信任 CA 的证书,则无需进行其他配置。
但是,如果运行 Elasticsearch 的 JVM 不信任 OP 证书的颁发者(例如,它使用组织 CA),则必须将 Elasticsearch 配置为信任该 CA。假设您拥有已签署 OP 用于 TLS 的证书的 CA 证书,该证书存储在 Elasticsearch 配置目录中的 /oidc/company-ca.pem` 文件中,则需要在领域配置中设置以下属性
xpack.security.authc.realms.oidc.oidc1: order: 1 ... ssl.certificate_authorities: ["/oidc/company-ca.pem"]
配置角色映射编辑
当用户使用 OpenID Connect 进行身份验证时,他们会被标识到 Elastic Stack,但这不会自动授予他们执行任何操作或访问任何数据的权限。
在分配角色之前,您的 OpenID Connect 用户无法执行任何操作。这可以通过 添加角色映射 API 或使用 授权领域 来完成。
您不能使用 角色映射文件 向通过 OpenID Connect 进行身份验证的用户授予角色。
这是一个简单的角色映射示例,该映射将 example_role
角色授予针对 oidc1
OpenID Connect 领域进行身份验证的任何用户
PUT /_security/role_mapping/oidc-example { "roles": [ "example_role" ], "enabled": true, "rules": { "field": { "realm.name": "oidc1" } } }
通过领域配置映射的用户属性用于处理角色映射规则,这些规则确定授予用户的角色。
提供给角色映射的用户字段从 OpenID Connect 声明派生,如下所示
-
username
:principal
用户属性 -
dn
:dn
用户属性 -
groups
:groups
用户属性 -
metadata
:请参阅 用户元数据
有关更多信息,请参阅 将用户和组映射到角色 和 角色映射。
如果您的 OP 能够通过使用 OpenID 声明向 RP 提供组或角色,则应在 Elasticsearch 领域中将此声明映射到 claims.groups
设置(请参阅 将声明映射到用户属性),然后按照以下示例在角色映射中使用它。
此映射将 Elasticsearch finance_data
角色授予通过 oidc1
领域进行身份验证并具有 finance-team
组成员身份的任何用户。
PUT /_security/role_mapping/oidc-finance { "roles": [ "finance_data" ], "enabled": true, "rules": { "all": [ { "field": { "realm.name": "oidc1" } }, { "field": { "groups": "finance-team" } } ] } }
如果您的用户也存在于 Elasticsearch 可以直接访问的存储库中(例如 LDAP 目录),则可以使用 授权领域 而不是角色映射。
在这种情况下,您需要执行以下步骤
- 在您的 OpenID Connect 领域中,通过配置
claims.principal
设置来分配一个声明作为查找用户 ID。 - 创建一个可以从您的本地存储库(例如
ldap
领域)查找用户的新领域 - 在您的 OpenID Connect 领域中,将
authorization_realms
设置为您在步骤 2 中创建的领域的名称。
用户元数据编辑
默认情况下,通过 OpenID Connect 进行身份验证的用户将具有一些额外的元数据字段。这些字段将包括身份验证响应中提供的每个 OpenID 声明(无论它是否映射到 Elasticsearch 用户属性)。例如,在元数据字段 oidc(claim_name)
中,“claim_name”是声明的名称,因为它包含在 ID 令牌或用户信息响应中。请注意,这些将包括所有与身份验证事件相关的 ID 令牌声明,而不是用户本身。
可以通过在 oidc 领域的设置中添加 populate_user_metadata: false
来禁用此行为。
配置 Kibana编辑
除了标准 Kibana 安全配置之外,Kibana 中的 OpenID Connect 身份验证还需要少量其他设置。Kibana 安全文档 提供了有关您可以应用的可用配置选项的详细信息。
特别是,由于您的 Elasticsearch 节点已配置为在 HTTP 接口上使用 TLS,因此您必须将 Kibana 配置为使用 https
URL 连接到 Elasticsearch,并且您可能需要配置 elasticsearch.ssl.certificateAuthorities
以信任 Elasticsearch 已配置为使用的证书。
Kibana 中的 OpenID Connect 身份验证受 kibana.yml
中以下超时设置的约束
您可能希望根据您的安全要求调整这些超时。
以下是 OpenID Connect 支持所需的其他三个设置
xpack.security.authc.providers: oidc.oidc1: order: 0 realm: "oidc1"
上面示例中使用的配置值为:
-
xpack.security.authc.providers
- 添加
oidc
提供程序以指示 Kibana 使用 OpenID Connect 单点登录作为身份验证方法。这会指示 Kibana 在用户未经身份验证的情况下每次尝试访问 Kibana 中的 URL 时都尝试启动 SSO 流程。如果您还想允许用户使用用户名和密码登录,则还必须启用basic
身份验证提供程序。例如
xpack.security.authc.providers: oidc.oidc1: order: 0 realm: "oidc1" basic.basic1: order: 1
这将允许尚未使用 OpenID Connect 进行身份验证的用户使用 Kibana 登录表单登录。
-
xpack.security.authc.providers.oidc.<provider-name>.realm
- Elasticsearch 中应为此 Kibana 实例处理身份验证的 OpenID Connect 领域的名称。
没有 Kibana 的 OpenID Connect编辑
OpenID Connect 领域旨在允许用户对 Kibana 进行身份验证,因此,上述指南中的大多数部分都假设使用了 Kibana。本节介绍自定义 Web 应用程序如何使用相关的 OpenID Connect REST API 来使用 OpenID Connect 对 Elasticsearch 中的用户进行身份验证。
单点登录领域(例如 OpenID Connect 和 SAML)利用 Elasticsearch 中的令牌服务,原则上将 SAML 或 OpenID Connect 身份验证响应交换为 Elasticsearch 访问令牌和刷新令牌。访问令牌用作后续调用 Elasticsearch 的凭据。刷新令牌使用户能够在当前令牌过期后获取新的 Elasticsearch 访问令牌。
Elasticsearch 令牌服务可以看作是一个最小的 oAuth2 授权服务器,上面提到的访问令牌和刷新令牌是*仅*属于此授权服务器的令牌。它们*仅*由 Elasticsearch 生成和使用,与 OpenID Connect 提供程序颁发的令牌(访问令牌和 ID 令牌)没有任何关系。
向 OpenID Connect 提供程序注册 RP编辑
需要将依赖方(Elasticsearch 和自定义 Web 应用程序)注册为 OpenID Connect 提供程序的客户端。请注意,注册 重定向 URI
时,它必须是自定义 Web 应用程序中的 URL。
OpenID Connect 领域编辑
需要在 Elasticsearch 中创建 OpenID Connect 领域并进行相应配置。请参阅 配置 Elasticsearch 以进行 OpenID Connect 身份验证
用于访问 API 的服务帐户用户编辑
该领域的设定假设需要一个特权实体作为身份验证代理。在这种情况下,自定义 Web 应用程序是处理最终用户身份验证的身份验证代理(更准确地说,是将身份验证“委托”给 OpenID Connect 提供程序)。OpenID Connect API 需要身份验证和已验证用户的必要授权级别。因此,需要创建一个服务帐户用户并为其分配一个具有 manage_oidc
集群权限的角色。身份验证完成后,需要使用 manage_token
集群权限,以便用户可以保持访问权限或随后退出登录。
POST /_security/role/facilitator-role { "cluster" : ["manage_oidc", "manage_token"] }
POST /_security/user/facilitator { "password" : "<somePasswordHere>", "roles" : [ "facilitator-role"] }
处理身份验证流程编辑
在较高的层次上,自定义 Web 应用程序需要执行以下步骤才能使用 OpenID Connect 对用户进行身份验证
-
向
_security/oidc/prepare
发出 HTTP POST 请求,使用 Elasticsearch 配置中的 OpenID Connect 领域名称作为请求正文,以facilitator
用户身份进行身份验证。有关更多详细信息,请参阅OpenID Connect 准备身份验证。POST /_security/oidc/prepare { "realm" : "oidc1" }
- 处理对
/_security/oidc/prepare
的响应。Elasticsearch 的响应将包含 3 个参数:redirect
、state
、nonce
。自定义 Web 应用程序需要将state
和nonce
的值存储在用户的会话中(如果以这种方式持久保存会话信息,则存储在客户端的 Cookie 中或服务器端),并将用户的浏览器重定向到redirect
值中包含的 URL。 -
处理来自 OP 的后续响应。用户使用 OpenID Connect 提供程序成功进行身份验证后,他们将被重定向回回调/重定向 URI。收到此 HTTP GET 请求后,自定义 Web 应用程序需要向
_security/oidc/authenticate
发出 HTTP POST 请求,再次以facilitator
用户身份进行身份验证,并将用户浏览器被重定向到的 URL 作为参数传递,以及之前保存在用户会话中的nonce
和state
的值。如果配置了多个 OpenID Connect 领域,则自定义 Web 应用程序可以指定要用于处理此请求的领域名称,但此参数是可选的。有关更多详细信息,请参阅OpenID Connect 身份验证。POST /_security/oidc/authenticate { "redirect_uri" : "https://oidc-kibana.elastic.co:5603/api/security/oidc/callback?code=jtI3Ntt8v3_XvcLzCFGq&state=4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I", "state" : "4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I", "nonce" : "WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM", "realm" : "oidc1" }
Elasticsearch 将对此进行验证,如果一切正确,将使用访问令牌和刷新令牌进行响应,访问令牌可以用作后续请求的
Bearer
令牌,刷新令牌可以稍后用于刷新给定的访问令牌,如获取令牌中所述。 -
在某些时候,如果需要,自定义 Web 应用程序可以通过使用OIDC 注销 API并将访问令牌和刷新令牌作为参数传递来注销用户。例如
POST /_security/oidc/logout { "token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==", "refresh_token": "vLBPvmAB6KvwvJZr27cS" }
如果相应地配置了领域,则这可能会导致响应中包含一个
redirect
参数,该参数指示需要在 OP 中将用户重定向到何处以完成注销过程。