8.5. Kerberos
红帽构建的 Keycloak 支持通过 Simple 和 Protected GSSAPI Negotiation Mechanism (SPNEGO)协议登录。用户验证会话后,SPNEGO 通过 Web 浏览器进行透明验证。对于非 Web 情况,或者在登录期间没有票据时,红帽构建的 Keycloak 支持使用 Kerberos 用户名和密码登录。
Web 身份验证的典型用例如下:
- 用户登录桌面。
- 用户使用浏览器访问由红帽构建的 Keycloak 保护的 Web 应用程序。
- 应用程序重定向到红帽 Keycloak 登录的构建。
-
Red Hat build of Keycloak 呈现 HTML 登录屏幕,其状态为 401 和 HTTP 标头
WWW-Authenticate: Negotiate
-
如果浏览器有来自桌面登录的 Kerberos 票据,浏览器会将桌面登录信息传送到标题
授权中的 Keycloak 的红帽构建: Negotiate 'spnego-token'
。否则,它将显示标准登录屏幕,用户输入登录凭证。 - 红帽构建的 Keycloak 从浏览器验证令牌并验证用户。
- 如果使用带有 Kerberos 身份验证支持的 LDAPFederationProvider,红帽构建的 Keycloak 会置备来自 LDAP 的用户数据。如果使用 KerberosFederationProvider,红帽构建的 Keycloak 可让用户更新配置集并预先填充登录数据。
- 红帽构建的 Keycloak 返回应用程序。红帽构建的 Keycloak 和应用程序通过 OpenID Connect 或 SAML 消息进行通信。红帽构建的 Keycloak 充当 Kerberos/SPNEGO 登录的代理。因此,红帽通过 Kerberos 进行身份验证的 Keycloak 在应用程序中是隐藏的。
执行以下步骤来设置 Kerberos 身份验证:
- Kerberos 服务器的设置和配置(KDC)。
- 红帽构建的 Keycloak 服务器的设置和配置。
- 客户端机器的设置和配置。
8.5.1. Kerberos 服务器的设置
设置 Kerberos 服务器的步骤取决于操作系统(OS)和 Kerberos 供应商。有关设置和配置 Kerberos 服务器的说明,请参阅 Windows Active Directory、MIT Kerberos 和您的操作系统文档。
在设置过程中,执行以下步骤:
- 在您的 Kerberos 数据库中添加一些用户主体。您还可以将 Kerberos 与 LDAP 集成,以便从 LDAP 服务器调配用户帐户。
为 "HTTP" 服务添加服务主体。例如,如果红帽构建的 Keycloak 服务器在
www.mydomain.org
上运行,请添加服务主体HTTP/www.mydomain.org@<kerberos realm>
;。在 MIT Kerberos 中,您将运行 "kadmin" 会话。在带有 MIT Kerberos 的机器上,您可以使用以下命令:
sudo kadmin.local
然后,通过以下命令添加 HTTP 主体并将其密钥导出到 keytab 文件中,例如:
addprinc -randkey HTTP/www.mydomain.org@MYDOMAIN.ORG ktadd -k /tmp/http.keytab HTTP/www.mydomain.org@MYDOMAIN.ORG
确保运行红帽构建的 Keycloak 的主机上可以访问 keytab 文件 /tmp/http.keytab
。
8.5.2. 设置和配置红帽构建的 Keycloak 服务器
在您的机器上安装 Kerberos 客户端。
流程
- 安装 Kerberos 客户端。如果您的机器运行 Fedora、Ubuntu 或 RHEL,请安装 freeipa-client 软件包,其中包含 Kerberos 客户端和其他实用程序。
配置 Kerberos 客户端(在 Linux 中,配置设置位于 /etc/krb5.conf 文件中)。
将您的 Kerberos 域添加到配置中,并配置服务器运行的 HTTP 域。
例如,对于 MYDOMAIN.ORG 域,您可以配置
domain_realm
部分,如下所示:[domain_realm] .mydomain.org = MYDOMAIN.ORG mydomain.org = MYDOMAIN.ORG
使用 HTTP 主体导出 keytab 文件,并确保该文件可供运行红帽构建的 Keycloak 服务器的进程访问。对于生产环境,请确保仅对此过程可读该文件。
对于以上 MIT Kerberos 示例,我们将 keytab 导出到
/tmp/http.keytab
文件。如果您的 密钥分发中心(KDC) 和红帽构建的 Keycloak 运行在同一主机上运行,则该文件已可用。
8.5.2.1. 启用 SPNEGO 处理
默认情况下,红帽构建的 Keycloak 禁用 SPNEGO 协议支持。要启用它,请转至 浏览器流 并启用 Kerberos。
浏览器流
将 Kerberos 要求从 disabled 设置为 替代 (Kerberos 是可选的)或需要(浏览器必须启用 Kerberos)。如果您还没有将浏览器配置为使用 SPNEGO 或 Kerberos,则 Keycloak 的 Red Hat build 会返回常规登录屏幕。
8.5.2.2. 配置 Kerberos 用户存储联邦供应商
现在,您必须使用 User Storage Federation 来配置红帽构建的 Keycloak 如何解释 Kerberos 票据。Kerberos 身份验证支持提供了两个不同的联邦提供程序。
要通过 LDAP 服务器支持的 Kerberos 进行身份验证,请配置 LDAP Federation Provider。
流程
进入 LDAP 提供程序的配置页面。
LDAP kerberos 集成
- 将 Allow Kerberos 身份验证 切换为 ON
允许 Kerberos 身份验证 使红帽构建 Keycloak 使用 Kerberos 主体访问用户信息,以便信息可以导入到红帽构建的 Keycloak 环境中。
如果 LDAP 服务器没有备份您的 Kerberos 解决方案,请使用 Kerberos 用户存储联邦提供程序。
流程
- 在菜单中点 User Federation。
从 Add provider 复选框中选择 Kerberos。
Kerberos 用户存储供应商
Kerberos 供应商解析 Kerberos 票据以获取简单主体信息,并将信息导入到本地红帽 Keycloak 数据库构建中。用户配置文件信息(如名字、姓氏和电子邮件)没有被调配。
8.5.3. 设置和配置客户端机器
客户端机器必须具有 Kerberos 客户端并设置 krb5.conf
,如上所述。客户端机器还必须在其浏览器中启用 SPNEGO 登录支持。如果您使用 Firefox 浏览器,请参阅为 Kerberos 配置 Firefox。
.mydomain.org
URI 必须位于 network.negotiate-auth.trusted-uris
配置选项中。
在 Windows 域中,客户端不需要调整其配置。Internet Explorer 和 Edge 可以参与 SPNEGO 身份验证。
8.5.4. 凭证委托
Kerberos 支持凭证委托。应用程序可能需要访问 Kerberos 票据,以便它们可以重新使用它与 Kerberos 保护的其他服务交互。因为红帽构建的 Keycloak 服务器处理 SPNEGO 协议,所以您必须将 GSS 凭证传播到 OpenID Connect 令牌声明或 SAML 断言属性中的应用程序。红帽构建的 Keycloak 从红帽构建的 Keycloak 服务器将其传送到您的应用程序。要将此声明插入到令牌或断言中,每个应用程序都必须启用内置协议映射器 gss delegation 凭据
。此 映射程序位于应用程序客户端页面的映射程序 选项卡中。如需了解更多详细信息 ,请参阅协议映射程序 章节。
在使用应用程序对其他服务进行 GSS 调用前,应用程序必须反序列化从红帽构建的 Keycloak 接收的声明。当您将凭证从访问令牌反序列化到 GSSCredential 对象时,请使用传递给 GSSManager.createContext
方法的凭证创建 GSSContext。例如:
// Obtain accessToken in your application. KeycloakPrincipal keycloakPrincipal = (KeycloakPrincipal) servletReq.getUserPrincipal(); AccessToken accessToken = keycloakPrincipal.getKeycloakSecurityContext().getToken(); // Retrieve Kerberos credential from accessToken and deserialize it String serializedGssCredential = (String) accessToken.getOtherClaims(). get(org.keycloak.common.constants.KerberosConstants.GSS_DELEGATION_CREDENTIAL); GSSCredential deserializedGssCredential = org.keycloak.common.util.KerberosSerializationUtils. deserializeCredential(serializedGssCredential); // Create GSSContext to call other Kerberos-secured services GSSContext context = gssManager.createContext(serviceName, krb5Oid, deserializedGssCredential, GSSContext.DEFAULT_LIFETIME);
在 krb5.conf
文件中配置 可
转发的 Kerberos 票据,并将对委托凭证的支持添加到您的浏览器中。
凭据委派具有安全影响,因此仅在需要时且仅对 HTTPS 使用。有关更多详细信息 和示例,请参阅本文档。
8.5.5. 跨域信任
在 Kerberos 协议中 ,域
是一组 Kerberos 主体。这些主体的定义存在于 Kerberos 数据库中,通常是 LDAP 服务器。
Kerberos 协议允许跨域信任。例如,如果 2 个 Kerberos 域 A 和 B 存在,则跨域信任将允许 realm A 中的用户访问域 B 的资源。realm B 信任域 A。
Kerberos 跨域信任
红帽构建的 Keycloak 服务器支持跨域信任。要实现此目的,请执行以下操作:
-
为跨域信任配置 Kerberos 服务器。执行此步骤取决于 Kerberos 服务器实现。此步骤需要将 Kerberos 主体
krbtgt/B@A
添加到 realm A 和 B 的 Kerberos 数据库中。此主体必须在两个 Kerberos 域中具有相同的密钥。主体必须在两个域中具有相同的密码、密钥版本号和密码。有关更多详细信息,请参阅 Kerberos 服务器文档。
默认情况下,跨域信任是单向的。您必须将主体 krbtgt/A@B
添加到 Kerberos 数据库中,以便在域 A 和 realm B 之间双向信任。但是,信任默认是传输的。如果 realm B 信任域 A 和 realm C 信任域 B,则域 C 信任域 A 没有主体 krbtgt/C@A
,可用。Kerberos 客户端上可能需要其他配置(如 capaths
),以便客户端可以找到信任路径。详情请查看 Kerberos 文档。
配置红帽构建的 Keycloak 服务器
-
使用带有 Kerberos 支持的 LDAP 存储供应商时,为 realm B 配置服务器主体,如下例所示:
HTTP/mydomain.com@B
。如果来自 realm A 的用户成功验证到红帽构建的 Keycloak,则 LDAP 服务器必须找到域 A 中的用户,因为红帽构建的 Keycloak 必须执行 SPNEGO 流,然后查找用户。
-
使用带有 Kerberos 支持的 LDAP 存储供应商时,为 realm B 配置服务器主体,如下例所示:
查找用户基于 LDAP 存储供应商选项 Kerberos 主体属性
。当为实例配置了类似 userPrincipalName
的值的实例时,在用户 john@A
的 SPNEGO 身份验证后,红帽构建的 Keycloak 将尝试查找与 john@A
等效属性 userPrincipalName
的 LDAP 用户。如果 Kerberos 主体属性
留空,则 Keycloak 的红帽构建将根据其 kerberos 主体的前缀,并带有域省略的内容。例如,Kerberos 主体用户 john@A
必须在用户名 john
下的 LDAP 中可用,因此通常位于 LDAP DN 下,如 uid=john,ou=People,dc=example,dc=com
。如果您希望来自域 A 和 B 的用户进行身份验证,请确保 LDAP 可以从域 A 和 B 查找用户。
-
在使用 Kerberos 用户存储提供程序(通常是 Kerberos 没有 LDAP 集成的情况下),请将服务器主体配置为
HTTP/mydomain.com@B
,并且 Kerberos 域 A 和 B 的用户必须能够进行身份验证。
支持多个 Kerberos 域中的用户,因为每个用户都有属性 KERBEROS_PRINCIPAL
引用用于身份验证的 kerberos 主体,这用于进一步查找此用户。为了避免在 kerberos 域 A
和 B
中存在用户 john
时冲突,红帽构建的 Keycloak 用户的用户名可能包含 kerberos 域小写。例如,用户名将是 john@a
。仅在 realm 与配置的 Kerberos 域
匹配时,可能会从生成的用户名中省略 realm 后缀。例如,只要 Kerberos 提供程序上配置了 Kerberos 域是 A,即
Kerberos
主体 john
@A
的 john。
8.5.6. 故障排除
如果出现问题,请启用额外的日志记录来调试问题:
-
在 Admin 控制台中为 Kerberos 或 LDAP 联邦提供程序启用
Debug
标志 -
为类别
org.keycloak
启用 TRACE 日志记录,以在服务器日志中接收更多信息 -
添加系统属性
-Dsun.security.krb5.debug=true
和-Dsun.security.spnego.debug=true