当前位置: 首页 > 知识库问答 >
问题:

在Windows和Linux上使用Kerberos的SSO

能可人
2023-03-14

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

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

我们希望向应用程序添加单点登录(SSO)功能。也就是说,我们不希望用户输入用户名和密码,但希望以当前Windows用户身份自动登录。

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

我想出了以下设置:

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

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

  1. 这安全吗?客户端不能指定客户端进程的Windows用户以外的任何其他用户名。如果一个用户拥有作为另一个用户(合法或非法)创建进程的凭据,则不允许这样做
  2. 我是否应该执行其他检查以验证用户名
  3. 在此设置中是否有其他实现SSO的方法?他们的优缺点是什么

共有1个答案

濮赤岩
2023-03-14

您在这里描述的是验证用户的正确方法。您不必担心用户指定不同的名称;这就是Kerberos为您处理的事情。

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

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

当然,这一切都假设您已正确设置了所有内容;例如,客户端不应访问服务的keytab文件,并且服务的key tab中不应有任何主体,除了它自己的主体。

这里有一个非常详细的解释它是如何工作的。

 类似资料:
  • 问题内容: 我正在尝试连接到在Cloudera上运行的HDFS实例。我的第一个步骤启用Kerberos和创建Keytabs(如图所示这里)。 在下一步中,我想使用密钥表进行身份验证。 它失败并显示以下错误 java.io.IOException:从keytab /etc/hadoop/conf/hdfs.keytab登录hdfs @ CLOUDERA失败:javax.security.auth.l

  • 我一直在尝试在Windows上获取curl版本7.63以连接到HTTP/2 REST api并使用Windows身份验证。 RESTendpoint设置为进行“协商”,并在“加入域”的windows服务器上运行。因此,它将从Windows DC KDC获得kerberos委派。 这一切都可以在http/1.1中工作,但如果我尝试强制curl使用http/2,它将恢复为http/1.1 当我使用“基

  • 问题内容: 我最近开始在同一台PC上使用Windows和Linux- 它们安装在两个不同的分区中,第三个分区包含公用数据和存档。从Windows创建的virtualenvs使用文件夹“ Scripts”创建,而Linux中的对应文件是文件夹“ bin”。 这里的问题是这些文件夹中的文件不适用于两个操作系统。例如,bin(在Linux中创建)中包含的“激活”不在Windows中运行,另一方面,在Wi

  • 问题内容: 我在生成允许分别使用gcc和MinGW在Linux和Windows中构建共享库的构建设置时遇到了麻烦。在Linux中,共享库不必在编译时就解决所有依赖关系。相反,在Windows中似乎是这种情况。这是问题设置: 现在,在Linux中,它可以编译并正常运行: 在Windows中,我们需要更改为dll,这是次要的事情: 但是,当我们尝试构建时,会出现以下错误: 现在,我们可以通过简单地将f

  • 问题内容: 如何确定该路径: 在linux和Windows上都能工作吗? 问题答案: 在Linux中,路径分隔符为。在Windows中,它是或。因此,只要使用正斜杠就可以了。

  • 我是JBoss新手,被指派了一项任务,使用Kerberos在Windows服务器上实现SSO(JBoss EAP 7)。 尝试过谷歌,但结果很混乱。 你能分享一些完成任务的详细步骤吗。