single-sign-on - SPNEGO SSO 配置中的预身份验证用户有什么用?

标签 single-sign-on kerberos spnego spn

我正在使用 SPNEGO 来实现 SSO 解决方案。在配置过程中,我需要分两步使用域用户凭据:

  1. web.xml我的应用程序:

     <init-param>
          <param-name>spnego.preauth.username</param-name>
          <param-value>myuser</param-value>
     </init-param>
     <init-param>
          <param-name>spnego.preauth.password</param-name>
          <param-value>mypassword</param-value>
     </init-param>
    
  2. setspn命令:setspn -A <mySPN> myuser

当我使用此配置时,Java 应用程序使用 getRemoteUser() 检索用户“myuser”的用户名。所以 SSO 工作得很好。但是当我尝试以其他用户身份(在同一 Windows 服务器上)打开 session 时,它也起作用了,所以我有点困惑。这让我想到了这些问题:

为什么 SSO 对域中的所有其他用户都有效?我必须在 web.xml 和 setspn 命令中使用相同的用户吗?以及选择哪个用户? SPN在Kerberos场景中的具体用途是什么?我是否必须在每台 Windows 计算机上执行命令 setspn 还是有办法只执行一次?

最佳答案

此帐户是 Kerberos 中定义服务器身份的一部分。

Kerberos 是一种对称 key 协议(protocol)。每个用户都有一个在用户和 KDC 之间共享的对称 key ,同样,每个服务(接受者)也有一个在服务和 KDC 之间共享的对称 key 。

当用户请求特定“服务主体”的票证时,KDC 将使用该服务的 key 加密返回它们。因此,为了让服务解密这些 Kerberos 票证,它还需要某种方式来了解与其自己的服务主体关联的 key 。

服务 key 通常是随机生成的,并通过“keytab”文件提供。但是,在 Active Directory 系统中,大多数服务帐户都是具有密码的常规用户帐户 - 因此它们的 key 可以从服务的密码派生。

看来你的SPNEGO模块supports both methods (参见第 150-160 行) – 可以为其提供 key 表密码。

无论如何,该设置与将连接到您的服务的客户端完全无关。它仅建立服务器自己的身份。

What's the exact use of the SPN in the Kerberos scenario?

类似于HTTPS证书中的域名字段。例如,当浏览器对 https://example.com 执行 Kerberos 身份验证时,它将始终从 KDC 请求 SPN HTTP/example.com 的 Kerberos 票证.

如果您熟悉 OAuth2、SAML 或 JWT,我相信 Kerberos SPN 大致相当于 SAML 断言中的“audience”字段或 JWT 中的“aud”字段。

(请注意,浏览器通过其 SPN 来了解您的服务,并不关心在幕后使用的实际服务帐户 - 例如,Active Directory 恰好将 SPN 映射到真实的“在这种情况下,“user”帐户,但其他 Kerberos 实现的做法有所不同)

Do I have to use the same user in both web.xml and setspn command?

是的,它需要是同一个用户,因为服务必须能够解密为其 SPN 颁发的票证,因此它需要知道相同的对称 key 。

And which user to choose?

专为该服务创建一个新的专用帐户。 请勿使用真实的“个人”帐户。

使用长且高度随机的密码,并将其标记为不过期。此外,请确保在帐户选项中启用“帐户支持 Kerberos AES xxx 位”功能(假设您的 Java SPNEGO 事物支持 AES,它确实应该)。

Do I have to execute the command setspn in every windows computer or there is a way to do it just once?

不,在哪里执行它并不重要,因为它只编辑域 Controller 上的实际帐户 - 它不会在本地计算机上留下任何痕迹。 (具体来说,它为所提供的帐户设置 servicePrincipalName LDAP 属性。)

客户端仅通过 SPN 识别您的服务,他们无需了解 KDC 在幕后完成的帐户映射。

关于single-sign-on - SPNEGO SSO 配置中的预身份验证用户有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66901905/

相关文章:

java - 使用 TokenCredentials 的 Exchange Web 服务 (EWS) 单点登录?

java - 为什么我使用 "request.getPrincipal()"来获取经过身份验证的用户?

Azure AD SSO、IDP 发起的登录不起作用

java - 无法从 AD 获取 TGT

spring-mvc - 使用 kerberos/spnego 身份验证的 spring 安全性

http - Web 浏览器 (IE8) 如何确定要为授权 : Negotiate request header? 发送的 token

node.js - 使用 LoopBack 和 Kerberos 的 Node.js 应用程序性能达到峰值

apache - gss_acquire_cred 返回 key 表条目未找到错误

java - 来自 Linux 客户端的请求出现 SPNEGO/Kerberos No credential found 错误