我有一些关于使用keytab进行身份验证的问题,希望这里的人能够帮助我
说,我有userA谁将使用在端口1010上运行的服务。首先,userA将登录到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实际上是谁?)。
答案 0 :(得分:11)
你的图表错了。你对kerberos的运作方式有一个基本的误解。 (顺便说一句,这很常见)。使用kerberos进行身份验证的服务永远不会与kdc进行通信。它所做的只是使用它的密钥(keytab)来解密用户呈现的blob。
与KDC谈话的kerberos唯一的部分是客户端或用户端。当它尝试在端口1010访问服务时,它首先向KDC请求该服务的服务票证。这是使用服务的密钥加密的blob,其中包含用户的身份。 (加上一堆其他协议相关的东西)。
如果您在端口1010上的服务中有基于GSS的api,那么您需要做的就是告诉密钥表所在的API,然后询问用户ID在连接上的位置。您永远不需要与外部服务建立任何其他连接。我不熟悉Java API,但是应该只需要一两次调用来验证用户凭据。
虽然此对话框与当前使用的Kerberos版本并不完全匹配,但它可以帮助您了解基本原理。
答案 1 :(得分:6)
要理解这一点,您必须了解Kerberos的基本原理,这是一个“可信赖的第三方”安全系统。
您的服务器将收到一个“令牌”,票证授予服务(TGS;基本上是Windows域控制器)已使用服务器的密钥加密,该密钥是密钥表文件中存在的密钥。当然,服务器需要访问该密钥才能解密。如果解密成功,这是服务器保证令牌是可信的,因为秘密密钥只有TGS和服务器知道 - 这是这两方共享的秘密。
短语“受信任的第三方”是指TGS,因为服务器(第1方)允许用户(第2方)进行身份验证,因为它间接信任TGS(第3方)。