代码之家  ›  专栏  ›  技术社区  ›  rveerd

在Windows和Linux上使用Kerberos的SSO

  •  0
  • rveerd  · 技术社区  · 6 年前

    我们有一个内部开发的基于客户机/服务器的应用程序。客户机和服务器通过TCP/IP连接与特定于应用程序的协议进行通信。客户端运行在Windows上,服务器运行在Linux上。所有计算机都在同一个Active Directory/Kerberos域/领域中。

    当前,用户在启动应用程序时输入用户名和密码。服务器检查用户名和密码(身份验证)。根据用户名,服务器还确定对资源的访问(授权)。

    当然,必须安全地确定当前Windows用户。

    我想出了以下设置:

    1. 我在Windows上使用SSPI(协商),在Linux上使用GSSAPI。
    2. 当客户端连接到服务器时,它使用 AcquireCredentialsHandle (Negotiate) 获取当前Windows用户的凭据。
    3. 客户使用 InitializeSecurityContext (Negotiate) 基于这些凭据生成令牌。
    4. 客户端将令牌发送到服务器。
    5. 服务器使用 gss_acquire_cred() 获取服务的凭据。它们存储在.keytab文件中。
    6. 服务器从客户机接收令牌。
    7. 服务器使用 gss_accept_sec_context() 处理令牌。此调用还返回“source name”,即客户端的当前Windows用户。
    8. 服务器使用“源名称”作为用户名:服务器不执行其他身份验证。服务器仍然执行授权。

    这是可行的,但我确实有一些问题:

    1. 这安全吗?它 不应该
    2. 我应该执行其他检查来验证用户名吗?
    3. 在此设置中是否有其他实现SSO的方法?他们的优缺点是什么?
    0 回复  |  直到 6 年前
        1
  •  1
  •   John B    6 年前

    您在这里描述的是验证用户身份的正确方法。您不必担心用户指定不同的名称;这就是Kerberos为您提供的服务。

    如果客户机能够获得服务票证,那么他们必须能够针对KDC(activedirectory)进行身份验证。KDC创建一个包含用户名的服务票证,并用服务的密钥对其进行加密。

    客户端将无法使用假名为服务器创建票证,因为它没有加密票证所需的密钥。

    它的工作原理有一个相当详细的解释 here .