1. 程式人生 > >kerberos認證原理---講的非常細緻,易懂

kerberos認證原理---講的非常細緻,易懂

前幾天在給人解釋Windows是如何通過Kerberos進行Authentication的時候,講了半天也別把那位老兄講明白,還差點把自己給繞進去。後來想想原因有以下兩點:對於一個沒有完全不瞭解Kerberos的人來說,Kerberos的整個Authentication過程確實不好理解——一會兒以這個Key進行加密、一會兒又要以另一個Key進行加密,確實很容易把人給弄暈;另一方面是我講解方式有問題,一開始就從Kerberos的3個Sub-protocol全面講述整個Authentication 過程,對於一個完全不瞭解Kerberos的人來說要求也忒高了點。為此,我花了一些時間寫了這篇文章,儘量以由淺入深、層層深入的方式講述我所理解的基於Kerberos的Windows Network Authentication,希望這篇文章能幫助那些對Kerberos不明就裡的人帶來一絲幫助。對於一些不對的地方,歡迎大家批評指正。

一、 基本原理

Authentication解決的是“如何證明某個人確確實實就是他或她所聲稱的那個人”的問題。對於如何進行Authentication,我們採用這樣的方法:如果一個祕密(secret)僅僅存在於A和B,那麼有個人對B聲稱自己就是A,B通過讓A提供這個祕密來證明這個人就是他或她所聲稱的A。這個過程實際上涉及到3個重要的關於Authentication的方面:

  • Secret如何表示。
  • A如何向B提供Secret。
  • B如何識別Secret。

基於這3個方面,我們把Kerberos Authentication進行最大限度的簡化:整個過程涉及到Client和Server,他們之間的這個Secret我們用一個Key(K

Server-Client)來表示。Client為了讓Server對自己進行有效的認證,向對方提供如下兩組資訊:

  • 代表Client自身Identity的資訊,為了簡便,它以明文的形式傳遞。
  • 將Client的Identity使用KServer-Client作為Public Key、並採用對稱加密演算法進行加密。

由於KServer-Client僅僅被Client和Server知曉,所以被Client使用KServer-Client加密過的Client Identity只能被Client和Server解密。同理,Server接收到Client傳送的這兩組資訊,先通過KServer-Client

對後者進行解密,隨後將機密的資料同前者進行比較,如果完全一樣,則可以證明Client能過提供正確的KServer-Client,而這個世界上,僅僅只有真正的Client和自己知道KServer-Client,所以可以對方就是他所聲稱的那個人。


Keberos大體上就是按照這樣的一個原理來進行Authentication的。但是Kerberos遠比這個複雜,我將在後續的章節中不斷地擴充這個過程,知道Kerberos真實的認證過程。為了使讀者更加容易理解後續的部分,在這裡我們先給出兩個重要的概念:

  • Long-term Key/Master Key:在Security的領域中,有的Key可能長期內保持不變,比如你在密碼,可能幾年都不曾改變,這樣的Key、以及由此派生的Key被稱為Long-term Key。對於Long-term Key的使用有這樣的原則:被Long-term Key加密的資料不應該在網路上傳輸。原因很簡單,一旦這些被Long-term Key加密的資料包被惡意的網路監聽者截獲,在原則上,只要有充足的時間,他是可以通過計算獲得你用於加密的Long-term Key的——任何加密演算法都不可能做到絕對保密。

在一般情況下,對於一個Account來說,密碼往往僅僅限於該Account的所有者知曉,甚至對於任何Domain的Administrator,密碼仍然應該是保密的。但是密碼卻又是證明身份的憑據,所以必須通過基於你密碼的派生的資訊來證明使用者的真實身份,在這種情況下,一般將你的密碼進行Hash運算得到一個Hash code, 我們一般管這樣的Hash Code叫做Master Key。由於Hash Algorithm是不可逆的,同時保證密碼和Master Key是一一對應的,這樣既保證了你密碼的保密性,有同時保證你的Master Key和密碼本身在證明你身份的時候具有相同的效力。

  • Short-term Key/Session Key:由於被Long-term Key加密的資料包不能用於網路傳送,所以我們使用另一種Short-term Key來加密需要進行網路傳輸的資料。由於這種Key只在一段時間內有效,即使被加密的資料包被黑客截獲,等他把Key計算出來的時候,這個Key早就已經過期了。

二、引入Key Distribution: KServer-Client從何而來

上面我們討論了Kerberos Authentication的基本原理:通過讓被認證的一方提供一個僅限於他和認證方知曉的Key來鑑定對方的真實身份。而被這個Key加密的資料包需要在Client和Server之間傳送,所以這個Key不能是一個Long-term Key,而只可能是Short-term Key,這個可以僅僅在Client和Server的一個Session中有效,所以我們稱這個Key為Client和Server之間的Session Key(SServer-Client)。

現在我們來討論Client和Server如何得到這個SServer-Client。在這裡我們要引入一個重要的角色:Kerberos Distribution Center-KDC。KDC在整個Kerberos Authentication中作為Client和Server共同信任的第三方起著重要的作用,而Kerberos的認證過程就是通過這3方協作完成。順便說一下,Kerberos起源於希臘神話,是一支守護著冥界長著3個頭顱的神犬,在keberos Authentication中,Kerberos的3個頭顱代表中認證過程中涉及的3方:Client、Server和KDC

對於一個Windows Domain來說,Domain Controller扮演著KDC的角色。KDC維護著一個儲存著該Domain中所有帳戶的Account Database(一般地,這個Account Database由AD來維護),也就是說,他知道屬於每個Account的名稱和派生於該Account Password的Master Key。而用於Client和Server相互認證的SServer-Client就是有KDC分發。下面我們來看看KDC分發SServer-Client的過程。

通過下圖我們可以看到KDC分發SServer-Client的簡單的過程:首先Client向KDC傳送一個對SServer-Client的申請。這個申請的內容可以簡單概括為“我是某個Client,我需要一個Session Key用於訪問某個Server ”。KDC在接收到這個請求的時候,生成一個Session Key,為了保證這個Session Key僅僅限於傳送請求的Client和他希望訪問的Server知曉,KDC會為這個Session Key生成兩個Copy,分別被Client和Server使用。然後從Account database中提取Client和Server的Master Key分別對這兩個Copy進行對稱加密。對於後者,和Session Key一起被加密的還包含關於Client的一些資訊。

KDC現在有了兩個分別被Client和Server 的Master Key加密過的Session Key,這兩個Session Key如何分別被Client和Server獲得呢?也許你 馬上會說,KDC直接將這兩個加密過的包傳送給Client和Server不就可以了嗎,但是如果這樣做,對於Server來說會出現下面 兩個問題:

  • 由於一個Server會面對若干不同的Client, 而每個Client都具有一個不同的Session Key。那麼Server就會為所有的Client維護這樣一個Session Key的列表,這樣做對於Server來說是比較麻煩而低效的。
  • 由於網路傳輸的不確定性,可能出現這樣一種情況:Client很快獲得Session Key,並將這個Session Key作為Credential隨同訪問請求傳送到Server,但是用於Server的Session Key確還沒有收到,並且很有可能承載這個Session Key的永遠也到不了Server端,Client將永遠得不到認證。

為了解決這個問題,Kerberos的做法很簡單,將這兩個被加密的Copy一併傳送給Client,屬於Server的那份由Client傳送給Server。


可能有人會問,KDC並沒有真正去認證這個傳送請求的Client是否真的就是那個他所聲稱的那個人,就把Session Key傳送給他,會不會有什麼問題?如果另一個人(比如Client B)聲稱自己是Client A,他同樣會得到Client A和Server的Session Key,這會不會有什麼問題?實際上不存在問題,因為Client B聲稱自己是Client A,KDC就會使用Client A的Password派生的Master Key對Session Key進行加密,所以真正知道Client A 的Password的一方才會通過解密獲得Session Key。 

三、引入Authenticator - 為有效的證明自己提供證據

通過上面的過程,Client實際上獲得了兩組資訊:一個通過自己Master Key加密的Session Key,另一個被Sever的Master Key加密的資料包,包含Session Key和關於自己的一些確認資訊。通過第一節,我們說只要通過一個雙方知曉的Key就可以對對方進行有效的認證,但是在一個網路的環境中,這種簡單的做法是具有安全漏洞,為此,Client需要提供更多的證明資訊,我們把這種證明資訊稱為Authenticator,在Kerberos的Authenticator實際上就是關於Client的一些資訊和當前時間的一個Timestamp(關於這個安全漏洞和Timestamp的作用,我將在後面解釋)。

在這個基礎上,我們再來看看Server如何對Client進行認證:Client通過自己的Master Key對KDC加密的Session Key進行解密從而獲得Session Key,隨後建立Authenticator(Client Info + Timestamp)並用Session Key對其加密。最後連同從KDC獲得的、被Server的Master Key加密過的資料包(Client Info + Session Key)一併傳送到Server端。我們把通過Server的Master Key加密過的資料包稱為Session Ticket

當Server接收到這兩組資料後,先使用他自己的Master Key對Session Ticket進行解密,從而獲得Session Key。隨後使用該Session Key解密Authenticator,通過比較Authenticator中的Client InfoSession Ticket中的Client Info從而實現對Client的認證。


為什麼要使用Timestamp?

到這裡,很多人可能認為這樣的認證過程天衣無縫:只有當Client提供正確的Session Key方能得到Server的認證。但是在現實環境中,這存在很大的安全漏洞。

我們試想這樣的現象:Client向Server傳送的資料包被某個惡意網路監聽者截獲,該監聽者隨後將資料包座位自己的Credential冒充該Client對Server進行訪問,在這種情況下,依然可以很順利地獲得Server的成功認證。為了解決這個問題,Client在Authenticator中會加入一個當前時間的Timestamp

在Server對Authenticator中的Client Info和Session Ticket中的Client Info進行比較之前,會先提取Authenticator中的Timestamp,並同當前的時間進行比較,如果他們之間的偏差超出一個可以接受的時間範圍(一般是5mins),Server會直接拒絕該Client的請求。在這裡需要知道的是,Server維護著一個列表,這個列表記錄著在這個可接受的時間範圍內所有進行認證的Client和認證的時間。對於時間偏差在這個可接受的範圍中的Client,Server會從這個這個列表中獲得最近一個該Client的認證時間,只有當Authenticator中的Timestamp晚於通過一個Client的最近的認證時間的情況下,Server採用進行後續的認證流程。

Time Synchronization的重要性

上述 基於Timestamp的認證機制只有在Client和Server端的時間保持同步的情況才有意義。所以保持Time Synchronization在整個認證過程中顯得尤為重要。在一個Domain中,一般通過訪問同一個Time Service獲得當前時間的方式來實現時間的同步。

雙向認證(Mutual Authentication)

Kerberos一個重要的優勢在於它能夠提供雙向認證:不但Server可以對Client 進行認證,Client也能對Server進行認證

具體過程是這樣的,如果Client需要對他訪問的Server進行認證,會在它向Server傳送的Credential中設定一個是否需要認證的Flag。Server在對Client認證成功之後,會把Authenticator中的Timestamp提出出來,通過Session Key進行加密,當Client接收到並使用Session Key進行解密之後,如果確認Timestamp和原來的完全一致,那麼他可以認定Server正式他試圖訪問的Server。

那麼為什麼Server不直接把通過Session Key進行加密的Authenticator原樣傳送給Client,而要把Timestamp提取出來加密傳送給Client呢?原因在於防止惡意的監聽者通過獲取的Client傳送的Authenticator冒充Server獲得Client的認證。


四、引入Ticket Granting  Service

通過上面的介紹,我們發現Kerberos實際上一個基於Ticket的認證方式。Client想要獲取Server端的資源,先得通過Server的認證;而認證的先決條件是Client向Server提供從KDC獲得的一個有Server的Master Key進行加密的Session Ticket(Session Key + Client Info)。可以這麼說,Session Ticket是Client進入Server領域的一張門票。而這張門票必須從一個合法的Ticket頒發機構獲得,這個頒發機構就是Client和Server雙方信任的KDC, 同時這張Ticket具有超強的防偽標識:它是被Server的Master Key加密的。對Client來說, 獲得Session Ticket是整個認證過程中最為關鍵的部分。

上面我們只是簡單地從大體上說明了KDC向Client分發Ticket的過程,而真正在Kerberos中的Ticket Distribution要複雜一些。為了更好的說明整個Ticket Distribution的過程,我在這裡做一個類比。現在的股事很火爆,上海基本上是全民炒股,我就舉一個認股權證的例子。有的上市公司在股票配股、增發、基金擴募、股份減持等情況會向公眾發行認股權證,認股權證的持有人可以憑藉這個權證認購一定數量的該公司股票,認股權證是一種具有看漲期權的金融衍生產品。

而我們今天所講的Client獲得Ticket的過程也和通過認股權證購買股票的過程類似。如果我們把Client提供給Server進行認證的Ticket比作股票的話,那麼Client在從KDC那邊獲得Ticket之前,需要先獲得這個Ticket的認購權證,這個認購權證在Kerberos中被稱為TGT:Ticket Granting Ticket,TGT的分發方仍然是KDC。

我們現在來看看Client是如何從KDC處獲得TGT的:首先Client向KDC發起對TGT的申請,申請的內容大致可以這樣表示:“我需要一張TGT用以申請獲取用以訪問所有Server的Ticket”。KDC在收到該申請請求後,生成一個用於該Client和KDC進行安全通訊的Session Key(SKDC-Client)。為了保證該Session Key僅供該Client和自己使用,KDC使用Client的Master Key自己的Master Key對生成的Session Key進行加密,從而獲得兩個加密的SKDC-Client的Copy。對於後者,隨SKDC-Client一起被加密的還包含以後用於鑑定Client身份的關於Client的一些資訊。最後KDC將這兩份Copy一併傳送給Client。這裡有一點需要注意的是:為了免去KDC對於基於不同Client的Session Key進行維護的麻煩,就像Server不會儲存Session Key(SServer-Client)一樣,KDC也不會去儲存這個Session Key(SKDC-Client),而選擇完全靠Client自己提供的方式。


當Client收到KDC的兩個加密資料包之後,先使用自己的Master Key對第一個Copy進行解密,從而獲得KDC和Client的Session Key(SKDC-Client),並把該Session 和TGT進行快取。有了Session Key和TGT,Client自己的Master Key將不再需要,因為此後Client可以使用SKDC-Client向KDC申請用以訪問每個Server的Ticket,相對於Client的Master Key這個Long-term Key,SKDC-Client是一個Short-term Key,安全保證得到更好的保障,這也是Kerberos多了這一步的關鍵所在。同時需要注意的是SKDC-Client是一個Session Key,他具有自己的生命週期,同時TGT和Session相互關聯,當Session Key過期,TGT也就宣告失效,此後Client不得不重新向KDC申請新的TGT,KDC將會生成一個不同Session Key和與之關聯的TGT。同時,由於Client Log off也導致SKDC-Client的失效,所以SKDC-Client又被稱為Logon Session Key

接下來,我們看看Client如何使用TGT來從KDC獲得基於某個Server的Ticket。在這裡我要強調一下,Ticket是基於某個具體的Server的,而TGT則是和具體的Server無關的,Client可以使用一個TGT從KDC獲得基於不同Server的Ticket。我們言歸正傳,Client在獲得自己和KDC的Session Key(SKDC-Client)之後,生成自己的Authenticator以及所要訪問的Server名稱的並使用SKDC-Client進行加密。隨後連同TGT一併傳送給KDC。KDC使用自己的Master Key對TGT進行解密,提取Client Info和Session Key(SKDC-Client),然後使用這個SKDC-Client解密Authenticator獲得Client Info,對兩個Client Info進行比較進而驗證對方的真實身份。驗證成功,生成一份基於Client所要訪問的Server的Ticket給Client,這個過程就是我們第二節中介紹的一樣了。 


五、Kerberos的3個Sub-protocol:整個Authentication

通過以上的介紹,我們基本上了解了整個Kerberos authentication的整個流程:整個流程大體上包含以下3個子過程:

  1. Client向KDC申請TGT(Ticket Granting Ticket)。
  2. Client通過獲得TGT向DKC申請用於訪問Server的Ticket。
  3. Client最終向為了Server對自己的認證向其提交Ticket。

不過上面的介紹離真正的Kerberos Authentication還是有一點出入。Kerberos整個認證過程通過3個sub-protocol來完成。這個3個Sub-Protocol分別完成上面列出的3個子過程。這3個sub-protocol分別為:

  1. Authentication Service Exchange
  2. Ticket Granting Service Exchange
  3. Client/Server Exchange

下圖簡單展示了完成這個3個Sub-protocol所進行Message Exchange。


1. Authentication Service Exchange

通過這個Sub-protocol,KDC(確切地說是KDC中的Authentication Service)實現對Client身份的確認,並頒發給該Client一個TGT。具體過程如下:

Client向KDC的Authentication Service傳送Authentication Service Request(KRB_AS_REQ), 為了確保KRB_AS_REQ僅限於自己和KDC知道,Client使用自己的Master Key對KRB_AS_REQ的主體部分進行加密(KDC可以通過Domain 的Account Database獲得該Client的Master Key)。KRB_AS_REQ的大體包含以下的內容:

  • Pre-authentication data:包含用以證明自己身份的資訊。說白了,就是證明自己知道自己聲稱的那個account的Password。一般地,它的內容是一個被Client的Master key加密過的Timestamp。
  • Client name & realm: 簡單地說就是Domain name\Client
  • Server Name:注意這裡的Server Name並不是Client真正要訪問的Server的名稱,而我們也說了TGT是和Server無關的(Client只能使用Ticket,而不是TGT去訪問Server)。這裡的Server Name實際上是KDC的Ticket Granting Service的Server Name

AS(Authentication Service)通過它接收到的KRB_AS_REQ驗證傳送方的是否是在Client name & realm中聲稱的那個人,也就是說要驗證傳送放是否知道Client的Password。所以AS只需從Account Database中提取Client對應的Master Key對Pre-authentication data進行解密,如果是一個合法的Timestamp,則可以證明發送放提供的是正確無誤的密碼。驗證通過之後,AS將一份Authentication Service Response(KRB_AS_REP)傳送給Client。KRB_AS_REQ主要包含兩個部分:本Client的Master Key加密過的Session Key(SKDC-Client:Logon Session Key)和被自己(KDC)加密的TGT。而TGT大體又包含以下的內容:

  • Session Key: SKDC-Client:Logon Session Key
  • Client name & realm: 簡單地說就是Domain name\Client
  • End time: TGT到期的時間。

Client通過自己的Master Key對第一部分解密獲得Session Key(SKDC-Client:Logon Session Key)之後,攜帶著TGT便可以進入下一步:TGS(Ticket Granting Service)Exchange。

2. TGS(Ticket Granting Service)Exchange

TGS(Ticket Granting Service)Exchange通過Client向KDC中的TGS(Ticket Granting Service)傳送Ticket Granting Service Request(KRB_TGS_REQ)開始。KRB_TGS_REQ大體包含以下的內容:

  • TGT:Client通過AS Exchange獲得的Ticket Granting Ticket,TGT被KDC的Master Key進行加密。
  • Authenticator:用以證明當初TGT的擁有者是否就是自己,所以它必須以TGT的辦法方和自己的Session Key(SKDC-Client:Logon Session Key)來進行加密。
  • Client name & realm: 簡單地說就是Domain name\Client。
  • Server name & realm: 簡單地說就是Domain name\Server,這回是Client試圖訪問的那個Server。

TGS收到KRB_TGS_REQ在發給Client真正的Ticket之前,先得整個Client提供的那個TGT是否是AS頒發給它的。於是它不得不通過Client提供的Authenticator來證明。但是Authentication是通過Logon Session Key(SKDC-Client)進行加密的,而自己並沒有儲存這個Session Key。所以TGS先得通過自己的Master Key對Client提供的TGT進行解密,從而獲得這個Logon Session Key(SKDC-Client),再通過這個Logon Session Key(SKDC-Client)解密Authenticator進行驗證。驗證通過向對方傳送Ticket Granting Service Response(KRB_TGS_REP)。這個KRB_TGS_REP有兩部分組成:使用Logon Session Key(SKDC-Client)加密過用於Client和Server的Session Key(SServer-Client)和使用Server的Master Key進行加密的Ticket。該Ticket大體包含以下一些內容:

  • Session Key:SServer-Client。
  • Client name & realm: 簡單地說就是Domain name\Client。
  • End time: Ticket的到期時間。

Client收到KRB_TGS_REP,使用Logon Session Key(SKDC-Client)解密第一部分後獲得Session Key(SServer-Client)。有了Session Key和Ticket,Client就可以之間和Server進行互動,而無須在通過KDC作中間人了。所以我們說Kerberos是一種高效的認證方式,它可以直接通過Client和Server雙方來完成,不像Windows NT 4下的NTLM認證方式,每次認證都要通過一個雙方信任的第3方來完成。

我們現在來看看 Client如果使用Ticket和Server怎樣進行互動的,這個階段通過我們的第3個Sub-protocol來完成:CS(Client/Server )Exchange

3. CS(Client/Server )Exchange

這個已經在本文的第二節中已經介紹過,對於重複發內容就不再累贅了。Client通過TGS Exchange獲得Client和Server的Session Key(SServer-Client),隨後建立用於證明自己就是Ticket的真正所有者的Authenticator,並使用Session Key(SServer-Client)進行加密。最後將這個被加密過的Authenticator和Ticket作為Application Service Request(KRB_AP_REQ)傳送給Server。除了上述兩項內容之外,KRB_AP_REQ還包含一個Flag用於表示Client是否需要進行雙向驗證(Mutual Authentication)。

Server接收到KRB_AP_REQ之後,通過自己的Master Key解密Ticket,從而獲得Session Key(SServer-Client)。通過Session Key(SServer-Client)解密Authenticator,進而驗證對方的身份。驗證成功,讓Client訪問需要訪問的資源,否則直接拒絕對方的請求。

對於需要進行雙向驗證,Server從Authenticator提取Timestamp,使用Session Key(SServer-Client)進行加密,並將其傳送給Client用於Client驗證Server的身份。


六、User2User Sub-Protocol:有效地保障Server的安全

通過3個Sub-protocol的介紹,我們可以全面地掌握整個Kerberos的認證過程。實際上,在Windows 2000時代,基於Kerberos的Windows Authentication就是按照這樣的工作流程來進行的。但是我在上面一節結束的時候也說了,基於3個Sub-protocol的Kerberos作為一種Network Authentication是具有它自己的侷限和安全隱患的。我在整篇文章一直在強調這樣的一個原則:以某個Entity的Long-term Key加密的資料不應該在網路中傳遞。原因很簡單,所有的加密演算法都不能保證100%的安全,對加密的資料進行解密只是一個時間的過程,最大限度地提供安全保障的做法就是:使用一個Short-term key(Session Key)代替Long-term Key對資料進行加密,使得惡意使用者對其解密獲得加密的Key時,該Key早已失效。但是對於3個Sub-Protocol的C/S Exchange,Client攜帶的Ticket卻是被Server Master Key進行加密的,這顯現不符合我們提出的原則,降低Server的安全係數。

所以我們必須尋求一種解決方案來解決上面的問題。這個解決方案很明顯:就是採用一個Short-term的Session Key,而不是Server Master Key對Ticket進行加密。這就是我們今天要介紹的Kerberos的第4個Sub-protocol:User2User Protocol。我們知道,既然是Session Key,僅必然涉及到兩方,而在Kerberos整個認證過程涉及到3方:Client、Server和KDC,所以用於加密Ticket的只可能是Server和KDC之間的Session Key(SKDC-Server)。

我們知道Client通過在AS Exchange階段獲得的TGT從KDC那麼獲得訪問Server的Ticket。原來的Ticket是通過Server的Master Key進行加密的,而這個Master Key可以通過Account Database獲得。但是現在KDC需要使用Server和KDC之間的SKDC-Server進行加密,而KDC是不會維護這個Session Key,所以這個Session Key只能靠申請Ticket的Client提供。所以在AS Exchange和TGS Exchange之間,Client還得對Server進行請求已獲得Server和KDC之間的Session Key(SKDC-Server)。而對於Server來說,它可以像Client一樣通過AS Exchange獲得他和KDC之間的Session Key(SKDC-Server)和一個封裝了這個Session Key並被KDC的Master Key進行加密的TGT,一旦獲得這個TGT,Server會快取它,以待Client對它的請求。我們現在來詳細地討論這一過程。


上圖基本上翻譯了基於User2User的認證過程,這個過程由4個步驟組成。我們發現較之我在上面一節介紹的基於傳統3個Sub-protocol的認證過程,這次對了第2部。我們從頭到尾簡單地過一遍:

  1. AS Exchange:Client通過此過程獲得了屬於自己的TGT,有了此TGT,Client可憑此向KDC申請用於訪問某個Server的Ticket。
  2. 這一步的主要任務是獲得封裝了Server和KDC的Session Key(SKDC-Server)的屬於Server的TGT。如果該TGT存在於Server的快取中,則Server會直接將其返回給Client。否則通過AS Exchange從KDC獲取。
  3. TGS Exchange:Client通過向KDC提供自己的TGT,Server的TGT以及Authenticator向KDC申請用於訪問Server的Ticket。KDC使用先用自己的Master Key解密Client的TGT獲得SKDC-Client,通過SKDC-Client解密Authenticator驗證傳送者是否是TGT的真正擁有者,驗證通過再用自己的Master Key解密Server的TGT獲得KDC和Server 的Session Key(SKDC-Server),並用該Session Key加密Ticket返回給Client。
  4. C/S Exchange:Client攜帶者通過KDC和Server 的Session Key(SKDC-Server)進行加密的Ticket和通過Client和Server的Session Key(SServer-Client)的Authenticator訪問Server,Server通過SKDC-Server解密Ticket獲得SServer-Client,通過SServer-Client解密Authenticator實現對Client的驗證。

這就是整個過程。

七、Kerberos的優點

分析整個Kerberos的認證過程之後,我們來總結一下Kerberos都有哪些優點:

1.較高的Performance

雖然我們一再地說Kerberos是一個涉及到3方的認證過程:Client、Server、KDC。但是一旦Client獲得用過訪問某個Server的Ticket,該Server就能根據這個Ticket實現對Client的驗證,而無須KDC的再次參與。和傳統的基於Windows NT 4.0的每個完全依賴Trusted Third Party的NTLM比較,具有較大的效能提升。

2.實現了雙向驗證(Mutual Authentication)

傳統的NTLM認證基於這樣一個前提:Client訪問的遠端的Service是可信的、無需對於進行驗證,所以NTLM不曾提供雙向驗證的功能。這顯然有點理想主義,為此Kerberos彌補了這個不足:Client在訪問Server的資源之前,可以要求對Server的身份執行認證。

3.對Delegation的支援

Impersonation和Delegation是一個分散式環境中兩個重要的功能。Impersonation允許Server在本地使用Logon 的Account執行某些操作,Delegation需用Server將logon的Account帶入到另過一個Context執行相應的操作。NTLM僅對Impersonation提供支援,而Kerberos通過一種雙向的、可傳遞的(Mutual 、Transitive)信任模式實現了對Delegation的支援。

4.互操作性(Interoperability)

Kerberos最初由MIT首創,現在已經成為一行被廣泛接受的標準。所以對於不同的平臺可以進行廣泛的互操作。