Windows之Kerberos认证
Windows之Kerberos认证
在希腊神话中Kerberos
是守护地狱之门的一条凶猛的三头神犬,而这里的Kerberos认证协议则是由美国麻省理工学院首先提出并实现的一个网络认证协议,他的特点是"复杂",而且Kerberos认证是一个三路处理过程,所以命名为"Kerberos"很贴切。
Kerberos 认证所参与的角色
- 访问服务的 Client
- 提供服务的 Server
- KDC(Key Distribution Center,密钥分发中心) = DC(Domain Controller)
其中,KDC(Key Distribution Center) = AD(Account Database)+ AS(Authenication Service)+ TGS(Ticket Granting Service)
认证步骤
1.客户端向AS发送认证请求(KRB_AS_REQ)
将(用户名、加密时间戳、指定TGS名称)发送给AS认证请求
- 加密时间戳:一个被Client的Master key加密过的Timestamp。这个就是证明自己知道自己声称的那个account的Password。一般地,它的内容是
- 用户名:表明身份
- TGS名称:KDC的Ticket Granting Service的Server Name。
2.AS确认Client端登录者用户身份(KRB_AS_REP)
AS通过它接收到的KRB_AS_REQ验证发送方的是否是在Client name & realm中声称的那个用户,也就是说要验证发送放Client是否知道Client的Password。
所以AS只需从AD中提取Client对应的Master Key对加密时间戳进行解密,如果是一个合法的Timestamp,则可以证明发送方提供的是正确无误的密码。
如果验证成功,AS将一份Authentication Service Response(KRB_AS_REP)发送给Client
-
被Client的Master Key加密过的Client/TGS SessionKey
-
被TGS的Key加密过的TGT票据。TGT主要包含三部分内容:
(1)Client/TGS SessionKey(2)Client ID & 地址 (3)End Time:TGT的到期时间
3.客户端向TGS发送请求服务授权请求(KRB_TGS_REQ)
Client向KDC中的TGS(Ticket Granting Service)发送Ticket Granting Service Request(KRB_TGS_REQ),内容包括:
- TGT:上一步获得的被TGS Key加密的票据TGT。
- Authenticator1:用以证明当初TGT的拥有者就是自己,所以它用Client/TGS SessionKey来进行加密。内容包括:
(1)Client ID (2)Timestamp
TGS 比对Authenticator1
包含的Client ID
和TGT
中的Client ID
- Server name & realm:Client试图访问的那个Server
4.TGS为Client响应服务授权票据(KRB_TGS_REP)
TGS先通过自己的TGS_KEY对Client提供的TGT进行解密,从而获得这个Client/TGS SessionKey。再通过这个Client/TGS SessionKey解密Authenticator进行Client的验证。
验证通过向对方发送Ticket Granting Service Response(KRB_TGS_REP)。内容包括:
- 使用Client/TGS SessionKey加密过的Client/Server SessionKey。该Client/Server SessionKey将被用于Client和Server的认证
- 使用Server的Key进行加密的CST(Client to Server Ticket)。该CST大体包含:
(1)Client/Server SessionKey (2)Client ID & 地址(3)End Time:Ticket的到期时间
5.Client向Service Server发送服务请求(KRB_AP_REQ)
Client向Server发送KRB_AP_REQ请求,内容包括:
-
CST:Client 通过TGS获得的被Server Key加密的CST
-
Authenticator2:用以证明Ticket的拥有者就是自己,所以用Client/Server SessionKey进行加密。内容包括:(1)Client Info(2)Timestamp
供Serve 比对
Authenticator2
包含的Client ID
和CST
中的Client ID
-
Flag:用于表示Client是否需要进行双向验证
6.Service Server响应Client(KRB_AP_REP)
Server接收到KRB_AP_REQ之后,通过自己的Server Key解密CST,从而获得Client/Server SessionKey。通过Client/Server SessionKey解密Authenticator2,进而验证对方的身份。验证成功,让Client访问需要访问的资源,否则直接拒绝对方的请求。
对于需要进行双向验证,Server从Authenticator2提取Timestamp,使用Client/Server SessionKey进行加密,并将其发送给Client用于Client验证Server的身份。