理解Kerberos如果您每次上班時都必須到某個安全官員那里,讓他給您簽到并發(fā)給您一個夾式胸卡,有了這個胸卡才被允許進入大樓到達辦公桌,而這個胸卡并無其他用處,這樣感覺如何?如果又必須每個小時到那個官員處登記并更新胸卡呢?
如果每次使用公司的資源時,例如需要文件庫或復(fù)印機,都需要去那個官員處辦理新的胸卡,您又感覺如何?那么如果我們告訴您必須向每個資源的門衛(wèi)出示這個胸卡以便檢驗訪問的合法性,你又會怎么想?
你可能會說,“哇,這太過分了,為什么這里的安全措施這么嚴(yán)格?”,在這種環(huán)境工作一定很困難。但如果幾個公司或整個城市都采用了這樣嚴(yán)格的安全措施又如何呢?這個城市中的生活一定會很安全,以至于公司之間會對共享資源非常相互信任。但從整體上看來,在這樣的環(huán)境下工作還是太難受了。
然而,這就是Kerberos的工作方式。唯一的區(qū)別就是安全性簽到和胸卡發(fā)放工作是由基礎(chǔ)協(xié)議透明處理的,一切都發(fā)生在網(wǎng)絡(luò)傳輸中。用戶對發(fā)生在網(wǎng)絡(luò)底層的這些工作毫無感覺。
Kerberos是以票證(ticket)系統(tǒng)為基礎(chǔ)的,票證是密鑰分發(fā)中心(Key Distribution Center,KDC)發(fā)出的一些加密數(shù)據(jù)包,密鑰分發(fā)中心就好像上面的發(fā)卡官員?!捌弊C”就是通行“護照”,它帶有無數(shù)安全信息。每個KDC負(fù)責(zé)一個領(lǐng)域(realm)的票證發(fā)放。Windows 2003中,每個域也是一個Kerberos領(lǐng)域,每個Active Directory域控制器(DC)就是一個KDC。
登錄到Windows時,WinLogon和LSA首先將用戶領(lǐng)到KDC(參見第2章)進行身份驗證。KDC提供一個稱為票證授予票證(Ticket Granting Ticket,TGT)的初始票證。它類似于游樂場中的通行權(quán)配給票和護照。然后,在需要訪問網(wǎng)絡(luò)上的資源時,將TGT提交給DC并請求訪問資源的票證。這個資源票證被稱為“服務(wù)票證”(Service Ticket,ST)。在需要訪問資源時,處理環(huán)境會將ST提交給資源,然后就會獲準(zhǔn)依照ACL保護進行資源訪問。
Kerberos在Windows 2003中的執(zhí)行完全符合Internet工程任務(wù)組(IETF)的Kerberos V5規(guī)范,該規(guī)范由MIT開發(fā)。這項規(guī)范得到了廣泛的支持,這意味著Windows 2003域(現(xiàn)在也稱為Kerberos領(lǐng)域)發(fā)出的票證可以在其他領(lǐng)域中使用,例如運行Mac OS、Novell NetWare、UNIX、AIX、IRIX等等的網(wǎng)絡(luò)。
因此,可以在不同領(lǐng)域的KDC之間建立信任關(guān)系。這就像Windows NT系統(tǒng)中的信任關(guān)系一樣,建立于每個域的主域控制器(PDC)之間。此外,由于Windows 2003仍然使用NT局域網(wǎng)管理器(NTLM),所以信任在遺留Windows域上仍然有效。
但是與使用NTLM管理Windows NT域相比,管理Kerberos域需要更多的精力。這是因為一天之中用戶要到KDC登記好幾次。例如,如果您登錄在線12個小時,在這段時間內(nèi)可能需要到KDC登記12~15次。如果域支持1200個用戶,那么會有大約要到KDC登記18000次。
此外,異構(gòu)網(wǎng)絡(luò)之間的信任并不像Active Directory域之間的信任那么透明。在Active Directory域中控制器能明確地為用戶提供擔(dān)保。Windows 2003林之間、Windows 2003和Windows NT之間、Windows 2003和其他域之間的信任關(guān)系需要各自的域管理員之間進行手動設(shè)置協(xié)調(diào)。對UNIX或IRIX領(lǐng)域的設(shè)置過程可能會和對Windows 2003領(lǐng)域之間的設(shè)置過程非常不同。
在設(shè)計網(wǎng)絡(luò)的物理布局時,如果有通過WAN通信的多個域,為了保證身份驗證不在擁擠的網(wǎng)絡(luò)信息流中陷入困境,需要考慮建立能夠使票證在域之間傳輸?shù)淖罴芽赡苈窂健?div style="height:15px;">

注意:如果由于網(wǎng)絡(luò)間的鏈接較慢而使身份驗證過程很慢,那么最好將站點建成一個新域。關(guān)于確定何時創(chuàng)建新域的更多信息,請參閱第7章。
Kerberos是一個速度很快的協(xié)議,是在網(wǎng)絡(luò)身份驗證方面執(zhí)行單一登錄范式的理想環(huán)境。
3.6.1 Kerberos和單一登錄動議
單一登錄早就該使用了。從安全的角度來看,單一登錄有很大的好處。如果一個用戶擁有6、7個密碼,這就意味著他有6次或7次或更多的泄密機會。很多人對要記住不同的密碼感到很煩,他們寧愿一個密碼都沒有才好。在系統(tǒng)中還有一個問題,密碼的創(chuàng)建和應(yīng)用都是由用戶控制的。語音郵件系統(tǒng)就是一個很好的例子。許多系統(tǒng)要求用戶的密碼不能設(shè)成1234或空格,但是如果查看一個系統(tǒng)的密碼,通常情況下很多密碼都是空格或是1234。
有一些用戶又會走向另一個極端,他們將密碼記錄到一個密碼數(shù)據(jù)庫或電子數(shù)據(jù)表中,甚至輸入到簡單的文本文件中。入侵者可以順利地找到保存密鑰的文檔。密碼數(shù)據(jù)庫文件簡直就是罪魁禍?zhǔn)?,入侵者只需幾秒種就可以破譯出鎖住文件的密碼。
有了單一登錄,用戶只要驗證一次,其他網(wǎng)絡(luò)應(yīng)用程序和服務(wù)就認(rèn)可它。由于Kerberos和Active Directory的支持,SQL Server.NET和Exchange.NET也可以支持單一登錄,同時在Windows 2003和其他操作系統(tǒng)之間建立的信任域也支持單一登錄。這也正是Windows 2003中信任可在同一根或同一林的域之間傳遞的原因。
3.6.2 Kerberos的工作方式
Kerberos是基于“共享秘密”的思想而建立的。換句話說,如果只有兩個人知道某個秘密,則其中一人就可以通過確認(rèn)另一個人是否知道這個秘密來鑒別另一個人的身份。在Kerberos中,共享秘密存在于Kerberos和安全主體(security principal,真人用戶或設(shè)備)之間。
依此類推,有兩個人定期給對方發(fā)電子郵件,需要確保每個電子郵件都不被對方否認(rèn),或者要確保沒有其他人冒充成發(fā)送方。為了確定發(fā)送方或接收方就是他們自己所說的那個人,于是商議將往來信息中的某些內(nèi)容作為確定對方就是“那個人”的憑證。但是,如果有人分析了這些電子郵件并發(fā)現(xiàn)其字詞的排列順序,不會花費很長時間就能發(fā)現(xiàn)隱藏在其中的確認(rèn)信息。在網(wǎng)絡(luò)驗證機制中,這是一個很大的問題。因為不會花很長時間就可以截取信息,然后欺騙驗證服務(wù)程序。
通信雙方應(yīng)該如何設(shè)計方案來確定它們的身份呢?答案是對稱密鑰加密技術(shù)。共享密鑰必須秘密保存,否則任何人都可以給信息解密。正如前文所述,對稱密鑰是能夠同時加密和解密的單密鑰。也就是說,只要通信雙方共享同一個密鑰,他們就可以給信息加密,而且確保對方能夠進行解密。
注意:保密密鑰(secret key)和對稱密鑰(symmetric key)這兩個術(shù)語在討論使用單密鑰給文檔加密和解密中可以互換。但是,保密密鑰完全可能落到錯誤的人手中。
密鑰加密技術(shù)不是什么新技術(shù)。它的產(chǎn)生可以追溯到冷戰(zhàn)之前,那時就有了比較完善的密鑰技術(shù)和密碼科學(xué)。但是在實施Kerberos中,只要信息被解密,或只要雙方中的一方首先能夠通過擁有解密密鑰證明他們是真實的,那么驗證就已經(jīng)完成了。但是如果網(wǎng)絡(luò)上有人竊取了這個密鑰,或者設(shè)法復(fù)制了以前的驗證對話又怎么辦呢?Kerberos將會利用那個不可改變的要素——時間,來解決這個問題。
3.6.3 時間驗證
從字面上看,Kerberos驗證從用戶登錄域的那一刻開始。Kerberos接收到驗證請求時,將按照以下步驟進行處理:
1.查找該用戶并載入它與該用戶共享的解密密鑰,對驗證消息進行解密。
2.查看消息中的信息項。它查閱的第一項就是時間戳,該項記錄的是用戶請求登錄驗證所在工作站或機器的時鐘時間。如果發(fā)送方時鐘的時間與同步信號的偏差多于5分鐘(由于不同的時區(qū)和夏令時帶來的時差,Kerberos會相應(yīng)地補償),Kerberos將會拒絕這條消息,并不再理會。如果時差在允許的5分鐘這個偏差范圍內(nèi),Kerberos將接受這條消息。
3.Kerberos查看時間是否與以前從發(fā)送方收到的驗證時間一致,或比之更早。如果時間戳不晚于并且不同于前一次驗證的時間,Kerberos將允許用戶通過驗證進入該域。
但是知道這種驗證是相互的也很重要。Kerberos將會發(fā)回一條消息證明它能夠?qū)τ脩粝⒔饷?。Kerberos只返回選擇過的信息,其中最重要的一項是它從用戶最初的驗證中獲得的時間戳。如果時間戳與用戶的信息相匹配,則用戶可確定是Kerberos發(fā)送的消息,而不是冒名頂替者解密了消息。
3.6.4 密鑰分發(fā)
對于域的驗證,Kerberos驗證的效果很好。但客戶在登錄后訪問資源時又怎么辦呢?這時Kerberos將使用域資源驗證。那么客戶在訪問其他網(wǎng)絡(luò)資源時又怎么進行驗證呢?
Kerberos可以分發(fā)密鑰。換句話說,它充當(dāng)了經(jīng)紀(jì)人的角色。事實上,這就是Kerberos這個名稱的由來。在古希臘神話中,Kerberos是守衛(wèi)在地獄門口的那只三頭犬。Kerberos協(xié)議也具有三個頭:客戶端、服務(wù)器和一個中間人(或稱為代理)。代理就是通常所說的密鑰分發(fā)中心(KDC),它將密鑰分發(fā)給各方。在Windows 2003中密鑰分發(fā)中心安裝在Active Directory域控制器上。
現(xiàn)在您可能已經(jīng)開始想下面的步驟了,您也許會說:“太好了,消息解密和檢查時間戳這些無聊的過程只需要在客戶端和服務(wù)器之間重復(fù)”。如果您能想到以下內(nèi)容就更對了:密鑰分發(fā)中心的工作就是給每個用戶分配網(wǎng)絡(luò)資源訪問密鑰。但這只在理論上正確而已,因為大量的密鑰分配將是資源的極大流失。每臺服務(wù)器都不得不在內(nèi)存中為潛在的成千上萬的用戶存儲密鑰。而實際上真正的實施是非常簡化而巧妙的。
3.6.5 會話票證
事實上,KDC并不按照上面的邏輯假設(shè)同時將會話密鑰發(fā)送給客戶端和服務(wù)器,而是將這兩個會話密鑰都發(fā)送給客戶就不管了。客戶端一直持有服務(wù)器的會話密鑰直到它準(zhǔn)備好連接服務(wù)器,通常這個過程在幾毫秒內(nèi)完成。圖3-1中的說明可能會有助于理解。
圖3-1 密鑰分發(fā)和相互驗證
當(dāng)客戶申請訪問資源(A)時,KDC會創(chuàng)建一個會話密鑰,在會話密鑰中嵌入會話票證(B)。嵌入的會話票證實際上屬于服務(wù)器,它是服務(wù)器與客戶端進行通信的會話密鑰。實際上,KDC在客戶端和需要訪問的資源之間進行的秘密密鑰協(xié)商中擔(dān)當(dāng)了經(jīng)紀(jì)人或代理的角色。
客戶端從KDC接收到信息后,它取出票證和它的會話密鑰副本,并將其保存在安全的非易失內(nèi)存中。然后在客戶端和服務(wù)器(C)進行聯(lián)系時,它將一條消息發(fā)送給服務(wù)器,這條消息中包含用服務(wù)器的秘密密鑰加密過的票證和用會話密鑰加密過的時間驗證器。票證和時間驗證器組成了客戶端憑據(jù)(credentials),這與登錄身份驗證的方式一樣。
如果通過了一切檢驗,服務(wù)器將準(zhǔn)許訪問客戶端(D),因為服務(wù)器了解這是權(quán)威的KDC發(fā)出的憑據(jù)。只要客戶端結(jié)束了對服務(wù)器的訪問,服務(wù)器便可以將客戶端用來和服務(wù)器通信的會話密鑰刪除。客戶端則一直持有這個會話密鑰,并在每次需要訪問的時候?qū)⑺峤唤o服務(wù)器。
會話票證也能夠重用,但是為了防止被盜,會話票證具有有效期限。這個有效期限在域安全策略中指定,域安全策略將在本章后面部分討論。通常情況下,會話票證的有效期限為平均登錄時間,即大約8小時。在用戶注銷退出系統(tǒng)時,會話票證的緩存會被刷新,所有的會話票證和密鑰都被廢除。
3.6.6 Kerberos和信任
將剛剛討論過的概念擴展到域邊界之外,就是Kerberos信任的實現(xiàn)。在作為連續(xù)命名空間(Active Directory樹)組成部分的域之間將自動建立信任,此時這兩個域之間共享一個域間密鑰,其中一個KDC成為另一個KDC的代理,反之亦然。
在這個域間密鑰建立起來后,每個域中的票證授予服務(wù)會在另一個域的KDC中注冊為安全主體,并允許它發(fā)出推薦票證(ticket referrals)。本地域中的客戶端在訪問外部資源時仍然與本域中的KDC進行聯(lián)系。本地KDC確認(rèn)客戶端要訪問的資源位于其他域后,向客戶端發(fā)出一個推薦票證。然后客戶端連接另一個域的KDC并發(fā)出那個推薦票證。遠(yuǎn)程KDC對用戶進行驗證或開始一個會話票證交換,以允許客戶端連接遠(yuǎn)程域中的資源。
3.6.7 定位KDC
DNS為Kerberos提供定位服務(wù)。RFC 1510中指定了DNS應(yīng)該如何將KDC主機域名解析成IP地址。客戶端計算機需要將它們的信息發(fā)送到這一IP地址。如果不能解析KDC的IP地址,將會生成一個錯誤信息返回給客戶端,指出無法定位該域。
在Windows 2003域中,KDC通常安裝在Active Directory服務(wù)器上。它們不會按照應(yīng)用程序進程進行連接,而是作為單獨的服務(wù)進程運行。但由于KDC總是安裝在DC上,所以可通過查找DC的主機地址來解析KDC域名。
將Windows 2003服務(wù)器安裝在非Windows 2003域中也是可以的,Windows 2003服務(wù)器仍然能夠進行Kerberos驗證。但要保證其域名能被正確地解析成對應(yīng)主機地址。這時再查找Active Directory DC的IP地址的做法就不正確了。有一個名為ksetup.exe的實用程序,可以用來在非Windows 2003域中配置客戶和服務(wù)器加入Kerberos域。
很明顯,實際上有關(guān)Kerberos的內(nèi)容要比這里所討論的多得多。但是那已經(jīng)超出了本書的范圍。有很多專門為Kerberos編寫的書籍。無論如何,Kerberos事實上成為Windows 2003域中最為廣泛使用的安全保護機制。Kerberos是盡快轉(zhuǎn)向本機域的絕好理由。雖然傳說中的三頭犬很丑陋,但這個守衛(wèi)網(wǎng)絡(luò)的三頭犬卻是Windows 2003域中非常受歡迎的一部分。