由于最近的項(xiàng)目中要用到kerberos and spnego protocol,查了一些資料,結(jié)合網(wǎng)上的資料和對(duì)它一定的理解,整理如下,以備后查.(如有不對(duì)之處,肯請(qǐng)高手指教)
kerberos是一個(gè)很重要的網(wǎng)絡(luò)認(rèn)證協(xié)議,它實(shí)現(xiàn)了在一個(gè)非安全的網(wǎng)絡(luò)環(huán)境中,一個(gè)實(shí)體向另一個(gè)實(shí)體證實(shí)自己的身份,從而以安全的方式進(jìn)行交流.kerberos protocol已經(jīng)被廣泛應(yīng)用于各種應(yīng)用中,最為典型的莫過(guò)于windows中的kerberos認(rèn)證,它在spnego protocol之下,為windows域用戶登錄提供安全保障.
首先相關(guān)名詞:
Long term key:就是長(zhǎng)期保持不變的key.
Master key:就是Long term key經(jīng)過(guò)Hash運(yùn)算得到的Hash code.
Short term key:就是只在一定時(shí)間內(nèi)有效的key.有時(shí)也叫Session key.
原則上Long term key 是不能在網(wǎng)絡(luò)上傳輸?shù)?因?yàn)楹芸赡躄ong term key在傳輸過(guò)程中被人截獲,一旦它被截獲,原則上只要有足夠的時(shí)間,就可以被破解.另外,對(duì)于一個(gè)帳戶而言,密碼僅限于該用戶知道,對(duì)于domain的Administrator也應(yīng)該保密,但由于密碼是用戶向Administrator證明身份的憑據(jù),所以要基于用戶的密碼生成來(lái)的信息來(lái)證明用戶的身份,通常做法是對(duì)密碼進(jìn)行Hash運(yùn)算,生成Hash code,這個(gè)Hash code就是我們說(shuō)的Master key.因?yàn)镠ash Algorithm具有不可逆,同時(shí)保證了密碼與Master key一一對(duì)應(yīng)的特性,保證了密碼的保密性,也保證了Master key可以代表密碼作為用戶身份的憑證.而作為 Short term key,用來(lái)加密在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù),由于它只在一定時(shí)間內(nèi)有效,即使被人截獲,等到被破解時(shí),這個(gè)key早就過(guò)期了.
Client 服務(wù)請(qǐng)求者
Server 服務(wù)提供者
KDC kerberos distribution certer.在整個(gè)認(rèn)證過(guò)程中作為client和server共同信認(rèn)的第三方.
以windows2003中的Domain為例,Domain Controller扮演著kdc的角色.
下面我來(lái)介紹一下這kerberos協(xié)議如何實(shí)現(xiàn)認(rèn)證的.
前提:client和server都在kdc上已注冊(cè).
第一步 Authentication Service Exchange
第二步 Ticket Granting Service Exchange
第三步 Client/Server Exchange
首先Client向kdc申請(qǐng)server服務(wù),kdc查看server服務(wù)是受保護(hù)的服務(wù),所以要驗(yàn)證client的身份,這就是第一步,kdc驗(yàn)證client的身份(Authentication Service Exchange).當(dāng)kdc核實(shí)client的身份正確后,會(huì)給client一個(gè)證明,用這個(gè)證明我們可以得到訪問server服務(wù)的許可證(Ticket),所以我們把這個(gè)證明叫做TGT(Ticket Granting Ticket).
當(dāng)client得到TGT后,用TGT來(lái)向kdc索要訪問server服務(wù)的通行證(Ticket),這就是第二步Ticket Granting Service Exchange.
當(dāng)client得到通行證(Ticket)后,就與server交互,向server出示通行證(Ticket),即第三步Client/Server Exchange,從可得到server的服務(wù).
以上三步的具體實(shí)現(xiàn)要復(fù)雜得多,簡(jiǎn)單介紹如下:
1. Authentication Service Exchange
通過(guò)這個(gè)Sub-protocol,KDC(確切地說(shuō)是KDC中的Authentication Service)實(shí)現(xiàn)對(duì)Client身份的確認(rèn),并頒發(fā)給該Client一個(gè)TGT。具體過(guò)程如
下:
Client向KDC的Authentication Service發(fā)送Authentication Service Request(KRB_AS_REQ), 為了確保KRB_AS_REQ僅限于自己和KDC知道,
Client使用自己的Master Key對(duì)KRB_AS_REQ的主體部分進(jìn)行加密(KDC可以通過(guò)Domain 的Account Database獲得該Client的Master Key)。
KRB_AS_REQ的大體包含以下的內(nèi)容:
Pre-authentication data:包含用以證明自己身份的信息。說(shuō)白了,就是證明自己知道自己聲稱的那個(gè)account的Password。一般地,它的內(nèi)容是
一個(gè)被Client的Master key加密過(guò)的Timestamp。
Client name & realm: 簡(jiǎn)單地說(shuō)就是Domain name\Client Server Name:注意這里的Server Name并不是Client真正要訪問的Server的名稱,而我們也說(shuō)
了TGT是和Server無(wú)關(guān)的(Client只能使用Ticket,而不是TGT去訪問Server)。這里的Server Name實(shí)際上是KDC的Ticket Granting Service的Server Name。
AS(Authentication Service)通過(guò)它接收到的KRB_AS_REQ驗(yàn)證發(fā)送方的是否是在Client name & realm中聲稱的那個(gè)人,也就是說(shuō)要驗(yàn)證發(fā)送放是
否知道Client的Password。所以AS只需從Account Database中提取Client對(duì)應(yīng)的Master Key對(duì)Pre-authentication data進(jìn)行解密,如果是一個(gè)合法
的Timestamp,則可以證明發(fā)送放提供的是正確無(wú)誤的密碼。驗(yàn)證通過(guò)之后,AS將一份Authentication Service Response(KRB_AS_REP
)發(fā)送給Client。KRB_AS_REQ主要包含兩個(gè)部分:本Client的Master Key加密過(guò)的Session Key(
SKDC-Client:Logon Session Key)和被自己(KDC)加密的TGT。而TGT大體又包含以下的內(nèi)容
:
Session Key: SKDC-Client:Logon Session Key
Client name & realm: 簡(jiǎn)單地說(shuō)就是Domain
name\Client
End time: TGT到期的時(shí)間。
Client通過(guò)自己的Master Key對(duì)第一部分解密獲得Session Key(SKDC-Client:Logon Session Key)之后,攜帶著TGT便可以進(jìn)入下一步:TGS(
Ticket Granting Service)Exchange。
2. TGS(Ticket Granting Service)Exchange
TGS(Ticket Granting Service)Exchange通過(guò)Client向KDC中的TGS(Ticket Granting Service)發(fā)送Ticket Granting Service Request
(KRB_TGS_REQ)開始。KRB_TGS_REQ大體包含以下的內(nèi)容:
TGT:Client通過(guò)AS Exchange獲得的Ticket
Granting Ticket,TGT被KDC的Master Key進(jìn)行加
密。
Authenticator:用以證明當(dāng)初TGT的擁有者是否就是自己,所以它必須以TGT的辦法方和自己的Session Key(SKDC-Client:Logon Session Key
)來(lái)進(jìn)行加密。
Client name & realm: 簡(jiǎn)單地說(shuō)就是Domain name\Client。
Server name & realm: 簡(jiǎn)單地說(shuō)就是Domain name\Server,這回是Client試圖訪問的那個(gè)Server。
TGS收到KRB_TGS_REQ在發(fā)給Client真正的Ticket之前,先得整個(gè)Client提供的那個(gè)TGT是否是AS頒發(fā)給它的。于是它不得不通過(guò)Client提供的
Authenticator來(lái)證明。但是Authentication是通過(guò)Logon Session Key(SKDC-Client)進(jìn)行加密的,而自己并沒有保存這個(gè)Session Key。所以
TGS先得通過(guò)自己的Master Key對(duì)Client提供的TGT進(jìn)行解密,從而獲得這個(gè)Logon Session Key(SKDC-Client),再通過(guò)這個(gè)Logon Session
Key(SKDC-Client)解密Authenticator進(jìn)行驗(yàn)證。驗(yàn)證通過(guò)向?qū)Ψ桨l(fā)送Ticket Granting Service Response(KRB_TGS_REP)。這個(gè)KRB_TGS_REP有
兩部分組成:使用Logon Session Key(SKDC-Client)加密過(guò)用于Client和Server的Session Key(SServer-Client)和使用Server的Master
Key進(jìn)行加密的Ticket。該Ticket大體包含以下一些內(nèi)容:
Session Key:SServer-Client。
Client name & realm: 簡(jiǎn)單地說(shuō)就是Domain name\Client。
End time: Ticket的到期時(shí)間。
Client收到KRB_TGS_REP,使用Logon Session Key(SKDC-Client)解密第一部分后獲得Session Key(SServer-Client)。有了Session Key和
Ticket,Client就可以之間和Server進(jìn)行交互,而無(wú)須在通過(guò)KDC作中間人了。所以我們說(shuō)Kerberos是一種高效的認(rèn)證方式,它可以直接通
過(guò)Client和Server雙方來(lái)完成,不像Windows NT 4下的NTLM認(rèn)證方式,每次認(rèn)證都要通過(guò)一個(gè)雙方信任的第3方來(lái)完成。
我們現(xiàn)在來(lái)看看 Client如果使用Ticket和Server怎樣進(jìn)行交互的,這個(gè)階段通過(guò)我們的第3個(gè)Sub-protocol來(lái)完成:CS(Client/Server )
Exchange。
3. CS(Client/Server )Exchange
Client通過(guò)TGSExchange獲得Client和Server的Session Key(SServer-Client),隨后創(chuàng)建用于證明自己就是Ticket的真正所有者的Authenticator,并使用Session Key(SServer-Client)進(jìn)行加密。最后將這個(gè)被加密過(guò)的Authenticator和Ticket作為Application Service Request(KRB_AP_REQ)發(fā)
送給Server。除了上述兩項(xiàng)內(nèi)容之外,KRB_AP_REQ還包含一個(gè)Flag用于表示Client是否需要進(jìn)行雙向驗(yàn)證(Mutual Authentication)。
Server接收到KRB_AP_REQ之后,通過(guò)自己的Master Key解密Ticket,從而獲得Session Key(SServer-Client)。通過(guò)Session Key(SServer
-Client)解密Authenticator,進(jìn)而驗(yàn)證對(duì)方的身份。驗(yàn)證成功,讓Client訪問需要訪問的資源,否則直接拒絕對(duì)方的請(qǐng)求。
對(duì)于需要進(jìn)行雙向驗(yàn)證,Server從Authenticator提取Timestamp,使用Session Key(SServer-Client)進(jìn)行加密,并將其發(fā)送給Client用于
Client驗(yàn)證Server的身份。
想要更深入的理解kerberos,請(qǐng)參考官方網(wǎng)站
http://web.mit.edu/Kerberos/