Kerberos身份验证流程

本文深入探讨了Kerberos认证协议的工作原理,包括其在域环境下的应用、关键角色(如Client、Server和KDC)的功能,以及详细的认证流程。通过类比火车票和车站系统,形象地解释了TGT和ST票据的生成与验证过程。

介绍:

Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。

在 Kerberos 认证中,最主要的问题是如何证明「你是你」的问题,如当一个 Client 去访问 Server 服务器上的某服务时,Server 如何判断 Client 是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性,这正是 Kerberos 解决的问题。在域渗透过程中 Kerberos 协议的攻防也是很重要的存在。

Kerberos 主要是用在域环境下的身份认证协议


Kerberos 协议框架:

在 Kerberos 协议中主要是有三个角色的存在:

1. 访问服务的 Client;

2. 提供服务的 Server;

3.KDC(Key Distribution Center)密钥分发中心

注意:

1、KDC 服务默认会安装在一个域的域控中
2、从物理层面看,AD与KDC均为域控制器(Domain Controller)
3、AD其实是一个类似于本机SAM的一个数据库,全称叫account database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT
4、KDC 服务框架中包含一个 KRBTGT 账户,它是在创建域时系统自动创建的一个账号,你可以暂时理解为他就是一个无法登陆的账号,在发放票据时会使用到它的密码 HASH 值。


上文提到的TGT,KDC,client,server又是什么东西呢,下文来介绍下:

Kerberos粗略的验证流程:

先来举个例子:如果把 Kerberos 中的票据类比为一张火车票,那么 Client 端就是乘客,Server 端就是火车,而 KDC 就是就是车站的认证系统。如果Client端的票据是合法的(由你本人身份证购买并由你本人持有)同时有访问 Server 端服务的权限(车票对应车次正确)那么你才能上车。当然和火车票不一样的是 Kerberos 中有存在两张票,而火车票从头到尾只有一张。

在KDC中又分为两个部分:Authentication ServiceTicket Granting Service

Authentication Service:AS 的作用就是验证 Client 端的身份(确定你是身份证上的本人),验证通过就会给一张 TGT(Ticket Granting Ticket)票给 Client。

Ticket Granting Service:TGS 的作用是通过 AS 发送给 Client 的票(TGT)换取访问 Server 端的票(上车的票 ST)。ST(ServiceTicket)也被称之为 TGS Ticket,为了和 TGS 区分,在这里就用 ST 来说明,所以TGS Ticket和ST的意思是一样的。

这就说明了为什么在Kerberos中存有两种票,其实就是更加细分了其中的验证,简单的描述就是首先你拿身份证验证头像是不是一样,是的话就返回一张TGT,然后在通过验证车票获得上车的资格,这里就有对TGT的验证,通过的话再返回一张ST/TGS Ticket的票,如果都可以那么就验证成功了。


Kerberos 详解认证流程:

当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,然后通过 AS 发放的 TGT 向 Server 发起认证请求,这个过程分为三块:

The Authentication Service Exchange:Client 与 AS 的交互,

The Ticket-Granting Service (TGS) Exchange:Client 与 TGS 的交互,

The Client/Server Authentication Exchange:Client 与 Server 的交互。

(1)TheAuthentication Service Exchange

KRB_AS_REQ(请求):

Client->AS:Client 先向 KDC 的 AS 发送 Authenticator1(内容为Client hash加密的时间戳)

KRB_AS_REP(应答):

AS-> Client:AS根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash,然后会生成一个随机数session key,然后返回给Client由Client的ntlm hash加密的session key-as作为AS数据,再返回TGT(使用KDC中krbtgt的NTLM Hash加密session key和客户端的信息,客户端的信息里面包含了时间戳等信息)

AS验证的简述:在 KDC(AD) 中存储了域中所有用户的密码 HASH,当 AS 接收到 Client 的请求之后会根据 KDC 中存储的密码来解密,解密成功并且验证信息。
验证成功后返回给 Client两个东西,一个是由 Client 密码 HASH 加密的 session key-as 和 TGT(由 KRBTGT HASH 加密的 session key 和 TimeStamp 等信息)。

(2)TheTicket-Granting Service (TGS) Exchange

KRB_TGS_REQ(请求):

Client 接收到了加密后的session key-as 和 TGT 之后,先用自身密码 HASH解密得到session key ,TGT 是由 KDC 中KRBTGT的HASH加密,所以Client 无法解密。这时 Client 再用session key加密的TimeStamp,然后再和TGT 一起发送给 KDC 中的 TGS(TicketGranting Server)票据授权服务器换取能够访问 Server 的票据。

KRB_TGS_REP(应答):

TGS 收到 Client 发送过来的 TGT 和 Session key 加密的 TimeStamp 之后,首先会检查自身是否存在 Client 所请求的服务。如果服务存在,则用 KRBTGT的HASH解密 TGT

一般情况下 TGS 会检查 TGT 中的时间戳查看 TGT 是否过期,且原始地址是否和 TGT 中保存的地址相同

验证成功之后将返回Client两个东西,一个是用 session key 加密的 session key-tgs,然后另一个是 Client要访问的Server的密码 HASH 加密的 session key-tgs(前面和session key加密生成的)生成就是ST(TGS)

(3)TheClient/Server Authentication Exchange

KRB_AP_REQ(请求):

Client -> Server 发送 Authenticator3(session key-tgs 加密 TimeStamp) 和票据 ST(Server 密码 HASH 加密 session key-tgs)

Client 收到 session key 加密生成的 session key-tgs 和 Server 密码 HASH 加密 session key-tgs生成的TGS 之后,用 session key 解密得到 session key-tgs,然后把 sessionkey-tgs 加密的 TimeStamp 和 ST(也就是TGS)一起发送给 Server。

KRB_AP_REP(应答):

Server-> Client

server 通过自己的密码解密 ST,得到 sessionkey-tgs, 再用 sessionkey-tgs 解密 Authenticator3 得到 TimeStamp,验证正确返回验证成功。

上文文字描述的也就是最开头的图片,这里再放上去,是不是会发现这张图理解了???

参考文章:https://tools.ietf.org/html/rfc4120.html
参考文章:https://www.freebuf.com/articles/system/196434.html

Kerberos身份验证失败(Kerberos Pre-authentication Failed)是Kerberos身份验证流程中常见的问题之一,通常发生在客户端尝试登录域时,无法通过预身份验证步骤。该问题可能由多种原因引起,以下是常见原因及对应的解决方法。 ### 1. 密码错误或账户锁定 当用户输入错误的密码或账户被锁定时,Kerberos身份验证会失败。这是最常见的原因之一。可以通过检查用户输入的凭据是否正确,或在域控制器上查看账户状态来解决。 ### 2. 时间同步问题 Kerberos协议对时间同步非常敏感,如果客户端和域控制器之间的时间差超过允许的范围(默认为5分钟),则身份验证将失败。确保所有设备的时间与域控制器同步,可以通过配置NTP(网络时间协议)来解决。 ### 3. Kerberos配置问题 Kerberos配置文件(如krb5.conf或krb5.ini)中的错误可能导致预身份验证失败。检查配置文件中的域名、KDC(密钥分发中心)地址和realm设置是否正确。 ### 4. 加密类型不匹配 Kerberos支持多种加密类型(如AES、DES、RC4等),如果客户端和服务器使用的加密类型不匹配,预身份验证将失败。确保客户端和服务器都支持相同的加密类型,并且在域策略中正确配置。 ### 5. 票据缓存问题 有时,客户端的票据缓存中可能存储了过期或损坏的票据,导致预身份验证失败。清除票据缓存并重新获取票据可以解决此问题。使用以下命令清除票据缓存: ```bash kdestroy ``` ### 6. 服务主体名称(SPN)冲突 服务主体名称(SPN)是Kerberos身份验证中的关键部分,如果SPN配置错误或存在冲突,预身份验证将失败。使用`setspn`命令检查并修复SPN冲突。 ### 7. 域控制器问题 域控制器的故障或配置错误可能导致Kerberos身份验证失败。检查域控制器的日志,查看是否有错误信息,并确保域控制器正常运行。 ### 8. 网络问题 网络连接问题可能导致客户端无法与域控制器通信,从而导致预身份验证失败。检查网络连接,确保客户端能够访问域控制器。 ### 9. 客户端配置问题 客户端的Kerberos配置或软件版本可能不兼容服务器端的配置。确保客户端使用最新的Kerberos库,并且配置文件正确。 ### 示例命令 以下是一些常用的Kerberos故障排除命令: - 获取票据: ```bash kinit username@REALM ``` - 查看票据: ```bash klist ``` - 清除票据: ```bash kdestroy ``` ### 总结 Kerberos身份验证失败可能由多种原因引起,包括密码错误、时间同步问题、配置错误等。通过逐一排查这些可能的原因,可以有效解决该问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值