|
理解Kerberos
如果您每次上班時(shí)都必須到某個(gè)安全官員那里,讓他給您簽到并發(fā)給您一個(gè)夾式胸卡,有了這個(gè)胸卡才被允許進(jìn)入大樓到達(dá)辦公桌,而這個(gè)胸卡并無其他用處,這樣感覺如何?如果又必須每個(gè)小時(shí)到那個(gè)官員處登記并更新胸卡呢?
如果每次使用公司的資源時(shí),例如需要文件庫或復(fù)印機(jī),都需要去那個(gè)官員處辦理新的胸卡,您又感覺如何?那么如果我們告訴您必須向每個(gè)資源的門衛(wèi)出示這個(gè)胸卡以便檢驗(yàn)訪問的合法性,你又會(huì)怎么想?
你可能會(huì)說,“哇,這太過分了,為什么這里的安全措施這么嚴(yán)格?”,在這種環(huán)境工作一定很困難。但如果幾個(gè)公司或整個(gè)城市都采用了這樣嚴(yán)格的安全措施又如何呢?這個(gè)城市中的生活一定會(huì)很安全,以至于公司之間會(huì)對(duì)共享資源非常相互信任。但從整體上看來,在這樣的環(huán)境下工作還是太難受了。
然而,這就是Kerberos的工作方式。唯一的區(qū)別就是安全性簽到和胸卡發(fā)放工作是由基礎(chǔ)協(xié)議透明處理的,一切都發(fā)生在網(wǎng)絡(luò)傳輸中。用戶對(duì)發(fā)生在網(wǎng)絡(luò)底層的這些工作毫無感覺。
Kerberos是以票證(ticket)系統(tǒng)為基礎(chǔ)的,票證是密鑰分發(fā)中心(Key Distribution Center,KDC)發(fā)出的一些加密數(shù)據(jù)包,密鑰分發(fā)中心就好像上面的發(fā)卡官員?!捌弊C”就是通行“護(hù)照”,它帶有無數(shù)安全信息。每個(gè)KDC負(fù)責(zé)一個(gè)領(lǐng)域(realm)的票證發(fā)放。Windows 2003中,每個(gè)域也是一個(gè)Kerberos領(lǐng)域,每個(gè)Active Directory域控制器(DC)就是一個(gè)KDC。
登錄到Windows時(shí),WinLogon和LSA首先將用戶領(lǐng)到KDC(參見第2章)進(jìn)行身份驗(yàn)證。KDC提供一個(gè)稱為票證授予票證(Ticket Granting Ticket,TGT)的初始票證。它類似于游樂場(chǎng)中的通行權(quán)配給票和護(hù)照。然后,在需要訪問網(wǎng)絡(luò)上的資源時(shí),將TGT提交給DC并請(qǐng)求訪問資源的票證。這個(gè)資源票證被稱為“服務(wù)票證”(Service Ticket,ST)。在需要訪問資源時(shí),處理環(huán)境會(huì)將ST提交給資源,然后就會(huì)獲準(zhǔn)依照ACL保護(hù)進(jìn)行資源訪問。
Kerberos在Windows 2003中的執(zhí)行完全符合Internet工程任務(wù)組(IETF)的Kerberos V5規(guī)范,該規(guī)范由MIT開發(fā)。這項(xiàng)規(guī)范得到了廣泛的支持,這意味著Windows 2003域(現(xiàn)在也稱為Kerberos領(lǐng)域)發(fā)出的票證可以在其他領(lǐng)域中使用,例如運(yùn)行Mac OS、Novell NetWare、UNIX、AIX、IRIX等等的網(wǎng)絡(luò)。
因此,可以在不同領(lǐng)域的KDC之間建立信任關(guān)系。這就像Windows NT系統(tǒng)中的信任關(guān)系一樣,建立于每個(gè)域的主域控制器(PDC)之間。此外,由于Windows 2003仍然使用NT局域網(wǎng)管理器(NTLM),所以信任在遺留Windows域上仍然有效。
但是與使用NTLM管理Windows NT域相比,管理Kerberos域需要更多的精力。這是因?yàn)橐惶熘杏脩粢終DC登記好幾次。例如,如果您登錄在線12個(gè)小時(shí),在這段時(shí)間內(nèi)可能需要到KDC登記12~15次。如果域支持1200個(gè)用戶,那么會(huì)有大約要到KDC登記18000次。
此外,異構(gòu)網(wǎng)絡(luò)之間的信任并不像Active Directory域之間的信任那么透明。在Active Directory域中控制器能明確地為用戶提供擔(dān)保。Windows 2003林之間、Windows 2003和Windows NT之間、Windows 2003和其他域之間的信任關(guān)系需要各自的域管理員之間進(jìn)行手動(dòng)設(shè)置協(xié)調(diào)。對(duì)UNIX或IRIX領(lǐng)域的設(shè)置過程可能會(huì)和對(duì)Windows 2003領(lǐng)域之間的設(shè)置過程非常不同。
在設(shè)計(jì)網(wǎng)絡(luò)的物理布局時(shí),如果有通過WAN通信的多個(gè)域,為了保證身份驗(yàn)證不在擁擠的網(wǎng)絡(luò)信息流中陷入困境,需要考慮建立能夠使票證在域之間傳輸?shù)淖罴芽赡苈窂健?/div>
Kerberos是一個(gè)速度很快的協(xié)議,是在網(wǎng)絡(luò)身份驗(yàn)證方面執(zhí)行單一登錄范式的理想環(huán)境。
3.6.1 Kerberos和單一登錄動(dòng)議
單一登錄早就該使用了。從安全的角度來看,單一登錄有很大的好處。如果一個(gè)用戶擁有6、7個(gè)密碼,這就意味著他有6次或7次或更多的泄密機(jī)會(huì)。很多人對(duì)要記住不同的密碼感到很煩,他們寧愿一個(gè)密碼都沒有才好。在系統(tǒng)中還有一個(gè)問題,密碼的創(chuàng)建和應(yīng)用都是由用戶控制的。語音郵件系統(tǒng)就是一個(gè)很好的例子。許多系統(tǒng)要求用戶的密碼不能設(shè)成1234或空格,但是如果查看一個(gè)系統(tǒng)的密碼,通常情況下很多密碼都是空格或是1234。
有一些用戶又會(huì)走向另一個(gè)極端,他們將密碼記錄到一個(gè)密碼數(shù)據(jù)庫或電子數(shù)據(jù)表中,甚至輸入到簡(jiǎn)單的文本文件中。入侵者可以順利地找到保存密鑰的文檔。密碼數(shù)據(jù)庫文件簡(jiǎn)直就是罪魁禍?zhǔn)?,入侵者只需幾秒種就可以破譯出鎖住文件的密碼。
有了單一登錄,用戶只要驗(yàn)證一次,其他網(wǎng)絡(luò)應(yīng)用程序和服務(wù)就認(rèn)可它。由于Kerberos和Active Directory的支持,SQL Server.NET和Exchange.NET也可以支持單一登錄,同時(shí)在Windows 2003和其他操作系統(tǒng)之間建立的信任域也支持單一登錄。這也正是Windows 2003中信任可在同一根或同一林的域之間傳遞的原因。
3.6.2 Kerberos的工作方式
Kerberos是基于“共享秘密”的思想而建立的。換句話說,如果只有兩個(gè)人知道某個(gè)秘密,則其中一人就可以通過確認(rèn)另一個(gè)人是否知道這個(gè)秘密來鑒別另一個(gè)人的身份。在Kerberos中,共享秘密存在于Kerberos和安全主體(security principal,真人用戶或設(shè)備)之間。
依此類推,有兩個(gè)人定期給對(duì)方發(fā)電子郵件,需要確保每個(gè)電子郵件都不被對(duì)方否認(rèn),或者要確保沒有其他人冒充成發(fā)送方。為了確定發(fā)送方或接收方就是他們自己所說的那個(gè)人,于是商議將往來信息中的某些內(nèi)容作為確定對(duì)方就是“那個(gè)人”的憑證。但是,如果有人分析了這些電子郵件并發(fā)現(xiàn)其字詞的排列順序,不會(huì)花費(fèi)很長時(shí)間就能發(fā)現(xiàn)隱藏在其中的確認(rèn)信息。在網(wǎng)絡(luò)驗(yàn)證機(jī)制中,這是一個(gè)很大的問題。因?yàn)椴粫?huì)花很長時(shí)間就可以截取信息,然后欺騙驗(yàn)證服務(wù)程序。
通信雙方應(yīng)該如何設(shè)計(jì)方案來確定它們的身份呢?答案是對(duì)稱密鑰加密技術(shù)。共享密鑰必須秘密保存,否則任何人都可以給信息解密。正如前文所述,對(duì)稱密鑰是能夠同時(shí)加密和解密的單密鑰。也就是說,只要通信雙方共享同一個(gè)密鑰,他們就可以給信息加密,而且確保對(duì)方能夠進(jìn)行解密。
密鑰加密技術(shù)不是什么新技術(shù)。它的產(chǎn)生可以追溯到冷戰(zhàn)之前,那時(shí)就有了比較完善的密鑰技術(shù)和密碼科學(xué)。但是在實(shí)施Kerberos中,只要信息被解密,或只要雙方中的一方首先能夠通過擁有解密密鑰證明他們是真實(shí)的,那么驗(yàn)證就已經(jīng)完成了。但是如果網(wǎng)絡(luò)上有人竊取了這個(gè)密鑰,或者設(shè)法復(fù)制了以前的驗(yàn)證對(duì)話又怎么辦呢?Kerberos將會(huì)利用那個(gè)不可改變的要素——時(shí)間,來解決這個(gè)問題。
3.6.3 時(shí)間驗(yàn)證
從字面上看,Kerberos驗(yàn)證從用戶登錄域的那一刻開始。Kerberos接收到驗(yàn)證請(qǐng)求時(shí),將按照以下步驟進(jìn)行處理:
1.查找該用戶并載入它與該用戶共享的解密密鑰,對(duì)驗(yàn)證消息進(jìn)行解密。
2.查看消息中的信息項(xiàng)。它查閱的第一項(xiàng)就是時(shí)間戳,該項(xiàng)記錄的是用戶請(qǐng)求登錄驗(yàn)證所在工作站或機(jī)器的時(shí)鐘時(shí)間。如果發(fā)送方時(shí)鐘的時(shí)間與同步信號(hào)的偏差多于5分鐘(由于不同的時(shí)區(qū)和夏令時(shí)帶來的時(shí)差,Kerberos會(huì)相應(yīng)地補(bǔ)償),Kerberos將會(huì)拒絕這條消息,并不再理會(huì)。如果時(shí)差在允許的5分鐘這個(gè)偏差范圍內(nèi),Kerberos將接受這條消息。
3.Kerberos查看時(shí)間是否與以前從發(fā)送方收到的驗(yàn)證時(shí)間一致,或比之更早。如果時(shí)間戳不晚于并且不同于前一次驗(yàn)證的時(shí)間,Kerberos將允許用戶通過驗(yàn)證進(jìn)入該域。
但是知道這種驗(yàn)證是相互的也很重要。Kerberos將會(huì)發(fā)回一條消息證明它能夠?qū)τ脩粝⒔饷?。Kerberos只返回選擇過的信息,其中最重要的一項(xiàng)是它從用戶最初的驗(yàn)證中獲得的時(shí)間戳。如果時(shí)間戳與用戶的信息相匹配,則用戶可確定是Kerberos發(fā)送的消息,而不是冒名頂替者解密了消息。
3.6.4 密鑰分發(fā)
對(duì)于域的驗(yàn)證,Kerberos驗(yàn)證的效果很好。但客戶在登錄后訪問資源時(shí)又怎么辦呢?這時(shí)Kerberos將使用域資源驗(yàn)證。那么客戶在訪問其他網(wǎng)絡(luò)資源時(shí)又怎么進(jìn)行驗(yàn)證呢?
Kerberos可以分發(fā)密鑰。換句話說,它充當(dāng)了經(jīng)紀(jì)人的角色。事實(shí)上,這就是Kerberos這個(gè)名稱的由來。在古希臘神話中,Kerberos是守衛(wèi)在地獄門口的那只三頭犬。Kerberos協(xié)議也具有三個(gè)頭:客戶端、服務(wù)器和一個(gè)中間人(或稱為代理)。代理就是通常所說的密鑰分發(fā)中心(KDC),它將密鑰分發(fā)給各方。在Windows 2003中密鑰分發(fā)中心安裝在Active Directory域控制器上。
現(xiàn)在您可能已經(jīng)開始想下面的步驟了,您也許會(huì)說:“太好了,消息解密和檢查時(shí)間戳這些無聊的過程只需要在客戶端和服務(wù)器之間重復(fù)”。如果您能想到以下內(nèi)容就更對(duì)了:密鑰分發(fā)中心的工作就是給每個(gè)用戶分配網(wǎng)絡(luò)資源訪問密鑰。但這只在理論上正確而已,因?yàn)榇罅康拿荑€分配將是資源的極大流失。每臺(tái)服務(wù)器都不得不在內(nèi)存中為潛在的成千上萬的用戶存儲(chǔ)密鑰。而實(shí)際上真正的實(shí)施是非常簡(jiǎn)化而巧妙的。
3.6.5 會(huì)話票證
事實(shí)上,KDC并不按照上面的邏輯假設(shè)同時(shí)將會(huì)話密鑰發(fā)送給客戶端和服務(wù)器,而是將這兩個(gè)會(huì)話密鑰都發(fā)送給客戶就不管了。客戶端一直持有服務(wù)器的會(huì)話密鑰直到它準(zhǔn)備好連接服務(wù)器,通常這個(gè)過程在幾毫秒內(nèi)完成。圖3-1中的說明可能會(huì)有助于理解。
![]() 圖3-1 密鑰分發(fā)和相互驗(yàn)證
當(dāng)客戶申請(qǐng)?jiān)L問資源(A)時(shí),KDC會(huì)創(chuàng)建一個(gè)會(huì)話密鑰,在會(huì)話密鑰中嵌入會(huì)話票證(B)。嵌入的會(huì)話票證實(shí)際上屬于服務(wù)器,它是服務(wù)器與客戶端進(jìn)行通信的會(huì)話密鑰。實(shí)際上,KDC在客戶端和需要訪問的資源之間進(jìn)行的秘密密鑰協(xié)商中擔(dān)當(dāng)了經(jīng)紀(jì)人或代理的角色。
客戶端從KDC接收到信息后,它取出票證和它的會(huì)話密鑰副本,并將其保存在安全的非易失內(nèi)存中。然后在客戶端和服務(wù)器(C)進(jìn)行聯(lián)系時(shí),它將一條消息發(fā)送給服務(wù)器,這條消息中包含用服務(wù)器的秘密密鑰加密過的票證和用會(huì)話密鑰加密過的時(shí)間驗(yàn)證器。票證和時(shí)間驗(yàn)證器組成了客戶端憑據(jù)(credentials),這與登錄身份驗(yàn)證的方式一樣。
如果通過了一切檢驗(yàn),服務(wù)器將準(zhǔn)許訪問客戶端(D),因?yàn)榉?wù)器了解這是權(quán)威的KDC發(fā)出的憑據(jù)。只要客戶端結(jié)束了對(duì)服務(wù)器的訪問,服務(wù)器便可以將客戶端用來和服務(wù)器通信的會(huì)話密鑰刪除??蛻舳藙t一直持有這個(gè)會(huì)話密鑰,并在每次需要訪問的時(shí)候?qū)⑺峤唤o服務(wù)器。
會(huì)話票證也能夠重用,但是為了防止被盜,會(huì)話票證具有有效期限。這個(gè)有效期限在域安全策略中指定,域安全策略將在本章后面部分討論。通常情況下,會(huì)話票證的有效期限為平均登錄時(shí)間,即大約8小時(shí)。在用戶注銷退出系統(tǒng)時(shí),會(huì)話票證的緩存會(huì)被刷新,所有的會(huì)話票證和密鑰都被廢除。
3.6.6 Kerberos和信任
將剛剛討論過的概念擴(kuò)展到域邊界之外,就是Kerberos信任的實(shí)現(xiàn)。在作為連續(xù)命名空間(Active Directory樹)組成部分的域之間將自動(dòng)建立信任,此時(shí)這兩個(gè)域之間共享一個(gè)域間密鑰,其中一個(gè)KDC成為另一個(gè)KDC的代理,反之亦然。
在這個(gè)域間密鑰建立起來后,每個(gè)域中的票證授予服務(wù)會(huì)在另一個(gè)域的KDC中注冊(cè)為安全主體,并允許它發(fā)出推薦票證(ticket referrals)。本地域中的客戶端在訪問外部資源時(shí)仍然與本域中的KDC進(jìn)行聯(lián)系。本地KDC確認(rèn)客戶端要訪問的資源位于其他域后,向客戶端發(fā)出一個(gè)推薦票證。然后客戶端連接另一個(gè)域的KDC并發(fā)出那個(gè)推薦票證。遠(yuǎn)程KDC對(duì)用戶進(jìn)行驗(yàn)證或開始一個(gè)會(huì)話票證交換,以允許客戶端連接遠(yuǎn)程域中的資源。
3.6.7 定位KDC
DNS為Kerberos提供定位服務(wù)。RFC 1510中指定了DNS應(yīng)該如何將KDC主機(jī)域名解析成IP地址??蛻舳擞?jì)算機(jī)需要將它們的信息發(fā)送到這一IP地址。如果不能解析KDC的IP地址,將會(huì)生成一個(gè)錯(cuò)誤信息返回給客戶端,指出無法定位該域。
在Windows 2003域中,KDC通常安裝在Active Directory服務(wù)器上。它們不會(huì)按照應(yīng)用程序進(jìn)程進(jìn)行連接,而是作為單獨(dú)的服務(wù)進(jìn)程運(yùn)行。但由于KDC總是安裝在DC上,所以可通過查找DC的主機(jī)地址來解析KDC域名。
將Windows 2003服務(wù)器安裝在非Windows 2003域中也是可以的,Windows 2003服務(wù)器仍然能夠進(jìn)行Kerberos驗(yàn)證。但要保證其域名能被正確地解析成對(duì)應(yīng)主機(jī)地址。這時(shí)再查找Active Directory DC的IP地址的做法就不正確了。有一個(gè)名為ksetup.exe的實(shí)用程序,可以用來在非Windows 2003域中配置客戶和服務(wù)器加入Kerberos域。
很明顯,實(shí)際上有關(guān)Kerberos的內(nèi)容要比這里所討論的多得多。但是那已經(jīng)超出了本書的范圍。有很多專門為Kerberos編寫的書籍。無論如何,Kerberos事實(shí)上成為Windows 2003域中最為廣泛使用的安全保護(hù)機(jī)制。Kerberos是盡快轉(zhuǎn)向本機(jī)域的絕好理由。雖然傳說中的三頭犬很丑陋,但這個(gè)守衛(wèi)網(wǎng)絡(luò)的三頭犬卻是Windows 2003域中非常受歡迎的一部分。
|
|
|