7

我对使用 keytab 进行身份验证有一些疑问希望这里的好心人能启发我

假设我有用户 A,他将使用在端口 1010 上运行的服务。首先,用户 A 将登录到 Active Directory 以验证自己。

在此处输入图像描述

登录后,userA 将尝试连接到服务器以使用其服务 1010。为了让服务器验证 UserA 是他是谁,我需要使用setspn在 Active Directory 中注册 SPN。例如

setspn -s service1010/mydomain.com serviceaccount1

然后需要在 Active 目录生成 ktab 文件,例如

ktab -a serviceprincal1010/server.domain.com@DOMAIN.COM -k mykeytab.keytab

然后带到mykeytab.keytab服务器上。

在服务器上,我会使用带有登录配置的 JAAS 来查询 KDC,例如

ServicePrincipalLoginContext
{
  com.sun.security.auth.module.Krb5LoginModule required    
  principal=serviceprincal1010/server.domain.com@DOMAIN.COM 
  doNotPrompt=true useKeyTab=true keyTab=mykeytab.keytab storeKey=true;

};

从这一点开始,我很困惑。userA 如何得到验证(即 userA 实际上是他是谁?)。

4

2 回答 2

14

你的图表是错误的。您对 kerberos 的工作原理有一个基本的误解。(顺便说一句,这很常见)。使用 kerberos 进行身份验证的服务永远不会与 kdc 对话。它所做的只是使用它的密钥 (keytab) 来解密用户提供的 blob。

kerberos 中唯一与 KDC 对话的部分是客户端或用户端。当它尝试访问端口 1010 上的服务时,它首先向 KDC 请求该服务的服务票证。这是一个使用服务的密钥加密的 blob,其中包含用户的身份。(加上一堆其他协议相关的东西)。

如果您在端口 1010 上的服务中有一个基于 GSS 的 API,您需要做的就是告诉该 API 密钥表在哪里,然后询问它连接上的用户 ID 是什么。您永远不需要与外部服务建立任何其他连接。我不熟悉 Java API,但应该只需要一两个调用来验证用户凭据。

虽然此对话与当前使用的 Kerberos 版本不完全匹配,但它将帮助您了解基本原则。

http://web.mit.edu/kerberos/dialogue.html

于 2014-08-12T21:11:27.567 回答
7

要理解这一点,您必须了解 Kerberos 的基本原理,这是一个“受信任的第三方”安全系统。

您的服务器将收到一个“令牌”,票证授予服务(TGS;基本上是 Windows 域控制器)使用服务器的密钥加密,该密钥存在于 keytab 文件中。服务器自然需要访问该密钥才能解密。如果解密成功,这是向服务器保证令牌是真实的,因为密钥只有 TGS 和服务器知道——这是双方共享的秘密。

短语“受信任的第 3 方”指的是 TGS,因为服务器(第 1 方)允许对用户(第 2 方)进行身份验证,因为它间接信任 TGS(第 3 方)。

于 2014-08-07T13:02:26.360 回答