# Kerberos 最近在上網路安全,突如其來的小考讓平時恍神的我突然醒了一下,天啊,老師上課花了很多時間講kerberos,但突然要我說明他是什麼實在是太突然拉,所以我決定開始念(被打XD),kerberos主要是一個client與server相互認證的一個機制,這之中也是非常有學問的,一個簡單的例子,假設A跟B講好的他們之間的暗號,以後證明身分就靠這個,但是問題來了,他們的暗號安全嗎? 確定不會有人知道,又或者是他們要怎樣傳遞暗號,以及如何去辨別這暗號是正確的(這邊大家可能會想說,阿暗號不是就說好的嗎,這只是個比喻XD,在認證過程中有許多要去辨別對方送來的東西是否正確,而辨別方式有很多種) 以下我試著去筆記kerberos4,也歡迎看到觀念或錯字的糾正我 **抱歉 比較沒有圖可以呈現(怕亂抓有版權問題),如果大家對過程還是很不熟的可以邊看圖在看講解 此筆記參考書目為Network Security Essentials 現在有一個client 以及server,client要如何去做驗證呢? kerberos提出一個authentication server 以下簡稱AS 這個在這邊是個很重要的腳色,他處於第三方幫忙認證,client會將三樣資料交給AS,client ID ,client password,server ID,而AS做了以下的檢查 * client 的ID password是否正確 * 他是否有權利可以access 他提出的server 如果都有的話,AS將會回傳一個ticket給client, 此ticket包含了以下資訊 * client ID * network address * server ID 而AS與server,有一隻他們獨有的key(因為可能這個AS同時有很服務很多個server),而這個ticket將會被加密藉由這支key 當有了這ticket,client將能把ticket以及自己的ID送至server * client ID * ticket ,由server解密後(只有server能解密)看裡面的認證以及client的ID是否吻合,是的話接著就能提供服務 ------------------------------------------------- 但是其實還是有很多問題存在 舉一個例子,假設A想要access Mail server但ticket有效次數只有一次(用完即失效),等於是他每次要access一次就需要再輸入一次密碼,很不方便!! 好這時你會說,那就讓AS跟server說好ticket的有效期限為一天,這一天中你都可以任意使用服務阿~ 下個問題就來了,那如果有各種其他的服務要使用我是不是也都要各輸入一次帳密(沒錯.......人類的意見就是這麼多) 為了解決這個問題,我們將引入ticket-grating server(TGS )的概念,AS仍然需要喔! 首先client將自己的ID以及某一台TGS的ID,送出給AS,AS收到後,根據自己的資料庫(他當然會有client的帳密對照表),利用client的密碼去加密回傳的ticket.tgs(這邊特別強調是TGS的ticket),這樣一來,正常情況下只有client能查看這個ticket.tgs(因為client一定知道自己的密碼XD 用密碼去解密) 此ticket.tgs包含了以下的東西 * client ID * network address of c * tgs ID * timestamp1(紀錄產生的時間) * lifetime1(有效期限) 重要的是,ticket.tgs還被加了一層密,用只有AS跟TGS知道的K密鑰(也就是說當你拿到手上的ticket.tgs被加了兩層拉~一層是用你的密碼,一層就是用這個key),用以確保只有你本人能用這支ticket拉 這時client會在將以下送至TGS獲取ticket.service(要用來access server用的 ) * client ID * Server ID * ticket.tgs TGS在驗證你的client ID以及ticket.tgs裡面的client ID是否吻合,還有timestamp,與lifetime(他要先解密),會回傳 ticket.service給client,這裡面包含 * client ID * network address of c * server ID * timestamp2 * lifetime2 一樣,TGS會利用他與server共用的key去加密,只有server能解密,之後client再將這隻ticket.service送去server 讓server解密後並看看裡面的資料是否都吻合,是的話就能提供服務囉~ ------------------------------------------------- 那至於為何要timestamp?這是在client用自己的密碼解密後送出,這之中有人設法取到你的ticket.tgs(client已解密)他就能假裝成是你,利用他,所以利用timestamp就能查看說,你怎麼在過了這麼久之後才來找我?你可能不是本人,就會拒絕你,但因此你需要注意時間同步問題 然後我們討論一下lifetime的議題,若lifetime時間太長,攻擊指很有可能竊聽你的ticket用來access你的server,但太短,使用者又必須一直輸入密碼 這時我們必須加入最後一項認證機制 **除了驗證這個ticket之外,你還必須驗證是誰在用這ticket** 所以認證步驟再重新更新一遍(筆者覺得好累.........) 第一步一樣 * Client->AS送出了 * client ID * TGS server ID * TS1(timestamp) * 而AS->Client 回傳了 * E(K_c [K_c,tgs | TGS server ID |TS2 |lifetime2 | ticket_tgs])這邊第一個**K_c指的是以下都用K_c加密(Kc為client的password)後面有相關的以此類推** * 其中 ticket_tgs裡含了 * E(K_tgs,[K_c,tgs | clientID | network address | TGS server ID |timestamp2| lifetime2]) 好到這邊,是不是有點亂了,大家麻煩手邊還是有個紙筆慢慢看會比較好,其中這k_c,tgs這支key等等才會用到,只有當client解密了 K_c才看到到, 好接下來再繼續將ticket送到TGS * Client->TGS * server ID * ticket_tgs * Authenticator(用來說明自己真的是這個ticket的主人) * 其中Authenticator裡面包含了 * E(K_c,tgs [client ID | netwrok access | timestamp3 ]) 這邊就注意到,剛剛的K_c,tgs被用來加密,只有tgs知道這是來自於哪個client,再加上timestamp可以防禦有人拿你的ticket來假冒你,等於是做到雙重保護(1.你就是本人2.時間過太久會不讓你access) * TGS->Client * E(K_c,tgs[K_c,v | Client ID | timestamp3 |ticket_v]) * 其中ticket_v裡面有 * E(K_v,[K_c,v | client ID | network address | TGS ID | timestamp4| lifetime4]) 這邊的K_c,v的概念就跟K_c,tgs一樣,我就不重覆再說一次了,往上找就可以看到了 最後 * Client->Server * Ticket_v|Authenticator * 其中Authenticator為 * E(K_c,v[client ID|network access | timestamp5]) * Server->Client * E(K_c,v[Timestamp5]) 這樣就大功告成了,雖然這樣真的很複雜,但就是安全度跟方便性都在提升一個層次,透過一階段一階段說明也會比較能搞清楚為何要這樣去跑流程,比起一開始直接看最後一個XD 應該就先筆記到這邊,有問題都可以留言問筆者