搜索

8.5. Kerberos

download PDF

红帽构建的 Keycloak 支持通过 Simple 和 Protected GSSAPI Negotiation Mechanism (SPNEGO)协议登录。在用户验证会话后,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 票据,浏览器会将桌面登录信息传送到标题 授权中的 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 的 Red Hat build 会返回常规登录屏幕。

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

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

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

流程

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

    LDAP kerberos 集成

    LDAP Kerberos Integration

  2. Allow Kerberos 身份验证 切换到 ON

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

如果 LDAP 服务器没有备份您的 Kerberos 解决方案,请使用 Kerberos 用户存储 Federation 提供程序。

流程

  1. 点菜单中的 User Federation
  2. Add provider 选择 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 协议,所以您必须将 GSS 凭证传播到 OpenID Connect 令牌声明或 SAML 断言属性中的应用程序。红帽构建的 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 票据,并在浏览器中添加对授权凭证的支持。

警告

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

8.5.5. 跨域信任

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

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

Kerberos 跨域信任

kerberos trust basic

红帽构建的 Keycloak 服务器支持跨域信任。要实现此功能,请执行以下操作:

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

默认情况下,跨域信任是单向的。您必须将主体 krbtgt/A@B 添加到 Kerberos 数据库中,以实现域 A 和域 B 之间的双向信任。但是,信任默认是传输的。如果 realm B 信任 realm A 和 realm C 信任域 B,则 realm C 信任域 A,且没有主体、krbtgt/C@A,可用。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 主体的前缀,并带有域省略的内容。例如,Kerberos 主体用户 john@A 必须在用户名 john 下的 LDAP 中可用,因此通常位于 LDAP DN 下,如 uid=john,ou=People,dc=example,dc=com。如果您希望域 A 和 B 中的用户进行身份验证,请确保 LDAP 可以从域 A 和 B 中找到用户。

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

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

8.5.6. 故障排除

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

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

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.