概念:
Kerberos服務(wù)器:AS認(rèn)證服務(wù)器,TGS服務(wù)授權(quán)服務(wù)器
Client 客戶端,代表使用應(yīng)用的用戶
AppServer 服務(wù)端,應(yīng)用提供各種服務(wù)的服務(wù)器
Client在Kerberos注冊用戶名c,密碼Kc
AppServer在Kerberos注冊用戶名s,密碼Ks
TGS在Kerberos注冊用戶名tgs,密碼Ktgs
說明:
Kerberos為Client和AppServer提供可信任第三方認(rèn)證服務(wù)。
Kerberos服務(wù)器將用戶的用戶名及密碼存放在它的數(shù)據(jù)庫中。
密碼Kc只有Client和Kerberos才擁有,通過Client在Kerberos服務(wù)器注冊保證密碼一致。
同理密碼Ks只有AppServer和Kerberos才擁有。
認(rèn)證過程:
1.Client->AS
KRB_AS_REQ={c, tgs, TS1}
c表示Client客戶標(biāo)識,告訴AS請求的Client身份,便于AS到數(shù)據(jù)庫中查詢c的密鑰
tgs是Client下一步要訪問TGS服務(wù)器標(biāo)識
TS1時間戳被AS用于驗證Client時鐘是否與AS時鐘同步
2.AS->Client
KRB_AS_REP={K(c,tgs),TS2,lifetime,tgs_Tickets}Kc
K(c,tgs)是由AS隨機(jī)產(chǎn)生的,用于Client與TGS共享的一個會話私鑰
TS2是票據(jù)發(fā)放的時間戳,lifetime是票據(jù)有效期
tgs_Tickets是AS發(fā)給Client的用于訪問TGS的票據(jù)授權(quán)票據(jù)
tgs_Tickets={K(c,tgs), c, c_mac, tgs, TS2, lifetime2}Ktgs
c_mac是Client的MAC地址
3.Client->TGS
KRB_TGS_REQ={s, tgs_Tickets, Authen_info}
s是Client期望訪問的AppServer服務(wù)器
tgs_Tickets是Client上一步從AS獲取的票據(jù)授權(quán)票據(jù)
Authen_info是Client發(fā)送的一條認(rèn)證消息,用于確認(rèn)發(fā)送票據(jù)tgs_Tickets的用戶就是c
Authen_info={c, c_mac, TS3}K(c,tgs)
4.TGS->Client
KRB_TGS_REP={K(c,s), s, TS4, s_Tickets}K(c,tgs)
K(c,s)是TGS隨機(jī)生成的密鑰,為Client端和AppServer共享的會話密鑰
s_Tickets={K(c,s), c, c_mac, s, TS4, lifetime}Ks
TGS用自己的密碼Ktgs解密tgs_Tickets獲得c,c_mac,K(c,tgs),TS2,lifetime
TGS首先根據(jù)時TS2,lifetime時間判斷票據(jù)是否過期,未過期則繼續(xù),
TGS再用上面解密出來的會話私鑰K(c,tgs)解密Authen_info,獲得c,c_mac,
比較上面2次解密出來的c,c_mac是否一致,判斷此次請求來自合法Client。
5.Client->AppServer
KRB_APPSERVER_REQ={s_Tickets,Authent_info},
Client使用K(c,tgs)從KRB_TGS_REP響應(yīng)中獲取K(c,s)
Client采用會話密鑰K(c,s)加密Authent_info消息
Authen_info={c, c_mac, TS5}K(c,s)
6.AppServer->Client
AppServer用自己的密碼Ks從S_Tickets解密獲得K(c,s), c, c_mac, s, TS4, lifetime
(s標(biāo)識確認(rèn)Client需要訪問該AppServer,AppServer可以通過能否在票中找到自已的名字s來判斷解密是否正確)
AppServer然后用TS4時間戳和有效期lifetime來檢查票是否有效,有效才進(jìn)行下一步
AppServer再用從上面解密出來的K(c,s)從Authen_info解密獲得c, c_mac
AppServer比較上面2次解密出來的c,c_mac是否一致,判斷此次請求來自合法Client。
最后AppServer使用K(c,s)加密確認(rèn)消息給Client端,告知對方它期待的服務(wù)器已收到它的服務(wù)請求。
7.Client
Client接收到AppServer的響應(yīng),并且使用K(c,s)解密成功即可。
此時Client與AppServer即實現(xiàn)了可信的雙方認(rèn)證。
其他:
2中因為Tickets_tgs已經(jīng)采用TGS的私鑰加密,故沒有必要采用客戶端的私鑰再次加密,
所以AS向Client響應(yīng)可以修改為:
KRB_AS_REP=tgs_Tickets,{K(c,tgs),TS2,lifetime}Kc
4中同樣S_Tickets已經(jīng)采用AppServer的私鑰加密,也不需要使用K(c,tgs),可以修改為:
KRB_TGS_REP=s_Tickets,{K(c,s), s, TS4}K(c,tgs)
參考文檔:
【hadoop大數(shù)據(jù)安全基礎(chǔ)知識】Kerberos安全協(xié)議(原理)解析與編程實現(xiàn)
http://www.aboutyun.com/thread-11577-1-1.html


