文/杜晉博 茅維華 白雪松
上海交通大學:構建高校應用系統級別的信任機制
文/杜晉博 茅維華 白雪松
隨著高校信息化的蓬勃發展,高校內部的信息系統(分布式應用)也隨之而增多,各個應用之間通過各種方式進行著信息的傳遞和共享,從而使信息傳遞過程的安全性顯得愈發重要。通過對Kerberos模型的簡化和改進,提出一種應用系統服務提供和調用的模型,借助于已有的“上海交通大學統一授權服務”,為服務的供應者提供可信的方式,來驗證服務調用者的合法性,從而在應用的級別實現應用間的信任,構建更加安全可靠的面向服務架構的應用。
Kerberos協議
Kerberos協議是一種計算機網絡授權協議,用來在非安全網絡中對個人通信以安全的手段進行身份認證。該認證過程的實現不需要依賴于主機操作系統的認證以及整個網絡的安全保證。
Kerberos版本4的主要設計者Steve Miller和Clifford Neuman,在1980年末發布了這個版本。這個版本主要針對Project Athena。版本5由John Kohl和Clifford Neuman設計,在1993年作為RFC 1510頒布(在2005年由RFC 4120取代)。
該協議的思想被廣泛地應用于各種認證系統,其中包括上海交通大學的統一身份認證系統,用以實現在上海交通大學校內各應用系統的單點登錄。
上海交通大學統一身份認證
上海交通大學統一身份認證系統(SJTU JAccount),是上海交通大學網絡信息中心開發的用戶認證體系,以實現校內的單點登錄。上海交通大學網絡信息中心為每個注冊的交大校園網用戶提供一個統一的網絡賬戶,稱為jaccount。通過jaccount認證體系,可以在Web應用中實現單點登錄,即用戶在一個瀏覽器會話期中只需登錄一次就能進入所有其擁有訪問權限的jaccount成員站點。此身份認證的前提是SJTU JAccount服務為需要使用單點登錄的校內應用共享一個SiteKey,通過此密鑰來實現通訊間加密。
上海交通大學統一授權服務
上海交通大學統一授權服務(S J T U Entitle)是基于統一身份認證系統進行管理的,統一授權系統為各應用系統提供一個統一授權的接口。各應用系統的管理員可以通過Web Service接口對用戶在該應用系統內的權限進行管理,當用戶訪問使用了統一授權的第三方應用系統時,第三方應用系統通過調用統一授權系統提供的Web Service接口,獲取特定的jaccount用戶在該應用中的相應權限、角色等認證信息。
本研究將基于統一授權系統進行擴展,試圖使統一授權系統提供類Kerberos的認證服務,使高校內各個應用系統間的服務調用可信。

圖1 應用間信任模型
OAuth開放授權
OAuth(開放授權)是一個開放標準,允許用戶讓第三方網站訪問該用戶在某一網站上存儲的私密資源(如照片、視頻、聯系人列表),而無需將用戶名和密碼提供給第三方網站。
由于OAuth在目前的互聯網上應用廣泛,很多服務如Open API,很多大公司如Google、Yahoo、Microsoft等都提供OAuth認證服務,這些都足以說明OAuth標準逐漸成為開放資源授權的標準,所以我們在系統設計初期也曾考慮采用OAuth標準的應用間的信任方式,但相比Kerberos而言,OAuth模型更適合于非集中式的Web環境,在學校、企業內部使用Kerberos模式的應用級的信任更有利于降低應用系統的開發代價,有利于高校應用系統的集中管理和統一規劃。
本研究采用的模型主要涉及到服務調用者(Service Invoker)、服務提供者(Service Provider)和上海交通大學統一授權服務(SJTU Entitle)三部分。考慮到上海交通大學統一認證系統(SJTU JAccount)本來已經與服務調用者、服務提供者有著共享的密鑰(SiteKey,參見1.2節),所以統一授權服務將采用統一認證系統系統所持有的站點密鑰,從而最大程度地降低對遺留系統的影響和新應用開發的代價。
各個系統間的關系如圖1所示。本模型的具體機制可以分為三個步驟。
服務調用者從統一授權服務獲取Token
服務調用者從統一授權服務獲取Token是此模型機制的第一個步驟,服務調用者向統一授權服務進行RequestToken請求,申請Token。RequestToken接口是統一授權所有服務接口中,唯一不需要驗證參數(Ticket)的服務。此接口可以定義如下:
stringRequestToken(string providerId)
RequestToken方法為服務調用者獲取一個用來訪問應用標識為providerId的Token。定義Key(Text)表示用Key做密鑰加密明文Text之后的密文,則其中Token格式可表示為:
InvokerKey(Expire,SessionKey,ProviderPart)
其中InvokerKey為服務調用者在統一身份認證系統中的站點密鑰。Expire表示超時的時間戳,用Unix風格的時間表示,即1970年1月1日至今的Seconds數。超時以后Token將不可用,必須重新申請。
ProviderPart部分組成如下:
ProviderKey(Expire,InvokerId,InvokerIP,SessionKey)
此部分Invoker無法解密,須組裝到Ticket并交給Service Provider解析驗證。
ProviderPart加密的四部分信息:Expire:用于驗證時間上是否超時;InvokerId:用于驗證調用者身份是否被篡改;
InvokerIP:用于驗證調者位置是否變動,防止信息被攔截;
SessionKey:用于解密和Invoker提供的通訊數據。
注意此處的SessionKey分別通過InvokerKey和ProviderKey(均由SJTU JAccount系統提供)進行加密,同Kerberos一樣,此SessionKey將作為Invoker和Provider之間通訊的唯一共享的秘密。
服務調用者將Token再重組為Ticket
服務調用者獲取到Token后,將自行組裝Ticket。此Ticket將用于下一步驟的服務調用,并可被服務提供者驗證并信任。
Ticket格式定義如下:
(InvokerPart,ProviderPart,ArgumentsSignature)
InvokerPart格式:SessionKey(Timestamp, InvokerId)
其中Timestamp為當前Invoker的系統時間。
ArgumentsSignature格式如下:
SessionKey(MD5(Timestamp, Arguments))
即首先把所有參數連接后,加入Timestamp作為擾亂信息。然后通過MD5取得信息摘要,最后用SessionKey加密。此參數簽名用于防止網絡傳輸過程中Web Service的參數被篡改。
服務提供者驗證服務調用者的合法性
RequestToken將是唯一一個不需要Ticket參數的服務。即凡是使用本研究所描述的模型的應用,在對外提供服務時,將要求服務調用者提供Ticket參數,并在每次服務調用時通過此參數(Ticket)驗證來獲得對Invoker的信任關系。
服務提供者收到Ticket以后,首先通過ProviderKey來解密ProviderPart獲得SessionKey,然后通過SessionKey解密InvokerPart和ArgumentsSignature,之后服務提供者對Ticket做如下驗證:
1. 驗證ProviderPart和InvokerPart的InvokerId
2. 驗證Expire Timeout(可設定)<=Timestamp <= Expire。此處考慮到網絡延時、服務器時間的不同步等,在檢查時將有少量的容錯的偏移。
3. 驗證InvokerIP是否一致,服務提供者可從Request中獲取。此處考慮的網絡拓撲等因素,要求InvokerIP對應于統一授權服務的IP和對應于服務提供者的IP必須是相同的。當此要求不被滿足時,此檢查將通過一定方式跳過。
4.驗證參數摘要ArgumentsSignature。
如果驗證通過,則此次服務調用將被認為可信,并有助于服務提供者獲得調用者的更詳盡信息。
本文通過提出應用間的信任模型,以解決高校內部各個應用系統之間在不安全的網絡環境中的信任問題,并且已經在上海交通大學的多個應用系統中實施運行。但此模型依然存在一些問題,其中一個問題是單向信任的問題。出于效率考慮,本模型僅僅可供服務的提供者來信任服務的調用者,而沒法保證服務的調用者調用到的服務是可信任的。
另外一個問題是服務的信任級別和信任粒度問題。OAuth可以有更細的、權限級別的應用間信任的粒度,而本模型只能提供應用級別的信任,服務級、接口級或者權限級別的粒度的信任,還是一個有待研究的問題。
(作者單位為上海交通大學網絡信息中心)
擴展文獻:
[1]http://web.mit.edu/kerberos/www/:Kerberos:The Network Authentication Protocol.
[2]The Kerberos Network Authentication Service (V5), RFC1510.
[3]http://zh.wikipedia.org/wiki/Kerberos, 2011/04/05有效.
[4] 茅維華,謝金寶,Web 應用單一登錄的類Kerberos 實現,計算機應用與軟件,2004年2月,pp.87-90.
[5]白雪松,茅維華,身份與權限體系關鍵技術的總體設計與實踐,中山大學學報(自然科學版),200948(z1):260~263頁.
[6] http://zh.wikipedia.org/wiki/OAuth2011/04/05有效.