【转】雅典娜与宙斯的对话.(kerberos原理)
1 八月 2010 22:07:51
關(guān)于Kerberos的對(duì)話(MIT)
雅典娜與宙斯
雅典娜與宙斯關(guān)于地獄之門守護(hù)者的對(duì)話
?Kerberos: Network Authentication Protocol
?Kerberos這一名詞來源于希臘神話“三個(gè)頭的狗——地獄之門守護(hù)者” Kerberos 是一種網(wǎng)絡(luò)認(rèn)證協(xié)議,其設(shè)計(jì)目標(biāo)是通過密鑰系統(tǒng)為客戶機(jī) / 服務(wù)器應(yīng)用程序提供強(qiáng)大的認(rèn)證服務(wù)。該認(rèn)證過程的實(shí)現(xiàn)不依賴于主機(jī)操作系統(tǒng)的認(rèn)證,無需基于主機(jī)地址的信任,不要求網(wǎng)絡(luò)上所有主機(jī)的物理安全,并假定網(wǎng)絡(luò)上傳送的數(shù)據(jù)包可以被任意地讀取、修改和插入數(shù)據(jù)。在以上情況下, Kerberos 作為一種可信任的第三方認(rèn)證服務(wù),是通過傳統(tǒng)的密碼技術(shù)(如:共享密鑰)執(zhí)行認(rèn)證服務(wù)的。 認(rèn)證過程具體如下:客戶機(jī)向認(rèn)證服務(wù)器(AS)發(fā)送請(qǐng)求,要求得到某服務(wù)器的證書,然后 AS 的響應(yīng)包含這些用客戶端密鑰加密的證書。證書的構(gòu)成為: 1) 服務(wù)器 “ticket” ; 2) 一個(gè)臨時(shí)加密密鑰(又稱為會(huì)話密鑰 “session key”) 。客戶機(jī)將 ticket (包括用服務(wù)器密鑰加密的客戶機(jī)身份和一份會(huì)話密鑰的拷貝)傳送到服務(wù)器上。會(huì)話密鑰可以(現(xiàn)已經(jīng)由客戶機(jī)和服務(wù)器共享)用來認(rèn)證客戶機(jī)或認(rèn)證服務(wù)器,也可用來為通信雙方以后的通訊提供加密服務(wù),或通過交換獨(dú)立子會(huì)話密鑰為通信雙方提供進(jìn)一步的通信加密服務(wù)。 上述認(rèn)證交換過程需要只讀方式訪問 Kerberos 數(shù)據(jù)庫。但有時(shí),數(shù)據(jù)庫中的記錄必須進(jìn)行修改,如添加新的規(guī)則或改變規(guī)則密鑰時(shí)。修改過程通過客戶機(jī)和第三方 Kerberos 服務(wù)器(Kerberos 管理器 KADM)間的協(xié)議完成。有關(guān)管理協(xié)議在此不作介紹。另外也有一種協(xié)議用于維護(hù)多份 Kerberos 數(shù)據(jù)庫的拷貝,這可以認(rèn)為是執(zhí)行過程中的細(xì)節(jié)問題,并且會(huì)不斷改變以適應(yīng)各種不同數(shù)據(jù)庫技術(shù)。
這是MIT(Massachusetts Institute of Technology)為了幫助人們理解Kerberos的原理而寫的一篇對(duì)話集。里面有兩個(gè)虛構(gòu)的人物:Athena和Euripides,通過Athena不斷的構(gòu)思和Euripides不斷的尋找其中的漏洞,使大家明白了Kerberos協(xié)議的原理。
Athena: 雅典娜,智慧與技藝的女神。
Euripides:歐里庇得斯, 希臘的悲劇詩人。
譯文如下:
第一幕
在一個(gè)小工作間里。Athena和Euripides正在相鄰的終端上工作。
Athena: 嗨,這個(gè)分時(shí)操作系統(tǒng)實(shí)在太慢了。我根本無法工作,因?yàn)槊總€(gè)人都登上去了。
Euripides: 不要對(duì)我報(bào)怨。我只是在這工作。
Athena: 你知道我們需要什么嗎?我們需要給每一個(gè)人一臺(tái)工作,這樣大家就不會(huì)擔(dān)心計(jì)算機(jī)的速度了。并且,我們需要一個(gè)網(wǎng)絡(luò)把所有的計(jì)算機(jī)都聯(lián)起來。
Euripides: 好。那么我們差不多要一千臺(tái)工作站?
Athena: 差不多吧。
Euripides: 你知道一臺(tái)普通的工作站的硬盤有多大嗎?那里放不下所有的軟件。
Athena: 我已經(jīng)有主意了。我們可以把系統(tǒng)軟件放到服務(wù)器上。當(dāng)你登錄到工作站的時(shí)候,工作站會(huì)通過網(wǎng)絡(luò)與其中一臺(tái)服務(wù)器上的系統(tǒng)軟件聯(lián)系。這樣的設(shè)置讓一組工作站都使用同一份系統(tǒng)軟件,并且利于系統(tǒng)軟件的升級(jí)。只需改動(dòng)服務(wù)器就可以了。
Euripides: 好的。個(gè)人的文件怎到辦呢?在分時(shí)操作系統(tǒng)上,我可以登錄并從終端上取走我的文件。我能到工作站上取我的文件嗎?我要象PC用戶一樣把我的文件放到磁盤上去嗎?我希望不。
Athena: 我想我們可以其它機(jī)器來存文件。你可以到任何一臺(tái)機(jī)器上登錄去取你的文件。
Euripides: 打印怎么辦呢?每個(gè)工作站都要有自已的打印機(jī)嗎?誰來付錢?電子郵件呢?你怎么把郵件送到所有的工作站上去呢?
Athena: 啊.....很明顯我們沒錢為每個(gè)人配一臺(tái)打印機(jī),但我們有專門的機(jī)器做打印服務(wù)。你把請(qǐng)求送到服務(wù)器,它就為你打印。郵件也可以這樣做。專門有一臺(tái)郵件服務(wù)器。你如果想要你的郵件,就聯(lián)系郵件服務(wù)器,取走你的郵件。
Euripides: 你的工作站系統(tǒng)聽起來很不錯(cuò)。如果我有一臺(tái),你知道我要做什么嗎?我要找出你的用戶名,讓我的工作站認(rèn)為我就是你。然后我就去郵件服務(wù)器取走你的郵件。我會(huì)聯(lián)上你的文件服務(wù)器,移走你的文件,然后--
Athena: 你能做得到嗎?
Euripides: 當(dāng)然!這些網(wǎng)絡(luò)服務(wù)器怎么會(huì)知道我不是你?
Athena: 嗯,我不知道.我想我需要認(rèn)真思考一下.
Euripides: 好吧。你想出來后告訴我.
第二幕
Euripides的辦公室,第二天早上。Euripides坐在他的桌子旁邊,讀著他的郵件。Athena來敲門.
Athena: 我已經(jīng)想出怎樣保護(hù)一個(gè)開放的網(wǎng)絡(luò)系統(tǒng),使象你那樣不道德的人不能用別人的名字使用網(wǎng)絡(luò)服務(wù)。
Euripides: 真的嗎?坐吧。
她坐下了。
Athena: 在我開始描述之前,我可以為我們的討論先做一個(gè)約定嗎?
Euripides: 什么約定?
Athena: 好,假設(shè)我這樣說:"我想要我的郵件,于是我與郵件服務(wù)器聯(lián)系,請(qǐng)求它把郵件送到我的工作站上來。"實(shí)際上我并沒有聯(lián)系服務(wù)器。我用一個(gè)程序來與服務(wù)器聯(lián)系并取得我的郵件,這個(gè)程序就是這個(gè)服務(wù)的客戶端。但我不想每次與服務(wù)器交互的時(shí)侯說:"客戶端怎樣怎樣".我只想說:"我怎樣怎樣,"記住,客戶端在代表我做所有的事。這樣可以嗎?
Euripides: 當(dāng)然。沒問題.
Athena: 好。那么我要開始闡述我所解決的問題了。在一個(gè)開放的網(wǎng)絡(luò)環(huán)境中,提供服務(wù)的機(jī)器必須能夠識(shí)別請(qǐng)求服務(wù)的實(shí)體的身份。如果我去郵件服務(wù)器申請(qǐng)我的郵件,服務(wù)程序必須能夠驗(yàn)證我就是我所申明的那個(gè)人。
Euripides: 沒錯(cuò).
Athena: 你可以用一個(gè)笨辦法解決這個(gè)問題:服務(wù)器讓你輸入你的口令。通過輸口令的辦法我可以證明我是誰。
Euripides: 那確實(shí)很笨拙。在像那樣的系統(tǒng)里面,每一個(gè)服務(wù)器必須知道你的口令。如果網(wǎng)絡(luò)有一千個(gè)用戶,那每個(gè)服務(wù)器就要知道一千個(gè)口令。如果你想改變口令,你就必須聯(lián)系所有服務(wù)器,通知它們修改口令。我想你的系統(tǒng)不會(huì)那么笨。
Athena: 我的系統(tǒng)沒那么笨。它是象這樣工作的:不光人有口令,服務(wù)也有口令。每個(gè)用戶知道他們自已的口令,每個(gè)服務(wù)也知道它自已的口令。有一個(gè)認(rèn)證服務(wù)知道所有的口令,用戶的和服務(wù)的。認(rèn)證服務(wù)把口令保存在一個(gè)單獨(dú)的中央數(shù)據(jù)庫中。
Euripides: 這個(gè)認(rèn)證服務(wù)有一個(gè)名字嗎?
Athena: 我還沒想好。你想一個(gè)吧?
Euripides: 把死人送過冥河的人是誰?
Athena: Charon?
Euripides: 對(duì),就是他。如果他不能證實(shí)你的身份的話,他就不會(huì)把你送過河。
Athena: 你瞎編,是不是想重寫希臘神話。Charon不關(guān)心你的身份,他只是確定你死了
沒有。
Euripides: 你有更好的名字嗎?
停了一下。
Athena: 沒有,真的沒有。
Euripides: 好,那我們就把這個(gè)認(rèn)證服務(wù)“Charon”。
Athena: 好,我猜我該描述一下這個(gè)系統(tǒng)了吧,嗯?
比如說我們想要一種服務(wù):郵件。在我的系統(tǒng)里面你無法使用一種服務(wù),除非Charon告訴服務(wù)你確實(shí)是你所申明的人。也就是說你必須得到Charon的認(rèn)證才能使用服務(wù)。當(dāng)你向Charon請(qǐng)求認(rèn)證的時(shí)候,你必須告訴Charon你要使用哪一個(gè)服務(wù)。如果你想用郵件,你要告訴Charon。 Charon請(qǐng)你證明你的身份。于是你送給它你的密碼。Charon把你的密碼和它數(shù)據(jù)庫中的密碼相比較。如果相等,Charon就認(rèn)為你通過了驗(yàn)證。 Charon現(xiàn)在就要讓郵件服務(wù)知道你通過了驗(yàn)證。既然Charon知道所有服務(wù)的密碼,它也知道郵件服務(wù)的密碼。Charon把郵件服務(wù)的密碼給你,你就可以使用這個(gè)密碼使郵件服務(wù)相信你已通過驗(yàn)證。問題是,Charon不能直接給你密碼,因?yàn)槟銜?huì)知道它。下次你想要郵件服務(wù)的時(shí)候,你就會(huì)繞過Charon使用郵件服務(wù)而不需要認(rèn)證。你也可以假裝某人來使用郵件服務(wù)。所以不是直接給你郵件服務(wù)的密碼,Charon給你一張郵件服務(wù)的“票”。這張票含有你的名字,并且名字是用郵件服務(wù)的密碼加密的。拿到票,你就可以向郵件服務(wù)請(qǐng)求你的郵件。你向郵件服務(wù)提出請(qǐng)求,并用你的票來證明你的身份。服務(wù)用它自已的密碼來把票解密,如果票能被正確的解密,服務(wù)器將票里的用戶名取出。服務(wù)把這個(gè)名字和隨票一起送上的用戶名進(jìn)行比較。如果相符,服務(wù)器就認(rèn)為你通過了驗(yàn)證,就把你的郵件發(fā)給你。
你認(rèn)為怎么樣?
Euripides: 我有些問題。
Athena: 我猜到了。請(qǐng)講。
Euripides: 當(dāng)服務(wù)解密一張票的時(shí)候,它如何知道它是被正確的解密的?
Athena: 我不知道。
Euripides: 也許你應(yīng)該在票里包含有服務(wù)的名字。這樣當(dāng)服務(wù)解密票的時(shí)候,它就可以通過能否在票中找到自已的名字來判斷解密是否正確。
Athena: 很好。那票就應(yīng)該是這個(gè)樣子:
(她把下面的東西寫在了一張紙上)
票-{用戶名:服務(wù)名}
Euripides: 那票就只包含用戶名和服務(wù)名?
Athena: 用服務(wù)的口令加密。
Euripides: 我不認(rèn)為這些信息就可以讓票安全。
Athena: 什么意思?
Euripides: 假設(shè)你向Charon請(qǐng)求一張郵件服務(wù)的票。Charon準(zhǔn)備了一張有你名字“tina”
的票。假設(shè)在當(dāng)票從Charon傳給你的過程中我拷了一份。假設(shè)我讓我的工作站相信我的用戶名是”tina“。郵件客戶程序認(rèn)為我就是你。用你的名字郵件客戶程序用偷來的票向郵件服務(wù)器提出請(qǐng)求。郵件服務(wù)器把票解密,認(rèn)為它是合法的。票里的用戶名和發(fā)送該票的用戶名是匹配的。郵件服務(wù)器就會(huì)發(fā)給我你的郵件。
Athena: 喔!那可不太好。
Euripides: 但是我想到了一個(gè)辦法來解決這個(gè)問題。或者說部分解決。我想Charon應(yīng)該在票中包含更多的信息。除了用戶名,票還應(yīng)包含請(qǐng)求票的用戶的IP地址。這將給你增加一層安全性。我來演示。假設(shè)現(xiàn)在我偷了你的票。這票有你工作站的IP地址,并且這地址配不上我的
工作站的地址。用你的名字我把偷來的票送給郵件服務(wù)器。服務(wù)程序把用戶名和網(wǎng)絡(luò)地址從票中解出,并試圖匹配用戶名和網(wǎng)絡(luò)地址。用戶名匹配可網(wǎng)絡(luò)地址不匹配。服務(wù)器拒絕了這張票,因?yàn)樗黠@是偷來的。
Athena: 英雄,英雄!我怎么會(huì)沒想到。
Euripides: 好了,這就是我要表述的。
Athena: 那么票應(yīng)該是這個(gè)樣子的。
她把下面的東西寫在了黑板上。
票-{用戶名:地址:服務(wù)名}
Athena: 現(xiàn)在我真的很激動(dòng)。讓我們來建一個(gè)Charon系統(tǒng)看看它是否工作!
Euripides: 沒那么快。對(duì)于你的系統(tǒng)我還有些問題。
Athena: 好吧。(Athena從她的椅子上探出了身子)快說。
Euripides: 聽起來好像每次我想要得到服務(wù)我都要去取一張新票。如果我整天的工作,我可能不只一次的要取我的郵件。我每次取郵件都要去取一張新票嗎?如果真是這樣,我不喜歡你的系統(tǒng)。
Athena: 啊。。。我不明白為什么票不能被重用。如果我已經(jīng)得到了一張郵件服務(wù)的票,我可以一次又一次使用它。當(dāng)郵件客戶程序用你的名字請(qǐng)求了服務(wù),它就傳了一份票的拷貝給服務(wù)。
Euripides: 好一些。但我仍有問題。你似乎暗示我每次使用還沒有票的服務(wù)時(shí),我都必須給Charon我的密碼我登錄后想取我的文件。我向Charon請(qǐng)求我的票,這意味著我不得不使用我的密碼。然后我想讀我的郵件。又向Charon發(fā)一次請(qǐng)求,我又要輸一次我的密碼。現(xiàn)在假設(shè)我想把我的郵件送去打印。我又要向Charon發(fā)一次請(qǐng)求。你知道了吧?
Athena: 啊,是的,我明白了。
Euripides: 并且如果這還不夠糟的話,想想看:它好像是這樣,當(dāng)每次你要向Charon認(rèn)證的時(shí)候,你就要用明文在網(wǎng)絡(luò)上傳輸你的口令。像你這樣的聰明人可以監(jiān)視網(wǎng)絡(luò)并且得到別人的口令。如果我得到你的口令,我就可以用你的名字來使用任何服務(wù)。
Athena嘆了口氣。
Athena: 確實(shí)有嚴(yán)重的問題。我想我該回設(shè)計(jì)室去了。
第三幕
第二天一早,Athena在咖啡間遇上了Euripides。在Euripides倒咖啡的時(shí)候,Athena拍了
拍Euripides.
Athena: 我有了一個(gè)新的Charon的版本來解決我們的問題。
Euripides: 真的嗎?好快呀。
Athena: 好,你看,這些問題困擾了我一夜。
Euripides: 一定是你良心發(fā)現(xiàn)了。我們?nèi)ツ沁叺男?huì)議室吧?
Athena: 好的。
兩人去了小會(huì)議室。
Athena: 我要重新描述問題,但我要根據(jù)我們的需要進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換。
Athena清了清嗓子。
Athena: 第一個(gè)限制:用戶只輸一次口令,在他們工作站啟動(dòng)的時(shí)候,這意味著當(dāng)你需要申請(qǐng)新的服務(wù)的票時(shí),不需輸入你的口令。第二個(gè)限制:口令不能在網(wǎng)絡(luò)上進(jìn)行明文傳輸。
Euripides: 好的。
Athena: 我以第一項(xiàng)限制開始:你只需要輸入你的口令一次。我創(chuàng)造了一個(gè)新的網(wǎng)絡(luò)服務(wù)來解決這個(gè)問題。它叫做“票據(jù)授權(quán)”服務(wù),這個(gè)服務(wù)把Charon的票給用戶。使用它必須要有票:票據(jù)授權(quán)的票。票據(jù)授權(quán)服務(wù)其實(shí)只是Charon的一個(gè)版本,它可以存取Charon的數(shù)據(jù)庫。它是Charon的一部分,可以讓你通過票而不是口令來進(jìn)行認(rèn)證。總之,認(rèn)證系統(tǒng)現(xiàn)在是象這樣工作的:你登錄到一個(gè)工作站,用一個(gè)叫kinit的程序與Charon 服務(wù)器通訊。你向Charon證明你的身份,kinit程序取得一張票據(jù)授權(quán)票。現(xiàn)在你想從郵件服務(wù)器上取你的郵件。你還沒有郵件服務(wù)器的票,所以你用“票據(jù)授權(quán)”票去取郵件服務(wù)的票。你不需要使用口令去取新的服務(wù)票。
Euripides: 每次我想要另一種網(wǎng)絡(luò)服務(wù)的時(shí)候,我都要去取一張“票據(jù)授權(quán)”票嗎?
Athena: 不。記住,上次我們已經(jīng)同意票是能被重用的。一旦你要用到票據(jù)授權(quán)票,直接用就可以了。
Euripides: 好,有道理。既然你能重用票,一旦你得到了某個(gè)服務(wù)的票,你就無需再去取了。
Athena: 對(duì)啊,那不好嗎?
Euripides: 好的,我沒話說,只要你在取得票據(jù)授權(quán)票的時(shí)候沒有用明文在網(wǎng)上傳輸你的口令。
Athena: 如我所說,我已解決了這個(gè)問題。聽起來好像是,當(dāng)我說我要和Charon聯(lián)系取
得票據(jù)授權(quán)票的時(shí)候,你就要在網(wǎng)絡(luò)上傳輸明文密碼。但其實(shí)不是這樣的。實(shí)際上是,當(dāng)你用kinit程序取得票據(jù)授權(quán)票的時(shí)候,kinit沒有把你的口令送
給Charon服務(wù)器,kinit只送你的用戶名。
Euripides: 很好。
Athena: Charon用用戶名去查找你的口令。然后Charon就會(huì)組一個(gè)包含票據(jù)授權(quán)票的包。在送給你之前,Charon用你的口令去把這個(gè)包加密。你的工作站收到了包。你輸入你的口令。kinit用你的口令對(duì)這個(gè)包進(jìn)行解密。如果成功你就向Charon成功的進(jìn)行了認(rèn)證。你現(xiàn)在有了票據(jù)授權(quán)票,你可以用這張票來取得其它的票。
這些奇思妙想怎么樣?
Euripides: 我不知道...我正在思考。你知道你的系統(tǒng)一部分工作得很好。你的系統(tǒng)只需要我認(rèn)證一次。以后,Charon會(huì)給我服務(wù)的票而我需要關(guān)心。天衣無縫,天衣無縫。但服務(wù)票的設(shè)計(jì)還是有一些困擾我。服務(wù)票是可重用的。我同意它們應(yīng)該能被重用,但重用的服務(wù)票,由于它們自身的性質(zhì),是非常危險(xiǎn)的。
Athena: 什么意思?
Euripides: 這樣看。假設(shè)你正在用一個(gè)不安全的工作站。在你登入后,你需要郵件服務(wù)票,打印票,和文件服務(wù)票。假設(shè)你無意中在你退出后留下了那些票。現(xiàn)在假設(shè)我登錄到那個(gè)工作站并且發(fā)現(xiàn)了那些票。我想制造一些麻煩,于是我就用你的名字登錄了。既然那些票上是你的名字,那我就可以取你的郵件,打大量的文件。這些完全是因?yàn)檫@些票被偶然的放在了那里。并且我還可以把這些票拷走,永遠(yuǎn)的使用它們。
Athena: 但是這很好解決。我們可以寫一個(gè)程序,在用戶退出的時(shí)候把票銷毀掉,這些
票也主不能再用了。
Euripides: 那么很明顯你的統(tǒng)應(yīng)該有一個(gè)票據(jù)銷毀程序,讓用戶依賴這樣的機(jī)制是非常愚蠢的。你不能指望用戶在他們退出的時(shí)候會(huì)銷毀票據(jù)。并且甚至不能依賴銷毀票據(jù)本身,看下面的情況。我有一個(gè)程序可以監(jiān)視網(wǎng)絡(luò)并且拷內(nèi)別人的服務(wù)票據(jù)。假設(shè)我想犧牲你。我等你登到工作站的時(shí)候,打開我的程序并拷貝一份你的票。我等你退出并離開。我把我的工作站的地址調(diào)整為你登錄時(shí)用的地址。我讓工作站認(rèn)為我是你。我有你的票,你的用戶名,你的地址。我可以用這些票來使用你的服務(wù)。
你離開工作站時(shí)銷毀你的票已沒并系。這些我偷來的票可以一直使用下去,因?yàn)槟悻F(xiàn)在的票并沒有可以使用多少次的期限,或可以使用多長的時(shí)間。
Athena: 哦,我明白你所說的了!票不能是永遠(yuǎn)合法的,因?yàn)樗赡苁且粋€(gè)非常大的安全隱患。我們應(yīng)該限制每一張票可以用多長的時(shí)間,也許可以給每張票設(shè)一個(gè)有效期。
Euripides: 非常正確。我想票需要增加兩項(xiàng)信息:生存期表示票多長時(shí)間內(nèi)是合法的,和一個(gè)時(shí)間標(biāo)記來說明Charon是什么時(shí)候發(fā)出這張票的。
Euripides走到了黑板寫下了如下的內(nèi)容:
票{用戶名:地址:服務(wù)名:有效期:時(shí)間戳}
Euripides: 現(xiàn)在當(dāng)服務(wù)解開票時(shí),它檢查票的用戶名,地址是否與發(fā)送者匹配,然后它
用有效期和時(shí)間戳來檢查票是否有效。
Athena: 很好。典型的票使用哪長的有效期呢?
Euripides: 我不知道。也許是一個(gè)典型工作站的工作周期。就八小時(shí)吧。
Athena: 那如果我在工作站呆的時(shí)間超過八小時(shí),所有的票將會(huì)失效。包括票據(jù)授權(quán)票。那我就要重新向Charon作認(rèn)證,在八小時(shí)以后。
Euripides: 是不是不合理?
Athena: 我想不是。好我們就定下來吧--票在八小時(shí)后失效。現(xiàn)在我有一個(gè)問題問你。假設(shè)我從網(wǎng)絡(luò)上拷了 你的票--。
Euripides: (眨了眨眼睛)啊,Tina!你不會(huì)真的這樣做吧?
Athena: 這只是為了討論。我拷了你的票。現(xiàn)在我等你退出并離開。假設(shè)你有一個(gè)醫(yī)生的約會(huì)或聚會(huì)要參加,你在兩個(gè)小時(shí)后退出,并且你在退出之前銷毀了你的票。
但我已經(jīng)偷了你的票,它們還可以使用六小時(shí)。這給了我足夠的時(shí)間用你的名義去取你的文件并打印一千份什么東西。你看,時(shí)間戳工作的很好如果小偷選擇在它失效以后來用的話。如果小偷能在它失效之前用...。
啊,好...當(dāng)然,你是對(duì)的。
Athena: 我想我們遇上了一個(gè)大問題了。(她嘆了口氣)
停了一下。
Euripides: 我想這意味著你今晚要忙了。再來點(diǎn)咖啡?
Athena: 為什么不。
第四幕
第二天早上在Euripides的辦公室。Athena來敲門。
Euripides: 你今早有黑眼圈了。
Athena: 好了,你知道的。又是一個(gè)漫漫長夜。
Euripides: 你解決了重演的問題了嗎?
Athena: 我想是的。
Euripides: 請(qǐng)坐。
她坐下了。
Athena: 照舊,我重申一下問題。票是可重用的,在一個(gè)限定的時(shí)間內(nèi)(八小時(shí))。如果誰偷了你的票并在它失效之前使用,我們毫無辦法。
Euripides: 確實(shí)如此。
Athena: 我們可以把這個(gè)問題理解為設(shè)計(jì)一種別人無法重用的票。
Euripides: 但這樣的話你每次用新服務(wù)時(shí)都要取一張新票。
Athena: 對(duì)。但那是很笨的解決辦法。(稍頓。)啊,我怎樣繼續(xù)我的討論呢?(她沉思了一會(huì)兒)。
好的,我要重述一個(gè)問題,看有什么必須條件。網(wǎng)絡(luò)服務(wù)必須能夠證明使用票的人就是票上所申明的人。我來順著認(rèn)證的過程再走一遍,這樣我就可以演示我的解決方案。我現(xiàn)在想用一個(gè)網(wǎng)絡(luò)服務(wù)。我通過啟動(dòng)工作站上的客戶端來使用它。客戶端送三樣?xùn)|西給服務(wù)器:我的名字,我的工作站的網(wǎng)絡(luò)地址,適當(dāng)?shù)姆?wù)票據(jù)。這張票包含了申請(qǐng)這張票的人的名字和他(她)申請(qǐng)時(shí)所使用的工作站的地址。它也包含了票的有效期和時(shí)間戳。所有這些信息都被服務(wù)的密碼加密了。
我們現(xiàn)在的認(rèn)證模式基于以下的測(cè)試:
服務(wù)能對(duì)票解密嗎?
票在有效期以內(nèi)嗎?
票中的名字和地址與申請(qǐng)者的名字和地址匹配嗎?
這些測(cè)試證明了什么?
第一個(gè)測(cè)試證明了票是不是來自Charon.如果票不能被適當(dāng)?shù)慕饷?#xff0c;說明票不是來自真正
的Charon.
真正的Charon會(huì)用服務(wù)的票來加密票。Charon和服務(wù)是唯一知道服務(wù)密碼的兩個(gè)實(shí)體。
如果票被成功的解密,服務(wù)知道它來自于真的Charon.這個(gè)測(cè)試防止了有人偽造假票。
第二項(xiàng)測(cè)試檢查票是否在有效期以內(nèi)。如果過期,服務(wù)拒絕。這項(xiàng)測(cè)試阻止使用舊票,
因?yàn)槠笨赡苁峭祦淼摹?br />第三項(xiàng)測(cè)試檢查票的用戶名和地址是否匹配請(qǐng)求者的用戶名和地址。如果測(cè)試失敗,說
明使用者使用了別人的票。這張票當(dāng)然被拒絕。
如果名字和地址匹配,這個(gè)測(cè)試證明了什么?什么也沒有。票可以被偷走,用戶名和網(wǎng)
絡(luò)地址都可以被改變,如果需要的話。正如我昨天指出的那樣,票可以在有效期內(nèi)被盜用。
因?yàn)榉?wù)不能確定票的發(fā)送者是不是合法用戶。
服務(wù)之所以無法判斷是因?yàn)樗鼪]有與用戶共享一個(gè)秘密。這樣看。假如我正在埃爾斯諾
爾(哈姆雷特中的城堡)值勤,你打算來和我換班。但除非你說出正確的口令,否則我不
會(huì)與你換班的。我們共享了一個(gè)秘密。它可能是某人為所有值勤的人所設(shè)的。
于是昨晚我就在想,為什么Charon不能為合法用戶與服務(wù)之間設(shè)一個(gè)口令呢?Charon發(fā)
一份口令給服務(wù),同時(shí)發(fā)一份給用戶。當(dāng)服務(wù)從用戶那里收到一張票,它可以用這個(gè)口令
檢驗(yàn)用戶的合法性。
Euripides: 等一下。Charon如何同時(shí)發(fā)兩份口令?
Athena: 票據(jù)的擁用者從Charon的回應(yīng)中得到口令,像這個(gè)樣子:
她在黑板上寫下了:
Charon的回應(yīng)-[口令|票]
服務(wù)從票中獲取口令。票的格式如下:
票-{口令:用戶名:地址:服務(wù)名:有效期:時(shí)間戳}
當(dāng)你要請(qǐng)求服務(wù)時(shí),客戶端程序生成一個(gè)‘驗(yàn)證器’。驗(yàn)證器包含了你的名字和你工作站的地址。客戶端用口令把這些信息加密,口令是你請(qǐng)求票據(jù)時(shí)得到的。
驗(yàn)證器-{用戶名:地址}用口令加密。
生成驗(yàn)證器以后,客戶端把它和票一起送給服務(wù)。因?yàn)榉?wù)沒有口令,所以它不能解密
驗(yàn)證器。口令在票中,于是服務(wù)先解開票。
解開票以后,服務(wù)得到以下的東西:
票的有效期和時(shí)間戳;
票的擁有者的名字;
票擁有者的網(wǎng)絡(luò)地址。
口令。
服務(wù)檢查票是否過期。如果一切正常,服務(wù)就用口令去解驗(yàn)證器。如果解密沒有問題,服務(wù)將會(huì)得到一個(gè)用戶名和網(wǎng)絡(luò)地址。服務(wù)用它們?nèi)ズ推崩锏挠脩裘途W(wǎng)絡(luò)地址去匹配,如果正確,那么服務(wù)認(rèn)為票的發(fā)送者確實(shí)是票的真實(shí)擁有者。
Athena暫停了一下,清了清喉嚨,喝了點(diǎn)咖啡。
我認(rèn)為口令驗(yàn)證器的機(jī)制解決了盜用的問題。
Euripides: 也許。但我想。。。攻擊這個(gè)系統(tǒng)我必須有驗(yàn)證器。
Athena: 不。你必須同時(shí)擁有驗(yàn)證器和票。沒有票,驗(yàn)證器是沒有用的。解開驗(yàn)證器必須要有口令,服務(wù)必須解開票才會(huì)有口令。
Euripides: 好,我明白了,你是說當(dāng)客戶程序聯(lián)系服務(wù)時(shí),它同時(shí)送上票和驗(yàn)證器?
Athena: 是的,我就是這個(gè)意思。
Euripides: 如是真是這樣,什么可以阻止我把票和驗(yàn)證器都偷走呢?我可以寫一個(gè)程序,如果我擁有了票和驗(yàn)證器,我就可以一直使用它至有效期結(jié)束。我只需改變我的用戶名和工作站的地址。不是嗎?
Athena: (咬了咬她的嘴唇)是的。多沮喪啊。
Euripides: 等等,等等,等等!這不難解決。票在有效期內(nèi)是可重用的,但那并不意味著驗(yàn)證器是可重用的。假設(shè)我們?cè)O(shè)計(jì)了驗(yàn)證器只可以被用一次。這可以嗎?
Athena: 好,也許。我樣來想一下,客戶端程序生成驗(yàn)證器,然后把它和票一起送給服務(wù)。真的票和驗(yàn)證器比你拷貝的要先到。如果驗(yàn)證器只能被用一次,你的拷貝就失效了。啊,這就對(duì)了。我樣現(xiàn)在需要做的就是發(fā)明一和方法使得驗(yàn)證器只能被用一次。
Euripides: 沒問題。我們把有效期和時(shí)間戳放在上面。假設(shè)每個(gè)驗(yàn)證有兩分鐘的有效期。當(dāng)你想用一個(gè)服務(wù)時(shí)客戶端生成驗(yàn)證器,標(biāo)上當(dāng)前的時(shí)間,把它和票一起送給服務(wù)。服務(wù)器收到了票和驗(yàn)證器,服務(wù)器解開驗(yàn)證器,它檢查驗(yàn)證器的時(shí)間戳和有效期。如果驗(yàn)證器還沒失效,所有其它的檢查都通過了,那么服務(wù)器就認(rèn)為你通過了認(rèn)證。假設(shè)我通過網(wǎng)絡(luò)拷貝了一份驗(yàn)證器和票,我必須改變我的工作站的網(wǎng)絡(luò)地址和我的用戶名,這差不多要用幾分鐘。那是非常苛刻的要求,我不認(rèn)為是可能的,除非。。。嗯,有一個(gè)潛在的問題。假設(shè)不是在網(wǎng)絡(luò)的轉(zhuǎn)輸中拷貝到票和驗(yàn)證器,我拷貝了一份原始的從Charon而來的包,這個(gè)包是你向Charon請(qǐng)求時(shí)的回應(yīng)。這個(gè)包,有兩個(gè)口令在里面:一個(gè)是你的,一個(gè)是服務(wù)的。服務(wù)的口令隱藏在票中,我取不到,但另一個(gè)呢?那個(gè)你用來生成驗(yàn)證器的?如果我得到了口令,我就用它來建自已的驗(yàn)證器,如果我能建自已的驗(yàn)證器,我就能攻破你的系統(tǒng)。
Athena: 這就是我昨晚所想的,但是當(dāng)我順著票的處理過程一想,發(fā)現(xiàn)那樣偷走驗(yàn)證器是不可能的。
你在一臺(tái)工作站坐下,用kinit程序得到你的票據(jù)授權(quán)票。kinit要求輸入用戶名,你輸入以后,kinit把它送給Charon.Charon用你的名字查找你的口令,然后生成一張票據(jù)授權(quán)票。作為處理的一部分,Charon生成了一個(gè)你與票據(jù)授權(quán)服務(wù)共享的口令。Charon把口令和票據(jù)授權(quán)票一起送給你,并且在發(fā)關(guān)之前用你的口令將它加密。
Charon送出了包。某人取得了這個(gè)包,但他們無能為力因?yàn)樗怯媚愕目诹罴舆^密的。特別是,無人可以偷走票據(jù)授權(quán)服務(wù)的口令。 kinit收到了票據(jù)包并要求你輸入你的口令。如果你輸入正確的口令,kinit解開包取出了口令。現(xiàn)在你注意kinit的處理,你去取你的郵件。你打開郵件客戶端。這個(gè)程序查找一張郵件服務(wù)的票但沒有找到(你還沒取過你的郵件)。客戶端用票據(jù)授權(quán)票去申請(qǐng)一張郵件服務(wù)的票。客戶端為票據(jù)授權(quán)的過程生成了一個(gè)驗(yàn)證器,并用票據(jù)授權(quán)的口令把驗(yàn)證器加密。客戶端把驗(yàn)證器送給了Charon,票據(jù)授權(quán)票,你的名字,你的工作站的地址,郵件服務(wù)的名字。票據(jù)授權(quán)服務(wù)收到了這些東西,并通過了認(rèn)證檢查。如果一切都通過,票據(jù)授權(quán)服務(wù)將會(huì)得到那個(gè)與你共享的口令。現(xiàn)在票據(jù)授權(quán)服務(wù)為你生成了一張郵件服務(wù)的票,在這個(gè)過程中生成了一個(gè)你與郵件服務(wù)共享的口令。票據(jù)授權(quán)服務(wù)把這些東西打成包送給你的工作站。包里有票和口令。在送包之前,票據(jù)授權(quán)服務(wù)用票據(jù)授權(quán)的口令把包加密。做完以后,包被送出去。這樣郵件服務(wù)票的包通過網(wǎng)絡(luò)被送了出來。假設(shè)網(wǎng)絡(luò)上的某人將它復(fù)制了一份。他不幸的發(fā)現(xiàn)包是用票據(jù)認(rèn)證的口令加過密的。既然無法解密,他就不能得到郵件口令。沒有口令,他就不能使用任何在網(wǎng)絡(luò)上傳送的郵件服務(wù)的票。現(xiàn)在我覺得我們是安全的。你認(rèn)為呢?
Euripides: 也許吧。
Athena: 也許!你就只會(huì)說這個(gè)嗎!
Euripides: (大笑)別在意。你現(xiàn)在應(yīng)該知道我處理問題的方式了。我猜我和你昨晚都工
作到了半夜。
Athena: 哼!
Euripides: 好的,大半夜。實(shí)際上,這個(gè)系統(tǒng)似乎是完全可行的。口令的方案解決了我
昨晚想到的一個(gè)問題:相互驗(yàn)證的問題。
稍頓。
我說一下好嗎?
Athena: (有點(diǎn)冷淡)請(qǐng)便。
Euripides: 你真好。(Euripides清了清自已的嗓子)昨晚,當(dāng)口令和驗(yàn)證器在我腦子里轉(zhuǎn)的時(shí)候,我想去找出這個(gè)系統(tǒng)新的問題,我想我發(fā)現(xiàn)了一個(gè)很嚴(yán)重的問題。我下面就演示一下。
假設(shè)你厭倦了現(xiàn)在的工作,決定換一個(gè)。你想用公司的激光打印機(jī)打印求職信,把它們送給獵頭和其它的雇主。于是你輸入打印命令,命令去取得服務(wù)票,然后把票送到打印機(jī)。這是你認(rèn)為它應(yīng)該被送到的地方。實(shí)際上你并不知道你的請(qǐng)求被送到了正確的打印服務(wù)器。假設(shè)一些無恥的人--比如說你的老板--調(diào)整了系統(tǒng),把你的請(qǐng)求送到了他辦公室的打印機(jī)。他的打印服務(wù)不關(guān)心票的內(nèi)容。它告訴你的工作站服務(wù)已準(zhǔn)備好打印你的文件。打印命令被送到了假的打印服務(wù)器,你有麻煩了。我從相反的方向表達(dá)了相同的問題。用口令和驗(yàn)證器,Charon能夠保護(hù)的它的服務(wù)器防止錯(cuò)誤的用戶使用,但它不能保護(hù)它的用戶使用錯(cuò)誤的服務(wù)器。系統(tǒng)需要為客戶端程序提供一種驗(yàn)證服務(wù)器的方法,在它向服務(wù)器發(fā)送敏感信息之前。系統(tǒng)必須允許交互驗(yàn)證。但口令的方案解決了這個(gè)問題。讓我們回到打印服務(wù)器的場(chǎng)景。我想要打印客戶程序確
認(rèn)它送交的服務(wù)是合法的服務(wù)。這就是程序要做的。我輸入打印命令并給出一個(gè)文件名。這時(shí)我已經(jīng)有了打印服務(wù)票和口令。客戶程序用密碼生成了一個(gè)驗(yàn)證器,然后把驗(yàn)證器和票送給了假設(shè)的打印服務(wù)器。客戶端這時(shí)還沒有送打印文件,它在等待從服務(wù)的返回。真的服務(wù)收到票和驗(yàn)證器,把票解密并得到口令,然后用口令解開驗(yàn)證器。這樣服務(wù)端做完了所有的認(rèn)證。測(cè)試已經(jīng)確認(rèn)了我的身份。現(xiàn)在服務(wù)程序要準(zhǔn)備一個(gè)響應(yīng)包來證實(shí)它自已的身份。它用口令加密了返回包,并把包送給了等待的客戶端。客戶端收到了包并試圖用口令把它解開。如果包被正確的解開得到了正確的服務(wù)器響應(yīng)信息,客戶端程序就知道了這個(gè)服務(wù)器是合法的服務(wù)器。然后這時(shí)客戶端向它發(fā)出打印命令。假設(shè)我的老板改變了一下系統(tǒng)使得他的打印機(jī)看起來好像是我想要用的那個(gè)。我的客戶端送了票和驗(yàn)證器給它并等待它的響應(yīng)。假冒的打印服務(wù)無法生成正確的響應(yīng)因?yàn)樗鼰o法把票解開并得到口令。這樣的話客戶端就不會(huì)送打印命令給它因?yàn)榭蛻舳藳]有得到正確的
響應(yīng)。最后客戶端放棄等待并退出。我的打印沒有完成,但至少我的求職信不會(huì)放在我的對(duì)頭的桌子上。好啊,我想我們有了Charon認(rèn)證系統(tǒng)的堅(jiān)實(shí)的基礎(chǔ)。
Athena: 也許。不管怎么說,我不喜歡Charon這個(gè)名字。
Euripides: 你不喜歡嗎?什么時(shí)候?
Athena: 我從來都不喜歡,因?yàn)樗拿致犉饋頉]意義。有一天我和我荷迪斯(冥王)叔叔談到了這個(gè),他推薦了另一個(gè)名字:冥王的三個(gè)頭的看門狗。
Euripides: 啊,你是說“Cerberus".
Athena: 你說什么語言啊!"Cerberus"實(shí)際上是。。。
Euripides: 哦,不叫這個(gè)嗎?
Athena: 當(dāng)然,誰讓你是羅馬人!而我是希臘人,它是一條希臘的看門狗,它的名字是“Kerberos”,“Kerberos”是‘K’打頭的。
Euripides: 好吧,好吧,別發(fā)火。我同意這個(gè)名字。實(shí)際上,它有一個(gè)好的脖環(huán)。再見吧,Charon,歡迎你,Kerberos.
后記
這篇對(duì)話是于1988年寫的,是為了幫助讀者理解Kerberos V4的運(yùn)行方式。經(jīng)過了這么多年,它仍然非常好的服務(wù)于此。當(dāng)我把這篇文章轉(zhuǎn)換成HTML的時(shí)候,我驚訝的發(fā)現(xiàn)這個(gè)文檔對(duì)Kerberos V5仍然非常有用。雖然很多東西改變了,但核心概念并沒有變。實(shí)際上,Kerberos V5對(duì)Kerberos只做了兩處改變。
第一處改變是因?yàn)橐庾R(shí)到驗(yàn)證器用少于五分鐘的有效期不足以防止攻擊者進(jìn)行重演,如果攻擊者是用一個(gè)程序自動(dòng)的截取票和驗(yàn)證器并進(jìn)行重演的話。在Kerberos V5中,驗(yàn)證器真正的只能用一次因?yàn)榉?wù)器用‘重演緩沖區(qū)’保存了最近一次提交的驗(yàn)證器的信息。如果攻擊者試圖截取驗(yàn)證器并重用它,‘重演緩沖區(qū)’會(huì)發(fā)現(xiàn)驗(yàn)證器已經(jīng)被提交了。
第二個(gè)主要改變是Kerberos送給kinit服務(wù)票的時(shí)候,票不再是用用戶的口令加密。它已經(jīng)用票據(jù)授權(quán)服務(wù)的口令加過密了。票據(jù)授權(quán)服務(wù)的票被用來獲取其它票的時(shí)候,它直接就被傳輸了。因此票不需要再用用戶的口令加密一次。(服務(wù)器響應(yīng)的其它部分,如口令,仍然是用用戶的口令加密的。)一個(gè)類似的改變也應(yīng)用到票據(jù)授權(quán)服務(wù)協(xié)議;從票據(jù)授權(quán)服務(wù)返回的票也不再用票據(jù)授
權(quán)服務(wù)的口令來加密了,因?yàn)樗钠币呀?jīng)被對(duì)應(yīng)的服務(wù)的口令加過密了。舉例來說,Kerberos V4的包像這樣:
KDC_REPLY = {TICKET, client, server, K_session}K_user
意思是:{}中的內(nèi)容是用K_user來加密的。
TICKET = {client, server, start_time, lifetime, K_session}K_server
在Kerberos V5中,KDC_REPLY現(xiàn)在看起來像這樣:
KDC_REPLY = TICKET, {client, server, K_session}K_user
(注意:票已經(jīng)不再用K_user來加密了)
當(dāng)然,Kerberos V5中還有許多新特性。用戶可以在另一個(gè)網(wǎng)絡(luò)中安全的提交他們的票;并且,用戶可以把他們的一部分認(rèn)證權(quán)轉(zhuǎn)給服務(wù)器,這樣服務(wù)器就可以作為用戶的代理。其它的新特性包括:用更好的加密算法替換了DES加密算法,如三重DES加密。讀者如果對(duì)V4與V5的變化感興趣的話,可以讀一下"The Evolution of the Kerberos Authentication System",作者是Cliff Neumann和Theodore Tso. 我希望你能對(duì)這篇介紹Kerberos協(xié)議的文章感興趣。我祝愿你在未來的探索中更進(jìn)一步
(Last Edit:2010年8月1日 22:08:35)
協(xié)議結(jié)構(gòu):
Kerberos 信息
* 客戶機(jī)/服務(wù)器認(rèn)證交換 < 信息方向 信息類型 客戶機(jī)向 Kerberos KRB_AS_REQ Kerberos 向客戶機(jī) KRB_AS_REP或KRB_ERROR * 客戶機(jī)/服務(wù)器認(rèn)證交換 信息方向 信息類型 客戶機(jī)向應(yīng)用服務(wù)器 KRB_AP_REQ [可選項(xiàng)] 應(yīng)用服務(wù)器向客戶機(jī) KRB_AP_REP或 KRB_ERRORR * 票證授予服務(wù)(TGS)交換 信息方向 信息類型 客戶機(jī)向 Kerberos KRB_TGS_REQ Kerberos 向客戶機(jī) KRB_TGS_REP或KRB_ERROR * KRB_SAFE 交換 * KRB_PRIV 交換 * KRB_CRED 交換 Kerberos的是MIT為雅典娜(Athena)計(jì)劃開發(fā)的認(rèn)證系統(tǒng)。
Kerberos的組成
Kerberos應(yīng)用程序庫:應(yīng)用程序接口,包括創(chuàng)建和讀取認(rèn)證請(qǐng)求,以及創(chuàng)建safe message 和private message的子程序。 加密/解密庫:DES等。 Kerberos數(shù)據(jù)庫:記載了每個(gè)Kerberos 用戶的名字,私有密鑰,截止信息(記錄的有效時(shí)間,通常為幾年)等信息。 數(shù)據(jù)庫管理程序:管理Kerberos數(shù)據(jù)庫 KDBM服務(wù)器(數(shù)據(jù)庫管理服務(wù)器):接受客戶端的請(qǐng)求對(duì)數(shù)據(jù)庫進(jìn)行操作。 認(rèn)證服務(wù)器(AS):存放一個(gè)Kerberos數(shù)據(jù)庫的只讀的副本,用來完成principle的認(rèn)證,并生成會(huì)話密鑰. 數(shù)據(jù)庫復(fù)制軟件:管理數(shù)據(jù)庫從KDBM服務(wù)所在的機(jī)器,到認(rèn)證服務(wù)器所在的機(jī)器的復(fù)制工作,為了保持?jǐn)?shù)據(jù)庫的一致性,每隔一段時(shí)間就需要進(jìn)行復(fù)制工作. 用戶程序:登錄Kerberos,改變Kerberos密碼,顯示和破壞Kerberos標(biāo)簽(ticket)等工作。 Microsoft Windows Server 2003操作系統(tǒng)上實(shí)現(xiàn)了Kerberos5身份驗(yàn)證協(xié)議。Windows Server2003總是使用擴(kuò)展公鑰身份驗(yàn)證機(jī)制。KerBeros身份驗(yàn)證客戶端作為SSP(Security Support Provider)通過訪問SSPI(Security Support Provider Interface)來實(shí)現(xiàn)身份驗(yàn)證。用戶身份驗(yàn)證初始化過程被集成在Winlogon這SSO(Single Sign-On)體系中。
Vista系統(tǒng)常用英文專業(yè)詞語
一種認(rèn)證標(biāo)準(zhǔn),通過使用一臺(tái)中央服務(wù)器來提供“票據(jù)”,供其他在網(wǎng)絡(luò)上提供資源的服務(wù)器進(jìn)行識(shí)別。在Windows 2000, XP, Server 2003, Vista, 以及Longhorn, 還有UNIX系統(tǒng),都對(duì)它進(jìn)行支持。
(Last Edit:2010年8月1日 22:17:11)
?
【來源】:http://blog.sina.com.cn/s/blog_5189da570100k6av.html
總結(jié)
以上是生活随笔為你收集整理的【转】雅典娜与宙斯的对话.(kerberos原理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat 方式部署 Solo 博客系
- 下一篇: 大系统观:1.1从混沌到有序