我对使用 keytab 进行身份验证有一些疑问,希望这里的好心人可以启发我
假设我有一个用户 A,他将使用在端口 1010 上运行的服务。首先,用户 A 将登录到 Active Directory 来验证自己的身份。
登录后,userA 将尝试连接到服务器以使用其服务 1010。为了让服务器验证 UserA 是谁,我需要使用setspn
在 Active Directory 中注册 SPN。例如
setspn -s service1010/mydomain.com serviceaccount1
然后需要在Active Directory中生成ktab文件,例如
ktab -a serviceprincal1010/[email protected] /cdn-cgi/l/email-protection -k mykeytab.keytab
然后带上mykeytab.keytab
到服务器。
在服务器上,我将使用带有登录配置的 JAAS 来查询 KDC,例如
ServicePrincipalLoginContext
{
com.sun.security.auth.module.Krb5LoginModule required
principal=serviceprincal1010/[email protected] /cdn-cgi/l/email-protection
doNotPrompt=true useKeyTab=true keyTab=mykeytab.keytab storeKey=true;
};
从这一点开始,我就迷茫了。 userA 如何得到验证(即 userA 到底是谁?)。
你的图表是错误的。您对 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 http://web.mit.edu/kerberos/dialogue.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)