8.5. Kerberos


红帽构建的 Keycloak 支持通过 Simple and Protected GSSAPI Negotiation Mechanism (SPNEGO)协议使用 Kerberos 票据登录。在用户进行身份验证会话后,SPNEGO 通过 Web 浏览器进行透明验证。对于非 Web 情况,或者登录期间没有票据,红帽构建的 Keycloak 支持使用 Kerberos 用户名和密码登录。

Web 身份验证的典型用例如下:

  1. 用户登录桌面。
  2. 用户使用浏览器访问由红帽构建的 Keycloak 保护的 Web 应用程序。
  3. 应用程序重定向到红帽构建的 Keycloak 登录。
  4. Red Hat build of Keycloak 呈现 HTML 登录屏幕,状态为 401 和 HTTP 标头 WWW-Authenticate: Negotiate
  5. 如果浏览器有来自桌面登录的 Kerberos 票据,浏览器将桌面签名信息传送到标题 Authorization 中的 Keycloak 的红帽构建:Negotiate 'spnego-token'。否则,它会显示标准登录屏幕,用户会输入登录凭证。
  6. 红帽构建的 Keycloak 从浏览器中验证令牌并验证用户。
  7. 如果使用带有 Kerberos 身份验证支持的 LDAPFederationProvider,红帽构建 Keycloak 置备来自 LDAP 的用户数据。如果使用 KerberosFederationProvider,红帽构建的 Keycloak 允许用户更新配置集并预先填充登录数据。
  8. 红帽构建的 Keycloak 返回应用程序。红帽构建的 Keycloak 和应用程序通过 OpenID Connect 或 SAML 信息进行通信。红帽构建的 Keycloak 充当 Kerberos/SPNEGO 登录的代理。因此,红帽通过 Kerberos 验证的 Keycloak 身份验证在应用程序中是隐藏的。
警告

Negotiate www-authenticate 方案允许 NTLM 作为 Kerberos 回退,在 Windows NTLM 中的一些 Web 浏览器中默认支持。如果 www-authenticate 的问题来自浏览器允许列表之外的服务器,用户可能会遇到 NTLM 对话框提示。用户需要点击对话框中的取消按钮继续,因为红帽构建的 Keycloak 不支持这个机制。如果 I intranet Web 浏览器没有被严格配置,或者红帽构建的 Keycloak 为用户在 I intranet 和 Internet 中服务用户时,会出现这种情况。自定义验证器 可用于将 Negotiate 质询限制为主机白名单。

执行以下步骤设置 Kerberos 身份验证:

  1. Kerberos 服务器的设置和配置(KDC)。
  2. 红帽构建的 Keycloak 服务器的设置和配置。
  3. 客户端机器的设置和配置。

8.5.1. Kerberos 服务器的设置

设置 Kerberos 服务器的步骤取决于操作系统(OS)和 Kerberos 供应商。有关设置和配置 Kerberos 服务器的说明,请参阅 Windows Active Directory、MIT Kerberos 和您的操作系统文档。

在设置过程中,执行以下步骤:

  1. 在您的 Kerberos 数据库中添加一些用户主体。您还可以将 Kerberos 与 LDAP 集成,以便从 LDAP 服务器置备用户帐户。
  2. 为 "HTTP" 服务添加服务主体。例如,如果红帽构建的 Keycloak 服务器在 www.mydomain.org 上运行,请添加服务主体 HTTP/www.mydomain.org@<kerberos realm&gt;。

    在 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 客户端。

流程

  1. 安装 Kerberos 客户端。如果您的机器运行 Fedora、Ubuntu 或 RHEL,请安装 freeipa-client 软件包,其中包含 Kerberos 客户端和其他工具。
  2. 配置 Kerberos 客户端(在 Linux 中,配置设置位于 /etc/krb5.conf 文件中)。

    将您的 Kerberos 域添加到配置中,并配置服务器运行的 HTTP 域。

    例如,对于 MYDOMAIN.ORG 域,您可以配置 domain_realm 部分,如下所示:

    [domain_realm]
      .mydomain.org = MYDOMAIN.ORG
      mydomain.org = MYDOMAIN.ORG
  3. 使用 HTTP 主体导出 keytab 文件,并确保该文件可供运行红帽构建的 Keycloak 服务器的进程访问。对于生产环境,请确保此文件只能被此过程读取。

    对于上述 MIT Kerberos 示例,我们将 keytab 导出到 /tmp/http.keytab 文件。如果您的 密钥分发中心(KDC) 和红帽构建的 Keycloak 在同一个主机上运行,则该文件已经可用。

8.5.2.1. 启用 SPNEGO 处理

默认情况下,红帽构建的 Keycloak 禁用 SPNEGO 协议支持。要启用它,请转至 浏览器流 并启用 Kerberos

浏览器流

Browser Flow

禁用的 Kerberos 要求设置为 替代 (Kerberos 是可选的)或 必填 (浏览器必须启用 Kerberos)。如果您还没有将浏览器配置为使用 SPNEGO 或 Kerberos,红帽构建的 Keycloak 会返回常规登录屏幕。

8.5.2.2. 配置 Kerberos 用户存储联邦供应商

现在,您必须使用 User Storage Federation 来配置 Red Hat build of Keycloak 如何解释 Kerberos 票据。有两个不同的联合供应商提供 Kerberos 身份验证支持。

要使用由 LDAP 服务器支持的 Kerberos 进行身份验证,请配置 LDAP Federation Provider

流程

  1. 进入 LDAP 供应商的配置页面。

    LDAP kerberos 集成

    LDAP Kerberos Integration

  2. Allow Kerberos authentication 切换到 ON

允许 Kerberos 身份验证 使红帽构建的 Keycloak 使用 Kerberos 主体访问用户信息,以便信息可以导入到红帽构建的 Keycloak 环境中。

如果 LDAP 服务器没有备份您的 Kerberos 解决方案,请使用 Kerberos 用户存储联邦供应商。

流程

  1. 点菜单中的 User Federation
  2. Add provider select 框中选择 Kerberos

    Kerberos 用户存储供应商

    Kerberos User Storage Provider

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 协议,因此您必须在 OpenID Connect 令牌声明或 SAML 断言属性中将 GSS 凭证传播到您的应用程序。红帽构建的 Keycloak 会从红帽构建的 Keycloak 服务器将其传送到您的应用程序。要将此声明插入到令牌或断言中,每个应用都必须启用内置协议映射器 gss 委派凭据。这个映射程序可在应用程序的客户端页面的 Mappers 选项卡中提供。如需了解更多详细信息 ,请参阅协议映射程序 章节。

在使用应用程序对其他服务发出 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 文件中配置 forwardable Kerberos 票据,并在浏览器中添加对授权凭证的支持。

警告

凭证委托有安全隐患,因此仅在需要且仅使用 HTTPS 时才使用它。有关更多详细信息 和示例,请参阅本文档。

8.5.5. 跨域信任

在 Kerberos 协议中,realm 是一组 Kerberos 主体。这些主体的定义存在于 Kerberos 数据库中,通常是 LDAP 服务器。

Kerberos 协议允许跨域信任。例如,如果存在 2 个 Kerberos 域 A 和 B,则跨域信任将允许 realm A 中的用户访问 realm B 的资源。realm B 信任域 A.

Kerberos 跨域信任

kerberos trust basic

Red Hat build of Keycloak 服务器支持跨域信任。要实现此目标,请执行以下操作:

  • 为跨域信任配置 Kerberos 服务器。此步骤的实现取决于 Kerberos 服务器的实现。此步骤需要将 Kerberos 主体 krbtgt/B@A 添加到 realm A 和 B 的 Kerberos 数据库。这个主体必须在两个 Kerberos 域中具有相同的密钥。主体必须在这两个域中具有相同的密码、密钥版本号和密码。详情请查看 Kerberos 服务器文档。
注意

默认情况下,跨域信任是单向的。您必须将主体 krbtgt/A@B 添加到 Kerberos 数据库中,用于域 A 和 realm B 之间的双向信任。但是,默认情况下,信任是传输的。如果 realm B trusts realm A 和 realm C trusts realm B,则 realm C trusts realm A without the principal, krbtgt/C@A, available.对于 Kerberos 客户端,可能需要其他配置(例如 capaths),以便客户端可以找到信任路径。详情请参考 Kerberos 文档。

  • 配置红帽构建的 Keycloak 服务器

    • 当使用支持 Kerberos 的 LDAP 存储供应商时,为域 B 配置服务器主体,如下例所示: HTTP/mydomain.com@B。如果来自 realm A 的用户成功向 Keycloak 构建进行身份验证,则 LDAP 服务器必须从域 A 查找用户,因为红帽构建的 Keycloak 必须执行 SPNEGO 流,然后查找用户。

查找用户基于 LDAP 存储提供者选项 Kerberos 主体属性。当这与 userPrincipalName 等值配置实例时,在用户 john@A 的 SPNEGO 身份验证后,红帽构建的 Keycloak 将尝试查找具有与 john@A 等效属性 userPrincipalName 的 LDAP 用户。如果 Kerberos 主体属性 留空,则红帽构建的 Keycloak 将根据其 kerberos 主体的前缀查找 LDAP 用户,并省略域。例如,Kerberos 主体用户 john@A 必须在 username john 下的 LDAP 中提供,因此通常位于 LDAP DN 下,如 uid=john,ou=People,dc=example,dc=com。如果您希望来自域 A 和 B 的用户进行身份验证,请确保 LDAP 可从域 A 和 B 中找到用户。

  • 当使用 Kerberos 用户存储提供程序(通常是没有 LDAP 集成的 Kerberos)时,将服务器主体配置为 HTTP/mydomain.com@B,并且来自 Kerberos 域 A 和 B 的用户必须能够进行身份验证。

允许多个 Kerberos 域中的用户进行身份验证,因为每个用户都有属性 KERBEROS_PRINCIPAL 引用用于身份验证的 kerberos 主体,这用于进一步查找此用户。为了避免 kerberos 域 AB 中存在用户 john 冲突,红帽构建的 Keycloak 用户的用户名可能包含 kerberos 域小写。例如,用户名应为 john@a。仅在域与配置的 Kerberos 域 匹配时,可以从生成的用户名中省略 realm 后缀。例如,只要 Kerberos 提供者上配置了 Kerberos 域是 AKerberos 主体 john 为 john。

8.5.6. 故障排除

如果您有问题,请启用额外的日志记录来调试问题:

  • 在 Kerberos 或 LDAP 联邦供应商的 Admin 控制台中启用 Debug 标志
  • 为类别 org.keycloak 启用 TRACE 日志记录,以在服务器日志中接收更多信息
  • 添加系统属性 -Dsun.security.krb5.debug=true-Dsun.security.spnego.debug=true
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.