kinit.exe 是 Java8 中用于获得和缓存 Kerberos 票证授予票证的工具。在使用 kinit.exe 之前,用户必须在密钥分发中心(KDC,Key Distribution Center)中注册为主体。通过运行 kinit.exe,可以获取初始的票证授予票证,并将其缓存在本地,以便后续进行 Kerberos 认证和访问受保护的资源。
Kerberos 是一种身份认证协议,被广泛运用在大数据生态中,甚至可以说是大数据身份认证的事实标准。
Kerberos 一词来源于古希腊神话中的 Cerberus —— 守护地狱之门的三头犬。
Kerberos 是一种基于加密 Ticket 的身份认证协议。Kerberos 主要由三个部分组成:Key Distribution Center(即KDC)、Client 和 Service。 大致关系如下图所示:
密钥分发中心(KDS)由身份验证服务器 (AS,Authentication Server) 和票证授予服务器 (TGS,Ticket Granting Server) 组成。TGT 是一张票据许可票据。
用户输入登录名和密码。明文用户 ID 代表用户向身份验证服务器 (AS) 发出服务请求。
AS检查用户登录名是否在数据库中。如果存在有关该用户的信息,则AS可以根据用户的ID和密码生成客户端密钥。AS发送给用户:
客户端/TSG会话密钥 (用客户端密钥加密);
TGT 包括用户 ID、网络地址和票证有效期 + Client/TGS 会话密钥(用 TGS 秘密密钥加密)。
用户解码第一条消息,但不能解码第二条消息,因为用户没有TSG密钥。客户端向TGS发送消息:
从 AS + 服务器 ID + TGS/客户端密钥接收的 TGT (用 TGS 密钥加密) ;
身份验证器包括客户端ID和时间戳 (使用客户端/TSG会话密钥加密);
TGS 解密第一条消息,获取 TGT + TGS/Client 会话密钥,用它解密第二条消息。TGS 检查来自第一条消息的用户 ID 是否与来自第二条消息的 ID 匹配,以及时间戳是否没有超过票证有效期。如果一切正常,TSG 将向用户发送:
使用的 ID、网络地址、票证验证周期 + 客户端/服务器会话密钥 (用服务器密钥加密) ;
客户机/服务器会话密钥(使用 Client/TGS 秘密密钥加密)。
客户端向其试图访问的服务器发送以下信息:
使用的 ID、网络地址、票据有效期 + 客户端/服务器会话密钥(用服务器秘钥加密);
验证器,包括 ID 和时间戳(用客户机/服务器会话密钥加密)。
目标服务器会对用户信息进行解密,检查两条信息中的用户 ID 是否具有相同值,是否超过有效期,然后向客户端发送以下参数以确认其身份:
时间戳 + 1(用客户机/服务器会话密钥加密)。
客户机检查时间戳值是否为 timestamp + 1,这将显示服务器的真实身份。如果是这样,客户端可以信任服务器并开始使用它。
总结起来,Kerberos 验证身份基本流程如下:
(1)客户端向 AS 证实身份,并获取一张票据许可票据 TGT,该票据可重用。
(2)客户端向 TGS 提出请求,并将 TGT 作为身份凭证,此时客户端仅传输用户名。
(3)TGS 以用户名查找相应密钥,并用其加密 TGT,返回给客户端。
(4)客户端收到 TGS 的应答后会提示用户输入其口令,并将该口令转化为密钥(若能正确解密 TGT,则验证了用户的身份)。
认证服务器(Authentication Server,AS):负责验证用户的身份,并为用户生成票证授予票证(Ticket Granting Ticket,TGT)。
票证授予票证(Ticket Granting Ticket,TGT):这是用户向票据授予服务器(Ticket Granting Server,TGS)请求服务票证(Service Ticket)时所需的凭证。
票据授予服务器(Ticket Granting Server,TGS):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的应用服务票据(ticket),票据授予服务器的引入解决了只采用认证服务器时发送明文口令的安全隐患,它只向已由 AS 认证了身份的客户端颁发票据,此时客户端只发送用户名。
服务票证(Service Ticket):用户用来访问特定服务或资源的票据。
主体(Principal):在 Kerberos 系统中,表示用户、服务或进程的身份标识。
密钥(Key):用于加密和解密通信数据,以保证安全性和完整性。
领域(Realms):Kerberos 中的管理边界,用于划分不同的用户和服务集合。
打开终端,输入 kinit.exe -help 命令查看帮助信息:
C:\Users\Administrator> kinit.exe -help 使用方法: kinit [-A] [-f] [-p] [-c cachename] [[-k [-t keytab_file_name]] [principal] [password] Kerberos 5 票据请求的可用选项: -A 不包括地址 -f 可转发 -p 可代理 -c 缓存名称(即 FILE:\d:\myProfiles\mykrb5cache) -k 使用密钥表 -t keytab 文件名 principal principal 名称(例如:qweadf@ATHENA.MIT.EDU qweadf) password principal 的 Kerberos 密码
下面例子中,user@REALM.COM 是 Kerberos 主体的名称,REALM.COM 是 Kerberos 域的名称:
kinit user@REALM.COM
运行这个命令后,它会提示你输入 user 的 Kerberos 密码。
下面例子中,-kt 选项指定了一个 keytab 文件(/path/to/user.keytab),该文件包含了用于认证 user@REALM.COM 主体的密钥。keytab 文件通常用于非交互式认证,例如在服务启动时:
kinit -kt /path/to/user.keytab user@REALM.COM
注意事项:
(1)确保 Kerberos 环境已经正确配置,包括 KDC(Key Distribution Center)的地址和 Kerberos 域的名称。
(2)对于 keytab 文件,确保它包含正确的密钥,并且具有适当的访问权限。
(3)如果 kinit 命令执行成功,Kerberos 票据将被缓存到本地,以便后续使用。可以使用 klist 命令来查看和管理这些票据。
(4)如果 kinit 命令失败,可能是由于密码错误、keytab 文件无效、Kerberos 环境配置错误等原因造成的,需要仔细检查和调试。