\r Kerberos首先聲明,這是一篇非常嚴(yán)謹(jǐn)?shù)目破瘴恼?,請認(rèn)真的,帶著思考進行閱讀。 \r
\r
\r Kerberos這一詞由來不得不追溯到希臘神話里三頭狗的故事,它其實本名叫Cerberus(刻耳柏洛斯),發(fā)音是不是很像?\r
\r
這只dog據(jù)說是希臘神話中惡魔王提豐的孩子,這個惡魔王的孩子都比較另類,除了這只dog以外,還有西游路上想吃唐僧肉的九頭蛇,以及任何場合都能讓人石化的美杜莎等等。這只dog既然不是善類,它肯定不是長這樣:\r
\r
網(wǎng)上某百科說它長這樣:\r
\r
\r
\r
姑且不論其長什么樣,但它的地位是無可替代的:那就是安全的守護者!它既防止活人進入冥界,又防止冥界的亡靈前往人間。 \r\r
\r
研發(fā)初衷是為了保護自己的網(wǎng)絡(luò)服務(wù)器。 \rr
為了打破這種局面,后來瑞典皇家理工在V4版本上包裝了一下,繞過了美國出口管制局,讓其可以在美國境外發(fā)行使用。后來這群人可能覺得人生需要一個新的高度,于是又發(fā)明了KerberosV5的版本。 \r
\r
雖然我們現(xiàn)在廣泛使用的也是KerberosV5的版本,但是可能和前面那個V5沒什么關(guān)系。 \r
\r
\r
\r
Kerberos目前作為一套網(wǎng)絡(luò)安全認(rèn)證協(xié)議,是為了解決網(wǎng)絡(luò)上一個“證明自己是自己”問題,讓服務(wù)端和客戶端建立相互信任機制。這個問題如果放到我們自己身上可能會很尷尬,如果你去派出所去開這么一個證明你媽是你媽的證明,往往會這樣: \r
\r
<p font-size:14px;background-color:#ffffff;"="" style="white-space: normal; text-align: center; color: rgb(51, 51, 51);"> \r\r
\r 那我們怎么證明自己是自己呢?\r
\r
\r \r
\r
\r 對于兩個需要需要互相訪問的客戶端/服務(wù)端,它們也需要這么一個證件或者信物,證明它們可以相互信任。簡單而言,它的場景是這樣的: \r
\r
\r \r
\r
\r \r
\r
\r 當(dāng)然,Kerberos作為一款有著廣泛使用基礎(chǔ),并且安全性極高的認(rèn)證協(xié)議,其內(nèi)部機制很復(fù)雜,接下來,我們就剖析一下Kerberos認(rèn)證。 \r
\r
\r
\r
\r
\r \r
\r
\r 在這個認(rèn)證過程中,會有3個角色:KDC(key distribution center)、Client(客戶端)、Server(服務(wù)端), 正好象征著三頭狗的三個頭(不要再糾結(jié)是三個頭還是五十個頭了!)。KDC是整個Kerberos認(rèn)證的核心模塊,負(fù)責(zé)存儲密鑰(長期和臨時)以及進行認(rèn)證。 \r
\r
\r 另外,我們需要了解四個概念: \r
\r
\r Long-Term Key: \r
\r
\r 那些長期存儲并且不會失效的數(shù)據(jù)信息; \r
\r
\r Short-Time Key: \r
\r
\r 臨時存儲的并且一段時間后就失效的數(shù)據(jù)信息; \r
\r
\r Master Key: \r
\r
\r 存儲在KDC中用戶標(biāo)識身份信息的數(shù)據(jù)信息; \r
\r
\r Session Key: \r
\r
\r 在認(rèn)證周期中使用到的數(shù)據(jù)信息,一旦超過認(rèn)證周期,認(rèn)證數(shù)據(jù)信息失效。 \r
\r
\r 一般來說,Master Key屬于Long-Term Key,這類信息長期存在KDC中,并且不會失效,無論是KDC自己,Client還是Server都有自己的Master Key. \r
\r
\r Session Key屬于Short-Time Key,其實是包含Master Key信息的臨時拷貝,這類信息只在認(rèn)證周期內(nèi)有效,一旦認(rèn)證期過,也就沒用了。 \r
\r
\r 大概兩者就是正式工和臨時工的區(qū)別吧。 \r
\r
\r
\r
\r
\r \r
\r
\r 整個認(rèn)證過程會用到Master Key和Session Key,但是認(rèn)證過程復(fù)雜, 一個Kerberos認(rèn)證過程要正常完成,需要有三個過程: \r
\r
\r
\r
\r
\r Authentication Service Exchange \r
\r
\r (KRB_AS_REQ) \r
\r
\r Client向KDC服務(wù)器獲取TGT(Ticket Grant ing Ticket),TGT是獲取Service Ticket的基礎(chǔ)許可票據(jù),有此票據(jù)后可以在有效期內(nèi)獲得KDC中所有需要訪問的Server Ticket。 \r
\r
\r Ticket Granting Service Exchange \r
\r
\r (KRB_TGS_REQ): \r
\r
\r Client向KDC獲取Server Ticket(即Session Key),該Server Ticket用于后續(xù)Client與Server之間交互使用。 \r
\r
\r Client/Server Exchange \r
\r
\r (KRB_AP_REQ): \r
\r
\r Client向Server提交Client Info與Server Ticket(即Session Key),Server端驗證通過后,向Client提供服務(wù)。 \r
\r
\r \r
\r
\r 這里要注意一下,Server Ticket并不是由KDC直接發(fā)給Server端的,而是KDC發(fā)給Client, 并由Client轉(zhuǎn)交給Server,這么做的好處是Server端不用維護一個Session列表,同時能夠避免因網(wǎng)絡(luò)問題引起KDC到Client和Server之間的通信問題。\r
\r
\r 看完上面這幾個過程,是不是感覺難以理解??! \r
\r
\r
\r
\r
\r \r
\r
\r 為了便于理解,我們引入一個場景: \r
\r
\r 一個IT人員出差忘記帶身份證了要住酒店。 \r
\r
\r 這個場景中有以下信息: \r
\r
\r KDC: 公安網(wǎng)內(nèi)部身份認(rèn)證系統(tǒng) \r
\r
\r Server: 酒店 \r
\r
\r Client: 入住IT \r
\r
\r Master Key: 公安網(wǎng)內(nèi)的人員身份信息,酒店信息以及派出所信息 \r
\r
\r Session Key: 住宿臨時身份證明\r
\r
\r 在這個場景中,酒店要讓他入住的話,需要兩個信息:入住人信息和證件。 \r
\r
\r 正巧我們的苦逼IT忘記帶了證件,他要順利入住,必須先去公安部門開一個住宿臨時證明,然后再回來辦理。\r
\r
\r 這可以分解為Kerberos的三個過程: \r
\r
\r Authentication Service Exchange: \r
\r
\r 戶口登記,該人員(Client)必須在公安系統(tǒng)(KDC)有登記,有戶籍信息(TGT),才能夠開出相關(guān)證明,當(dāng)然該戶籍信息可能是長期的可能是短期的(例如集體戶口),但是TGT一般是周期比較短的。 \r
\r
\r \r
\r
\r Ticket Granting Service Exchange: \r
\r
\r 臨時住宿證明(Session Key)辦理,該人員(Client)通過提交戶籍信息(TGT),公安系統(tǒng)(KDC)查驗后,給予其開具臨時住宿證明(Session Key)。 \r
\r
\r
\r
\r
\r \r
\r
\r Client/Server Exchange: \r
\r
\r 該人員(Client)向酒店(Server)提交臨時住宿證明(Session Key)和入住人信息(Client Info),酒店(Server)辦理入住。 \r
\r
\r \r
\r
\r
\r
\r
\r 在理解以上內(nèi)容中,需要有一些注意的地方:\r
\r
\r 人員身份信息是Master Key,指的是姓名,出生日期,身份證號這些不會變的東西;\r
\r
\r 而戶籍信息是TGT,除了Master Key的信息外,還附帶了會變的住址,登記派出所,登記時間等數(shù)據(jù)信息。\r
\r
\r Kerberos認(rèn)證過程是雙向的,入住人員也可以向公安系統(tǒng)驗證該酒店是否有登記,是否是黑店。\r
\r
\r 實際的Kerberos過程比這個稍復(fù)雜,因為涉及到加密解密的操作。\r
\r
\r Client端拿到的Session Key本身內(nèi)容包含Client Info,而且是經(jīng)過Server端Master Key加過密的。 \r
\r
\r Server端在拿到Client提交的Session Key和Client Info以后,會對Session Key進行解密,將Session Key包含的Client Info與之前提交的進行對比,兩者一致才予以放行。\r
\r
\r Session Key有效期時間不會太長,一般默認(rèn)都是8小時或者24小時。因為在網(wǎng)絡(luò)上一旦被截獲,有效期越長帶來的解密風(fēng)險越高,就越可能被篡改和替代。\r
\r
\r 正是有如此復(fù)雜的內(nèi)部過程,Kerberos完美的解決了網(wǎng)絡(luò)上Client與Server信任的問題。當(dāng)然Kerberos還有很多其他特性,我們后續(xù)再聊······\r
\r
\r \r