kerberos(待更新)
Kerberos协议
Kerberos概述
Kerberos是一种由MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
Kerberos基本概念
Key Distribution Center,or KDC
在启用Kerberos的环境中进行身份验证的受信任源。
Kerberos KDC Server
作为密钥分发中心(KDC)的计算机或服务器。
Kerberos Client
集群中针对KDC进行身份验证的任何计算机。
KDC Admin Account
Ambari
在Kerberos协议中,主要有以下三个角色:
- 访问服务的客户端:kerberos客户端是代表需要访问资源的用户进行操作的应用程序,例如打开文件、查询数据库或打印文档。每个Kerberos客户端在访问资源之前都会请求身份验证。
- 提供服务的服务端:域内提供服务的服务端,服务端都有一个独唯一的SPN。
- 提供认证服务的KDC:Key Distribution Center,密钥分发中心是一种网络服务,它向活动目录域内的用户和计算机提供会话票据和临时会话密钥,其服务账户为krbtgt。KDC作为活动目录域服务AADS的一部分运行在每个域控制器上。
- 这里说一下krbtgt账户,该用户是在创建活动目录时系统自动创建的一个账号,其作用是KDC密钥分发中心的服务账号,其密码是系统随机生成的,无法正常登陆主机。
Kerberos是一种基于票据Ticket的认证方式。客户端想要访问服务端的某个服务,首先需要购买服务端认可的ST服务票据(Server Ticket)。也就是说,客户端在访问服务之前需要先买好票,等待服务验票之后才能访问。但是这张票并不能直接购买,需要一张TGT认购权证(Ticket Granting Ticket)。也就是说,客户端在买票之前必须先获得一张TGT认购权证。TGT认购权证和ST服务票据均是由KDC发放;因为KDC是运行在域控制器上,所以说TGT认购权证和ST服务票据均是由域控分发。
Kerberos使用TCP/UDP 88端口进行认证,使用TCP/UDP 464端口进行密码重置。
Kerberos中一些名词的简称及含义如表所示:
简称 | 英文全程 | 中文名称 |
---|---|---|
DC | Domain Controller | 域控制器 |
krbtgt | KDC密钥分发中心服务账户 | |
KDC | Key Distribution Center | 密钥分发中心,由域控担任 |
AD | Active Directory | 活动目录,里面包含域内用户数据库 |
AS | Authentication Service | 认证服务 |
TGS | Ticket Granting Service | 票据授予服务 |
TGT | Ticket Granting Ticket | TGT认购权证,由KDC的AS认证服务发放 |
ST | Service Ticket | ST服务票据,由KDC的TGS票据授予服务发放 |
Kerberos协议有两个基础认证模块:AS_REQ & AS_REP 和 TGS_REQ & TGS_REP,以及微软扩展的两个认证模块S4U和PAC。S4U是微软为了实现委派而扩展的模块,分为S4U2Self和S4U2Proxy。在Kerberos最初设计的流程里只有说明了如何证明客户端的真实身份,但是并没有说明客户端是否有权限访问该服务,因为在域中不同权限的用户能够访问的资源是不同的。因此微软为了解决权限这个问题,引入了PAC(Privilege Attribute Certificate,特权属性证书)的概念。
1 | sequenceDiagram |
认证过程:
- AS_REQ:Client向KDC发起AS_REQ,请求凭据是Client Hash加密的时间戳
- AS_RESP:KDC使用Client Hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid、Client所在的组
- TGS_REQ:Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
- TGS_RESP:KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash加密的ST票据(这一步不管用户有没有访问服务的权限,只要TGT正确就返回ST票据)
- AP_REQ:Client拿着ST票据去请求服务
- AP_RESP:服务使用自己的hash解密ST票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限
1 | sequenceDiagram |