搜索

8.4. Kerberos

download PDF

Red Hat Single Sign-On 支持通过 Simple 和 Protected GSSAPI Negotiation Mechanism (SPNEGO)协议进行 Kerberos 票据登录。SPNEGO 在用户进行身份验证后通过 Web 浏览器进行透明验证。对于非 Web 情况,或在登录过程中无法使用一个 ticket,Red Hat Single Sign-On 支持使用 Kerberos 用户名和密码登录。

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

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

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

  1. Kerberos 服务器的设置和配置。
  2. Red Hat Single Sign-On 服务器的设置和配置。
  3. 客户端机器的设置和配置。

8.4.1. Kerberos 服务器设置

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

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

  1. 在 Kerberos 数据库中添加一些用户主体。您还可以将 Kerberos 与 LDAP 集成,以便从 LDAP 服务器置备用户帐户。
  2. 为 "HTTP" 服务添加服务主体。例如,如果 Red Hat Single Sign-On 服务器在 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

在运行 Red Hat Single Sign-On 的主机上,确保 keytab 文件 /tmp/http.keytab 可访问。

8.4.2. 设置和配置 Red Hat Single Sign-On 服务器

在机器上安装 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 文件,并确保运行 Red Hat Single Sign-On 服务器的进程可以访问该文件。对于生产环境,请确保此文件只可由这个进程读取。

    对于以上 MIT Kerberos 示例,我们将 keytab 导出到 /tmp/http.keytab 文件。如果您的 密钥分发中心(KDC) 和 Red Hat Single Sign-On 在同一主机上运行,则该文件已可用。

8.4.2.1. 启用 SPNEGO 处理

默认情况下,Red Hat Single Sign-On 禁用 SPNEGO 协议支持。要启用它,请转至 浏览器流 并启用 Kerberos

浏览器流

Browser Flow

禁用的 Kerberos 要求设置为 备选 (Kerberos 是可选的)或 必需 (浏览器必须启用 Kerberos)。如果您尚未将浏览器配置为与 SPNEGO 或 Kerberos 一起使用,Red Hat Single Sign-On 将回退到常规登录屏幕。

8.4.2.2. 配置 Kerberos 用户存储联合 providerx

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

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

流程

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

    LDAP kerberos 集成

    LDAP Kerberos Integration

  2. 将允许 Kerberos 身份验证 切换到 ON

允许 Kerberos 身份验证 使 Red Hat Single Sign-On 使用 Kerberos 主体访问用户信息,以便信息可以导入到红帽单点登录环境中。

如果 LDAP 服务器没有备份您的 Kerberos 解决方案,请使用 Kerberos User Storage Federation Provider。

流程

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

    Kerberos 用户存储供应商

    Kerberos User Storage Provider

Kerberos 供应商解析 Kerberos ticket 用于简单主体信息,并将信息导入到本地 Red Hat Single Sign-On 数据库中。用户配置集信息(如名字、姓氏和电子邮件)不会被调配。

8.4.3. 设置和配置客户端机器

客户端机器必须具有 Kerberos 客户端并设置 krb5.conf如上所述。客户端机器必须在其浏览器中启用 SPNEGO 登录支持。如果您使用的是 Firefox 浏览器,请参阅 为 Kerberos 配置 Firefox。

.mydomain.org URI 必须位于 network。协商-auth.trusted-uris 配置选项。

在 Windows 域中,客户端不需要调整其配置。Internet Explorer 和 Edge 已经参与 SPNEGO 身份验证。

8.4.4. 凭证委托

Kerberos 支持凭据委派。应用程序可能需要访问 Kerberos ticket,以便可以重新使用它与 Kerberos 保护的其他服务交互。因为 Red Hat Single Sign-On 服务器处理 SPNEGO 协议,所以您必须将 GSS 凭证传播到 OpenID Connect 令牌声明或 SAML 断言属性中的应用程序。Red Hat Single Sign-On 从 Red Hat Single Sign-On 服务器将其传输到您的应用程序。要将此声明插入到令牌或断言中,每个应用程序都必须启用内置协议映射程序 gss delegation 凭据。此 映射程序 位于应用程序客户端页面的"映射程序"选项卡中。如需了解更多详细信息 ,请参阅协议映射程序 章节。

应用程序必须反序列化它从 Red Hat Single Sign-On 接收的声明,然后才能向其他服务发出 GSS 调用。当您将凭证从访问令牌映射到 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.4.5. 跨域信任

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

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

Kerberos 跨域信任

kerberos trust basic

Red Hat Single Sign-On 服务器支持跨域信任。要做到这一点,请执行以下操作:

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

默认情况下,跨域信任是单向。您必须将主体 krbtgt/A@B 添加到 Kerberos 数据库,以便在域 A 和域 B 之间进行双向信任。但是,默认情况下信任是传输的。如果 realm B 信任域 A 和 realm C 信任域 B,那么 realm C 信任域 A 不使用主体 krbtgt/C@A,可用。Kerberos 客户端中可能需要其他配置(例如 capaths),以便客户端能够找到信任路径。详情请查看 Kerberos 文档。

  • 配置红帽单点登录服务器

    • 当使用带有 Kerberos 支持的 LDAP 存储供应商时,为域 B 配置服务器主体,如下例所示: HTTP/mydomain.com@B。如果域 A 中的用户成功向 Red Hat Single Sign-On 进行身份验证,LDAP 服务器必须查找来自 realm A 的用户,因为红帽单点登录必须执行 SPNEGO 流,然后查找用户。

查找用户基于 LDAP 存储供应商选项 Kerberos 主体属性。当为实例配置了类似 userPrincipalName 的值的实例时,在用户 john@A 的 SPNEGO 身份验证后,Red Hat Single Sign-On 将尝试查找与 john@A 等效属性 userPrincipalName 的 LDAP 用户。如果 Kerberos 主体属性 留空,则 Red Hat Single Sign-On 将根据其 kerberos 主体的前缀并使用域省略来查找 LDAP 用户。例如,Kerberos 主体用户 john@A 必须在用户名 john 下的 LDAP 中可用,因此通常位于 LDAP DN 下,如 uid=john,ou=People,dc=example,dc=com。如果您希望域 A 和 B 中的用户进行身份验证,请确保 LDAP 可以从 realms A 和 B 中查找用户。

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

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

8.4.6. 故障排除

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

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

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.