# 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
應該就先筆記到這邊,有問題都可以留言問筆者