本文是我在看了這篇英文說明之后的總結
https://technet.microsoft.com/zh-cn/library/cc961976.aspx
是總結,不是翻譯,所以是我看后按自己的理解寫的,如有問題,請指正!
Kerberos在古希臘神話中是指:一只有三個頭的狗。這條狗守護在地獄之門外,防止活人闖入。Kerberos協議以此命名,因為協議的重要組成部分也是三個:client, server, KDC(密鑰分發中心). 要了解Kerberos協議的工作過程,先了解不含KDC的簡單相互身份驗證過程。
1. 簡單的相互身份驗證
A向B發送信息時,會附加一個Authenticator(認證碼,該數據結構=身份信息+時間戳)來進行彼此的身份驗證。開始驗證之前,A和B已經有一個有且只有二人知曉的密鑰。下面是工作流程:
a. A用密鑰加密了【信息+Authenticator(身份信息+時間戳)】,將其發給B
b. B用密鑰解密了A發來的Authenticator,並將其中包含的時間戳記錄下來。B將這個時間戳與自己的當前時間進行比較,如果這個時間差大於某個值(windows下默認是5分鍾),B認為信息不是A發來的,拒絕后續驗證。如果這個時間差小於設定值,B要檢查在過去5分鍾內,是否存在含有更早時間戳的Authenticator,如果沒有,B認為信息確實是A發來了。至此,完成了B對A的驗證。
c. B用密鑰加密Athenticator里的時間戳,然后將其發回給A,以證明自己確實是B.
d. A收到后,解密出時間戳,經過自己的對比,確認了對方確實是B. 至此,完成了A對B的驗證
2. 引入session key和密鑰分發中心KDC
實現簡單相互身份驗證有一個前提,即,A和B必須有一個有且只有二人知曉的密鑰。在2中,我們要設計一個密鑰分發機制來完善1的流程。這里引入key distribution center, KDC密鑰分發中心。當A嘗試向B發信息時,KDC會分別向A、B發放一個加密過的session key,這相當於1中那個有且只有AB雙方知曉的密鑰(注意,在傳輸過程中,session key要再包裹一層密鑰進行加密,下面將具體說到)。
3. 引入secret key(密鑰的加密)
session key在傳輸過程中需要加密。因此我們又引入了一個加密密鑰,叫做secret key(或者叫long term key,在用戶賬號驗證中,這個key是衍生自賬號密碼). 這個key是KDC和A(或B)之間有且只有雙方知曉的一個密鑰。KDC與A之間進行傳輸時,是由僅有A與KDC雙方知曉的key加密。KDC與B之間進行傳輸時,是由僅有B與KDC雙方知曉的key加密。
4. 引入session ticket(密鑰的識別)
實際應用中,一個KDC對應着許許多多的客戶端和服務端,每個客戶端與服務端之間都有一個共享的session key(密鑰)。為了區別這些session key,我們引入session ticket的概念,它是一種內嵌了session key和客戶端身份信息(原文authorization data for the client)的數據結構。相當於session key與客戶端的1對1表。
下面是具體工作過程:
a. 客戶端向KDC提交客戶端身份信息(這個傳輸過程使用客戶端secretkey進行加密),要求與服務端進行相互身份驗證。
b. KDC生成一個僅有客戶端與服務端知曉的session key。
c. KDC將session key附加上客戶端身份信息形成了session ticket,並用服務端secret key加密session ticke后傳給服務端。服務端收到了KDC回復,使用服務端secret key解密,獲得了有且只有客戶端和服務端二者知曉的密鑰session key。
d. KDC將【session key+服務端secret key加密后的session ticket】用客戶端secret key加密后,傳給客戶端。客戶端收到了KDC的回復,用客戶端secret key解密出【session key+服務端secret key加密后的session ticket】。解密出的兩部分內容分開地放在一個安全的緩存中(一塊隔離的內存空間,而不是硬盤上)。當客戶端再次向服務端發送信息時,客戶端就可以直接向服務端發送【要發送的信息+服務端secret key加密后的session ticket+用session key加密的Authenticator(身份信息+時間戳)】
e. 服務端收到了來自客戶端的以上憑據,先用服務端secret key將session ticket解密,取得內嵌在session ticket里的session key,用其將Authenticator解密,得到了客戶端發送消息的時間戳。之后按照1中簡單相互身份驗證過程中的步驟b, c, d繼續進行。
PS:
1. session ticket可以被重復使用。客戶端從KDC獲得session ticket后,會將其放在安全緩存中(一塊隔離的內存空間,而不是硬盤上)。每當客戶端想要訪問指定服務端,客戶端就出示相應的session ticket。
2. session ticket有失效期,通常是8小時,可以在相應的Kerberos策略中設置。
3. 服務端不需要存儲session ticket。KDC只負責發送信息,不驗證信息是否發放到正確的對象。因為即使發錯了對象,對方沒有secret key(有且只有KDC和正確對象知曉的密鑰),是解不開信息的。循序漸進了解Kerberos認證工作原理