實驗目的
Kerberos的基本思想
Kerberos的應用范圍
Kerberos驗證流程的原理
利用wireshark以及所掌握的知識分析Kerberos數據包
實驗工具
wireshark
實驗環境
操作機:Windows XP
實驗步驟
Kerberos的基本思想
采用對稱秘鑰體制對信息進行加密,能正確對信息進行解密的用戶即為合法用戶。用戶在對應服務器進行訪問之前,必須先從Kerberos服務器獲取該應用服務其的許可證(ticket)。
Kerberos的實現原理
那么這個Kerberos是什么意思呢?相信看過希臘神話或者《聖斗士-冥王篇》的朋友應該都知道,在渡過了冥河之后,冥界的大門由一只巨大的三頭獵犬所看守,保證冥界的大門只許進不許出,令冥界之門固若金湯。而這只獵犬的名字就是Kerberos,應用於我們所講的網絡認證中,表示這是安全的象征。
在實際的網絡應用中,Kerberos的認證結果是雙向的,也就是當帳號A訪問資源B的時候,不但B要確保A並非冒充,而且A也要查明B的真實身份。而雙向認證的方式並不止一種,最簡單的方式就是互報接頭暗號。但是這種方式的弊端有很多,最大的問題是管理起來不方便。比如在一個數百名員工共享幾百台機器的環境中,當加入一名新員工時,就需要在幾百台的機器上更新帳號信息。那么這對於網絡管理員來說是無法容忍的。
為了解決這個問題,Kerberos引入了一個權威的第三方來專門負責身份的認證工作。這個第三方就稱之為KDC(Key Distribute Center),他知道所有的賬號和密碼。這樣一來,假如賬號A想要訪問資源B,那么利用KDC就可以驗證雙方的身份了。因此,A和B都不需要知道對方的密碼,可以完全依賴於KDC。
①用戶想要獲取訪問某一應用服務器的許可證時,先以明文方式向認證服務器AS發出請求,要求獲得訪問TGS的許可證。
②AS以證書(credential)作為響應,證書包括訪問TGS的許可證和用戶與TGS間的會話密鑰。會話密鑰以用戶的密鑰加密后傳輸。
③用戶解密得到TGS的響應,然后利用TGS的許可證向TGS申請應用服務器的許可證,該申請包括TGS的許可證和一個帶有時間戳的認證符(authenticator)。認證符以用戶與TGS間的會話密鑰加密。
④TGS從許可證中取出會話密鑰、解密認證符,驗證認證符中時間戳的有效性,從而確定用戶的請求是否合法。TGS確認用戶的合法性后,生成所要求的應用服務器的許可證,許可證中含有新產生的用戶與應用服務器之間的會話密鑰。TGS將應用服務器的許可證和會話密鑰傳回到用戶。
⑤用戶向應用服務器提交應用服務器的許可證和用戶新產生的帶時間戳的認證符(認證符以用戶與應用服務器之間的會話密鑰加密)。
⑥應用服務器從許可證中取出會話密鑰、解密認證符,取出時間戳並檢驗有效性。然后向用戶返回一個帶時間戳的認證符,該認證符以用戶與應用服務器之間的會話密鑰進行加密。據此,用戶可以驗證應用服務器的合法性。
Kerberos的原理的整個驗證流程可以分為三大步驟,結合實驗分析如下所示:
第一步,賬號A和KDC互相認證。
1、賬號A利用哈希函數將密碼轉化成一把密鑰,這里稱它為Key-Client。
2、利用Key-Client將當前的時間戳加密(對稱加密),生成一個字符串。表示為“{時間戳} Key-Client”。
3、將上一步生成的字符串“{時間戳} Key-Client”、賬號A的信息以及一段隨機字符串發給KDC。這樣就組成了Kerberos的身份認證請求AS-REQ,可以使用下面的公式來表示:AS-REQ=“{時間戳} Key-Client”+“賬號A的信息”+“隨機字符串”。
如下圖所示:
這里需要注意的是,當前捕獲文件中的數據是處於加密狀態的,這不利於我們的分析。不過只要知道密碼,就可以生成解密文,我們可以在菜單欄中選擇“Edit”->”Preferences”->”Protocols”->”KRB5”,之后勾選兩個選項,並輸入解密文件的名稱,之后就可以看到解密后的內容了。解密文件的路徑最好不要有中文,放在C盤根目錄下即可。之后再次查看第一個數據包的內容:
上圖中的KerberosString后面的內容就是賬號A的信息,而nonce后面的內容就是隨機字符串。
4、KDC收到AS-REQ之后,讀取到A的信息,就可以調出A的密碼,再使用同樣的哈希函數將其轉化為Key-Client。有了Key-Client就可以解開“{時間戳} Key-Client”了。如果能夠成功解開,就說明這個請求是由賬號A生成的,畢竟其它賬號不可能有Key-Client進行加密。
Kerberos之所以使用時間戳進行加密,原因就在於如果黑客在網絡上截獲了字符串“{時間戳} Key-Client”,那么就有可能偽裝成賬戶A來欺騙認證。這種方式就稱為重放攻擊。采用這種攻擊方式需要一定的時間,所以KDC把解密得到的時間戳和當前的時間作對比,如果二者的差異過大,那么就可以認為遭受到了重放攻擊。假如采用與時間無關的字符進行加密,那么是無法避開重放攻擊的,因此這就要求域中的所有計算機要在時間上同步。
5、接下來,KDC需要向賬號A證明自己的身份,剛才提到的隨機字符串就需要用在這里。理論上KDC只要使用Key-Client加密隨機字符串,再回復給賬號A就可以證明自己的身份了。因為假的KDC是沒有Key-Client的,那么賬戶A收到假的KDC的回復后,解不開那個隨機字符串,就知道KDC是假的。
總結上面的流程,賬號A和KDC都沒有向對方發送密碼,所以即便有一方是假的也不會導致信息的泄露。如果雙方都是真的,則可以實現相互認證的過程。但是這個機制中的KDC是非常忙碌的,因為每次的認證都需要調出密碼賬號、進行哈希運算、實現解密操作……每個客戶端一天可能會驗證數十次,那么域中就需要配置大量的KDC才能夠負擔得起,因此改進流程就顯得很有必要了。Kerberos在這里設計了一個比較巧妙的方法:
【solution:】
a.KDC生成兩把一模一樣的密鑰Key-Client-KDC,用於以后賬戶A和KDC之間相互的認證,這樣就省去了調出賬號A的密碼和哈希等的工作。按理說其中的一把Key-Client-KDC應當由賬戶A保管,另一把由KDC自己保管。但是KDC本來就很忙碌,額外再保管密鑰會加重自身的負擔,因此這個密鑰就委托給賬戶A來保管,那么以后賬戶A需要KDC的時候,再把這個密鑰還回來就可以了。但是這里面有一個問題,那就是如果有個假冒的賬戶A交回來一個假的密鑰怎么辦?為了避免這個問題,KDC把自己的密碼哈希成Key-KDC,然后用它加密那把委托給賬戶A的密鑰。Kerberos將這個密鑰稱為TGT(Ticket Granting Ticket),可以用以下公式表示:
TGT={賬戶A的相關信息,Key-Client-KDC} Key-KDC
有了這個委托保管的機制,那么KDC只需要記住自己的Key-KDC,就可以解開委托給所有賬號的TGT,從而獲得與該帳號之間的密鑰。通過這個機制,KDC的工作負擔就大大降低了。那么總結以上可以知道,KDC回復給賬戶A的AS-REP應當包括以下信息:
AS-REP=TGT,{ Key-Client-KDC,時間戳,隨機字符串} Key-Client
那么相對應的,就是捕獲文件中2號數據包的內容:
這其中的ticket就是TGT,下面的key表示的是Key-Client-KDC,Lr-time是時間戳,nonce是隨機字符串,它與第一個數據包中的字符串是一致的。
b. 賬戶A收到AS-REP之后,利用Key-Client解密“{ Key-Client-KDC,時間戳,隨機字符串} Key-Client”,通過解密得到的隨機字符串和時間戳來確定KDC的真實性,然后把Key-Client-KDC和TGT保存起來備用。
第二步,賬號A請KDC幫忙認證資源B。
1、現在應當把TGT交還給KDC,其次還有賬戶A的相關信息、當前時間戳以及要訪問的資源B的信息。這個請求在Kerberos中被稱為TGS-REQ,可以使用以下公式表示:
TGS-REQ=TGT,{賬戶A的相關信息,時間戳} Key-Client-KDC,“資源B的相關信息”
如下圖所示:
圖中的ticket是要交還給KDC的TGT,下面的KerberosString表示A的帳號信息,ctime是時間戳,最后的兩個KerberosString表示資源B的信息。
2、KDC收到TGS-REQ之后,先使用Key-KDC解密TGT得到Key-Client-KDC,再使用Key-Client-KDC解密出賬號A的相關信息和時間戳來驗證其身份。一旦認定賬號A為真,那么接下來就要幫助A和B進行相互認證了。
3、KDC生成兩把同樣的密鑰供A和B之間使用,我們就稱這個密鑰為Key-Client-Server。其中一把密鑰直接交給賬號A,另一把委托A轉交給資源B。為了確保A不會受到假的資源B所騙,Kerberos把B的密碼哈希成Key-Server,然后用它加密那把委托A轉交給B的Key-Client-Server,成為一個只有真正的B才能夠解密的ticket。總結以上,KDC給賬號A的回復可以表示為:
Ticket={賬號A的信息,Key-Client-Server} Key-Server
TGS-REP={ Key-Client-Server} Key-Client-KDC,ticket
這里的“賬號A的信息”不單單包括A的名稱,還包括A所在的域組(Domain Groups)。因此如果A屬於很多個組(Groups),那么TGS-REP數據包就會很大。如下圖所示:
上圖中的ticket就是“{賬號A的信息,Key-Client-Server} Key-Server”,cipher后面的內容就是“{ Key-Client-Server} Key-Client-KDC”,下面的keyvalue的值就是Key-Client-Server。
4、賬號A收到TGS-REP之后,首先使用Key-Client-KDC解開{ Key-Client-Server} Key-Client-KDC,從而得到Key-Client-Server。Ticket留下來發給資源B。接下來如果需要多次訪問資源B,都可以使用同一個ticket,而不需要每次都向KDC申請,這就降低了KDC的負擔。
第三步,賬號A和資源B互相認證。
1、這時候,賬號A給資源B發送“{賬號A的信息,時間戳} Key-Client-Server”以及之前收到的ticket,這個請求稱為AP-REQ:
AP-REQ=“{賬號A的信息,時間戳} Key-Client-Server”,ticket
如下圖所示:
2、如果資源B是假的,那么它就解不開ticket。如果資源B是真的,它可以用自己的密碼生成Key-Server來解開ticket,從而得到Key-Client-Server。有了Key-Client-Server就可以解開“{賬號A的信息,時間戳} Key-Client-Server”部分。這樣資源B就可以確定賬號A為真,然后回復AP-REP來證明自己也是真的:
AP-REP={時間戳} Key-Client-Server
3、賬號A利用Key-Client-Server來解密AP-REP,再通過得到的時間戳來判斷對方是否為真。如下圖所示:
實驗結果分析與總結
Kerberos的主要優點:
通過對實體和服務的統一管理實現單一注冊,也就是說用戶通過在網絡中的一個地方的一次登錄就可以使用網絡上他可以獲得的所有資源。
Kerberos存在的問題:
①Kerberos服務器的損壞將使得整個安全系統無法工作;
②AS在傳輸用戶與TGS間的會話密鑰時是以用戶密鑰加密的,而用戶密鑰是由用戶口令生成的,因此可能受到口令猜測的攻擊;
③Kerberos使用了時間戳,因此存在時間同步問題;
④要將Kerberos用於某一應用系統,則該系統的客戶端和服務器端軟件都要作一定的修改。