keytab如何正常工作?

问题描述 投票:5回答:2

我有一些关于使用keytab进行身份验证的问题,希望这里的人能够帮助我

比如,我有userA谁将使用在端口1010上运行的服务。首先,userA将登录到Active Directory以验证自己。

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

setspn -s service1010/mydomain.com serviceaccount1

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

ktab -a serviceprincal1010/[email protected] -k mykeytab.keytab

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

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

ServicePrincipalLoginContext
{
  com.sun.security.auth.module.Krb5LoginModule required    
  principal=serviceprincal1010/[email protected] 
  doNotPrompt=true useKeyTab=true keyTab=mykeytab.keytab storeKey=true;

};

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

java authentication kerberos jaas keytab
2个回答
11
投票

你的图表错了。你对kerberos的运作方式有一个基本的误解。 (顺便说一句,这很常见)。使用kerberos进行身份验证的服务永远不会与kdc进行通信。它所做的只是使用它的密钥(keytab)来解密用户呈现的blob。

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

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

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

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


6
投票

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

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

短语“可信第三方”指的是TGS,因为服务器(第1方)允许用户(第2方)被认证,因为它间接信任TGS(第3方)。

© www.soinside.com 2019 - 2024. All rights reserved.