keytab如何正常工作?

dor*_*thy 5 java authentication kerberos jaas keytab

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

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

在此输入图像描述

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

setspn -s service1010/mydomain.com serviceaccount1
Run Code Online (Sandbox Code Playgroud)

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

ktab -a serviceprincal1010/server.domain.com@DOMAIN.COM -k mykeytab.keytab
Run Code Online (Sandbox Code Playgroud)

然后带到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;

};
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*Dog 13

你的图表错了.你对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


Wil*_*son 6

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

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

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