摘 要 認證協議是身份認證系統最關鍵的部分,研究和分析系統認證協議,是保證網絡安全通信的必要條件。Kerberos是壹個典型的認證協議,其使用專門的服務器進行統壹的身份認證和權限管理,但是由於當初使用環境的原因,並沒有使用公鑰體制,這影響了系統的擴展性和易管理性。本文描述了壹個身份認證系統認證協議的設計思想,使用公鑰對kerberos協議進行了改進,並使用BAN邏輯分析了協議的安全性。 關鍵詞 身份認證,認證協議
認證協議是身份認證系統最關鍵的部分,它直接影響到系統效率、安全性等等。Kerberos是壹個典型的認證協議,其使用專門的服務器進行統壹的身份認證和權限管理,但是由於當初使用環境的原因,並沒有使用公鑰體制,這影響了系統的擴展性和易管理性。本文描述了壹個身份認證系統認證協議的設計思想,使用公鑰對kerberos協議進行了改進,並使用BAN邏輯證明了協議的安全性較高。 1 Kerberos協議分析 Kerberos是壹個典型網絡安全認證協議,它是應用對稱密鑰來對客戶機(Client)/服務器(Server)應用程序作精確鑒定的。Kerberos主要為網絡通信提供可信第三方服務的面向開放系統的認證機制。每當用戶(Client)申請得到某服務程序(Server)的服務時,用戶和服務程序會首先向Kerberos要求認證對方的身份,認證是建立在用戶和服務程序對Kerberos的信任的基礎上。在申請認證時,Client和Server都可看成是Kerberos認證服務的用戶。為了和其它服務的用戶區別,Kerberos將用戶和服務器統稱為參與者(Principle)。因此Principle既可以是用戶也可以是某項服務。認證雙方與Kerberos的關系用圖1表示。 圖1 Kerberos之間的認證關系 當用戶登錄到工作站時,Kerberos對用戶進行初始認證,通過認證的用戶可以在整個登錄期間得到相應的服務。Kerberos既不依賴用戶登錄系統的終端,也不依賴用戶所請求的服務的安全機制,它憑借本身提供的認證服務來完成對用戶的認證工作。而時間戳技術被用來抵禦可能發生的重放攻擊(Replay Attack)。 Kerberos建立並保存本網絡域中每個參與者的名稱及其私有密鑰的數據庫,這樣僅有參與者和Kerberos數據庫掌握該參與者的私有密鑰。使用私有密鑰,Kerberos可以對參與者進行身份認證。另外,Kerberos還會隨機生成壹個會話密鑰用來對通信雙方的具體內容進行加密。 Kerberos存在以下局限性: 1)原有的認證服務可能被存儲或替換,雖然時間戳是專門用於防止重放攻擊的,但在票據的有效時間內仍然可能奏效,假設在壹個Kerberos認證域內的全部時鐘均保持同步,收到消息的時間在規定的範圍內(假定規定為5分鐘),就認為該消息是新的。而事實上,攻擊者可以事先把偽造的消息準備好,壹旦得到票據就馬上發出偽造的票據,在這5分鐘內是難以檢查出來的。 2)認證票據的正確性是基於網絡中所有的時鐘保持同步,如果主機的時間發生錯誤,則原來的認證票據就是可能被替換的。因為大多數網絡的時間協議是不安全的,所以,分布式計算機系統中這將導致極為嚴重的問題。 3) Kerberos防止口令猜測攻擊的能力很弱,攻擊者通過長期監聽可以收集大量的票據,經過計算和密鑰分析進行口令猜測。當用戶選擇的口令不夠強時,就不能有效地防止口令猜測攻擊。 4)Kerberos服務器與用戶***享的秘密是用戶的口令字,服務器在回應時不驗證用戶的真實性,而是假設只有合法用戶擁有口令字。如果攻擊者記錄申請回答報文,就易形成代碼本攻擊。 5)實際上,最嚴重的攻擊是惡意軟件攻擊。Kerberos認證協議依賴於Kerberos軟件的絕對可信,而攻擊者可以用執行Kerberos協議和記錄用戶口令的軟件來代替所有用戶的Kerberos軟件,達到攻擊的目的。壹般而言,裝在不安全計算機內的密碼軟件都會面臨這壹問題。 6)在分布式系統中,認證中心星羅棋布,域間的會話密鑰數量驚人,密鑰的管理、分配、存儲都是很嚴峻的問題。 2 認證協議初步設計 Kerberos在最初設計時避免采用公鑰體系,這是因為當時應用公鑰體系的某些條件不完全成熟。但是隨著時間的推移和技術的進步,目前采用公鑰體系的壹些條件已經具備或者正在具備,特別是從將來的發展來看,將公鑰體系結合進現有的系統中去是壹種趨勢。從對於Kerberos的局限性分析可以看出,其很多缺陷均是由於單獨采用對稱密鑰技術造成的。如果能將公鑰技術有機地融合到Kerberos中去,便能克服其保密性不強,擴展性差等缺點。基於這種考慮,這裏設計了壹個認證協議。在此協議中使用代表用戶訪問次數的“***享變量”N來防止重放,
符號表示說明: ◆CA:認證中心; ◆AA:認證代理服務器(Authentication Agent); ◆C:客戶端(Client)唯壹標識; ◆S:應用服務器(Server)唯壹標識; ◆PRIx:X的私鑰; ◆PUBx:X的公鑰; ◆CERTc:C的證書序列號; ◆(Info)SIGNx:用X的私鑰對信息Info簽名; ◆(Info)ENCpubx:用X的公鑰對Info加密; ◆(Info)K:用對稱密鑰K對Info加密; ◆Ts:認證代理為用戶C訪問服務器S而頒發的票據; ◆Nc:用戶端C保存的壹個整數,記錄用戶訪問次數; ◆Ns:應用服務器S所保存的用戶訪問次數,用於防止重放; ◆N:協議消息中使用的用於防止重放的整數,其值由Nc決定,在此稱之為“同步變量”。 協議具體工作流程如下: 1)票據請求 當客戶端C想訪問服務器S時,客戶程序要求其輸入私鑰口令,以便將私鑰文件解密,如果私鑰口令不正確,則禁止用戶進壹步的操作。如果正確則發送Ticket_req消息到認證代理AA: C->AA:(C,S,N)SIGNc,CERTcTicket_req消息的具體構造過程如下: 用戶取得本地所保存的Nc,然後使N=Nc 1,而後對用戶標識C和要訪問應用服務器S使用C的私鑰簽名,此簽名可以證明自已的身份。為了便於身份的認證,客戶端還需要將自已的證書序列號CERTc傳送給AA。參量N的使用主要為了保持用戶發送信息的新鮮性,當請求發送完之後,為了下壹次會話做準備,需要使Nc=Nc 1。 2)票據發放 當認證代理服務器AA收到Ticket_req消息後,首先根據CERTc從CA或本地緩沖取得用戶證書,利用CRL完成對證書有效性的檢查。如果證書驗證通過,則從用戶終端C的證書中取得其公鑰PUBc,用此公鑰來驗證C對信息(C,S,N)的簽名,如果簽名驗證失敗,則向客戶端發送驗證失敗消息。簽名驗證通過後,AA找出C要訪問的服務器S,檢查其是否有對服務器S的信 息的訪問權限,如果權限滿足,將產生Ticket_rep消息: AA->C:Ts,((Kcs,N)SIGNAA)ENCpubc 其中Ts=((C,S,Kcs,N)SIGNAA)ENCpubs為用戶用以訪問服務的票據 Ticket_rep消息的構造過程如下: AA首先產生壹個會話密鑰Kcs,用於構造票據Ts,在Ts中要加入用戶C的標識,以說明此票據為用戶C所擁有,其他人不能使用;加入S說明此票據的目的是用於C向S發出的訪問;而後還要加入N以保證票據的新鮮性;然後將這些信息簽名,證明是由AA發出的,其它人不能假冒或篡改;最後用S的公鑰將其加密,使得其它人不能查看其中的會話密鑰Kcs。 Ts構造完後,還要將會話密鑰Kcs通知用戶C,與對票據Ts的處理相似,首先將其用AA的私鑰簽名,然後用C公鑰加密以防止其他人查看會話密鑰Kcs。為了保持其新鮮性,在其中加入了N。 3)服務請求 當用戶收到Ticket_rep消息後,用戶C利用自己的私鑰解開((Kcs,N)SIGNAA)ENCpubc,用戶檢查得到的N,看N=Nc是否成立,如果成立,則證明了其新鮮性;如果N<Nc,則認為其為重放數據,並將其拋棄;如果N>Nc,則認為某壹方程序出現了錯誤,則退出。而後,C利用AA的證書驗證AA對以上數據的簽名,如果成功則說明信息的確是AA發送的,而不是別人偽造的。當以上驗證都通過後,C將票據Ts和會話密鑰Kcs保存下來,用來向服務器申請服務。向服務器S申請服務的S_req消息如下: C->S:Ts,(C,S,N)Kcs S_req具體構造過程如下: C將自己標識C和服務器標識S以及同步變量N用會話密鑰Kcs加密後,連同Ts壹起發往服務器S。在這裏不能單純地將Ts直接發往S,因為如果這樣的話,非法用戶可以在第二步中截獲Ts,然後去服務器認證。如果加上(C,S,N)Kcs,則可以說明此消息為擁有Kcs的用戶發過來的,而且使用N保證了其新鮮性。 4)服務器身份認證 應用服務器S收到服務請求後,首先是對票據Ts的檢查:先用自己的私鑰將其解密,查看C和S可以知道此票據是否為用戶C發出的,並且是發給自己的;然後取得N,檢查N>Ns是否成立,如果成立則通過驗證,但如果N<=Ns,則認為此數據為重放數據,予以拋棄,並發回出錯消息;以上驗證通過後,使用AA的證書驗證其簽名,如果簽名不正確發回出錯信息。 對票據本身檢查完畢後,還要對票據持有者進行檢查:使用Kcs解開(C,S,N)Kcs,檢查這裏C,S,N是否與票據中的相符,以防止非法攻擊者將不同的Ts和(C,S,N)Kcs組合。當驗證通過後,應該令Ns=N,以防止重放。 對用戶驗證通過後,服務器S向客戶端C發送s_rep消息證明自己的身份: S->C:(N 1)Kcs 當客戶端C收到此消息後,首先利用Kcs將其解開,檢查N 1=Nc 1是否成立,如果成立,則認為服務器S合法,因為只有S才能將票據Ts解開來獲取Kcs。之後二者便可以利用會話密鑰Kcs來進行通話。 3 認證協議設計思想的進壹步改進 在Kerberos中,采用了發放票據的方法實現了權限的集中管理,我們也吸取這壹思想,用戶向認證代理AA證實自己的身份來取得票據。此時,認證代理便可以根據用戶的權限的情況來決定是否發給用戶票據。當應用服務器S取得服務請求後,S應該可以驗證票據的發放者和票據的持有者的身份。 由於采用了公鑰體制,用戶的身份已經包含在證書中了;利用簽名,即可以保證消息來源的真實性、完整性和不可否認性;利用接收方的公鑰加密,即可以保證只有接收方才能將數據解開,同時也能保證數據的完整性和機密性;使用各方所擁有的本地所保存的同步變量N,就可以保證消息的新鮮性。 在規模較大、各實體比較分散的網絡環境下,實現系統各部分的時間同步可以說非常困難。本系統利用了同步變量N來替換Kerberos中的時間戳。對於同步變量N,其應為位數足夠大的整數,在初始使用時,由於客戶端C、服務器S本地均沒有變量N,我們可以認為其值為null,null小於任何壹個整數。當客戶端第壹次進行傳輸時需要取N=Nc 1,即N=null 1,這時可以取壹個適當範圍內的隨機數,做為第壹次會話中使用的N。當應用服務器S收到N後,便可以為此用戶設置本地變量N的值。 在上述協議中,用戶每次與服務器交互都必須向認證代理AA申請壹次票據,這樣顯然對用戶不方便,而且認證代理AA的負擔很大。基於這兩點考慮,在上述協議中可以引入票據生存期(lifetime)參量,在生存期內用戶能夠重復使用票據,而不必再向認證代理AA提出申請。對於票據生存時間,可以由應用服務器自己規定,也可以由認證代理AA在發放票據的時候給出。在此本系統采用了後壹種方法。通過分析可以看出,在上述協議中,第壹步的簽名並不是必須的,因為非法用戶根本無法得到會話密鑰,也就無法向應用服務器證明自己是證書持有者,所以我們也將其去掉,減少不必要的計算。改進後的協議如下: 1)票據請求(Ticket_req),C->AA:C,S,N,CERTc 2) 票據發放(Ticket_rep),AA-> C:Ts, ((Kcs,N) SIGNAA) ENCpubc Ts=((C,S,Kcs,N,lifetime)SIGNAA)ENCpubs 3)服務請求(S_req),C->S:Ts,(N,ra,seq,opinion)Kcs 4)服務器身份認證(S_rep),S->C:(ra)Kcs(可選由 opinion決定) 符號說明如下:
◆Lifetime:票據生存時間,(從服務器第壹次接收服務請求後開始計時); ◆ra:隨機會話密鑰; ◆seq:服務請求序列號; ◆opinion:用戶是否要求對服務器驗證,1為要求,0為不要求。 在第二步中,認證代理AA在票據中加入了票據的生存期lifetime,說明此票據的生存時間。 在第三步中,用戶C除了向應用服務器S提交最初協議中的內容外,還加入了ra和seq,ra為C生成的壹個隨機數。在最初的協議中,使用Kcs做為會話密鑰,在這裏使用ra做為二者會話密鑰,因為用戶C在票據的生存期內可以重復訪問服務器S,處於安全性考慮,每次會話都使用不同的會話密鑰ra。為了防止在票據的生存期內攻擊者對服務器請求消息的重放,協議中引入了請求的序列號seq。seq從1開始,每次加壹。 對於服務器S,除了保留同步變量N外,還要保存用戶票據的到期時間Texp,以及用戶最後壹次服務請求的序號seq。 當服務器S收到用戶的請求服務消息後,取得票據中的N有可能出現以下三種情況: 1)N>Ns,說明此請求使用的是新票據,在對請求的所有驗證通過後,則使Ns=N,設置過期時間Texp=Tnow lifetime,同時使本地所保存的seq為此次請求的中的seq; 2)N=Ns,說明此請求為重新登錄請求,此時檢查Tnow>Texp,看票據是否過期,在驗證票據的發放者和持有者後,還要檢查請求中的序列號seq是否大於本地所保存的上次請求的序列號,如果成立,則將seq更新為此次的請求的序列號,否則認為此消息為重放消息。 3)若N<Ns,則認為此消息為重放消息,將其拋棄。 若opinion=1,則用戶要求對服務器驗證,此時服務器S需要返回消息4,若opinion=0則服務器不需要返回用戶對自己的認證消息4。 在第四步中,服務器將ra加密後返回給用戶C,由於ra的隨機性,所以攻擊者無法冒充,也無法進行重放,這樣就驗證了此消息的真實性和新鮮性。 4 認證協議的安全性分析 分析此協議的安全性時,我們主要從協議的邏輯性方面來分析,因為像拒絕服務等攻擊方式,應該由防火墻或入侵檢測系統來阻止。這裏我們主要采用了BAN邏輯分析協議的安全性,BAN邏輯是基於知識和信仰的形式邏輯分析方法,它是通過認證協議運行過程中消息的接收和發送,來從最初的信仰逐漸發展為協議運行要達到的目的主體的最終信仰。由於協議證明篇幅較長,在此省略,經推理證明,本認證協議最終得到了壹級信仰和二級信仰。 5 總結 本文在認證協議設計時,主要是利用公鑰對kerberos進行了改進,並根據實際情況,去掉了壹些不需要的步驟。用戶的身份認證與授權由認證代理服務器負責,整個協議過程分為票據請求、票據發放、服務請求和服務器身份認證等四個階段,前兩步主要是用戶和認證代理進行交互,後兩步主要是用戶同應用服務器進行交互。用戶進行身份認證後,用戶和應用服務器之間可以動態地建立壹個***享的會話密鑰,本認證協議相對kerberos認證協議較為簡潔,但通過使用BAN邏輯證明協議的安全性較高,具有壹定的應用價值。 參考文獻 ⑴Brian Tung.Public Key Cryptography for Initial Authentication in Kerberos.draft-ietf-cat- kerberos-pk-init- 15.txt ⑵Matthew Hur.Public Key Cryptography for Cross-Realm Authentication in Kerberos.draft-ietf-cat-kerberos- pk-cross- 08.txt ⑶ M. Sirbu, J. Chuang.Distributed Authentication in Kerberos Using Public KeyRFC 1510:The Kerberos Network Authentication Service (V5). 1993-09