1 引言
操作系統的安全特性主要包括兩方面:安全性和可靠性,作為計算機體系結構中最基礎的軟件,操作系統的安全自然成為信息安全的基石。
強調安全性的安全操作系統有:EROS、DTOS、SELinux[1]等。同時,突出強調可靠性的操作系統稱為安全關鍵操作系統SCOS(Safety Critical Operating System)[2],主要應用于一旦失效將造成災難性損失的場合。隔離技術是SCOS保障可靠性的重要手段。隔離技術可分為兩類:時間隔離和空間隔離。時間隔離主要從時間維上減少不同系統組件的沖突,典型的技術是分時調度,主要用以防止單一任務長期占用處理器資源[3];空間隔離則從空間維上防止系統組件的代碼和數據相互干擾,進程地址空間是其典型實現。各種SCOS都對隔離提供了支持,例如著名的LynxOS[4]提供了硬分區和層次調度機制,分別對應于空間隔離和時間隔離技術。CRTOS則提供了兩級調度結構[5]以支持時間隔離機制。
目前采用的空間隔離技術仍然屬于基本的形式。在硬件層采用分頁/段、特權級機制等[6]都屬于空間隔離,例如文獻[7]在Linux中利用未使用的處理器特權級實現了更細致的分層隔離保護。但通過硬件機制達到更好的隔離效果會增加硬件設計的復雜程度。進程/線程模型(PT模型)為每個進程分配獨立的地址空間和運行堆棧,同時將整個進程地址空間劃分為用戶空間和內核空間,即采用了空間隔離形式。在基于PT模型的操作系統(如Linux)[8]中,進程的用戶地址空間是隔離的,但是內核地址空間確是共享的,這導致了不安全的隱患;而在微內核操作系統的內核空間中盡量多的內容都挪動到用戶空間中,以用戶態服務進程的方式實現這些功能[9],從而一定程度上提高了隔離性和安全性。表1給出了上述各系統模型的隔離性對比:
表1 各個系統模型隔離性的比較
系統模型 |
隔離實現方式 |
隔離粒度 |
安全性 |
PT模型-單內核 |
用戶空間隔離,大片內核空間共享 |
進程(內核空間大) |
一般 |
PT模型-微內核 |
用戶空間隔離,少量內核空間共享 |
進程(內核空間。 |
較高 |
面臨不斷增強的安全性威脅,上述的各種隔離方式都不能提供充分的安全支持,而需要對模塊中的功能進行劃分和隔離,即實現功能隔離,不僅要對不同的用戶執行的功能進行隔離,還需要使同一用戶執行的功能之間隔離。
本文首先描述功能隔離的定義,然后提出功能劃分的方法,接著提出了基于進程的功能隔離PFI(Process-based Function Isolation)。最后通過實驗數據給出了該機制運行的效果及分析,從而證明了功能隔離的可行性。
2 功能隔離定義
功能隔離的定義可以用5個基本元素和5個導出元素來共同描述。
(1) 基本元素
模塊集合MODULES。模塊是能夠完成特定任務的代碼及其相關數據的集合,并且這些代碼和數據應該易于識別和抽取,具有明確的接口,是一個可以獨立部署的整體單元。
所有模塊提供的所有功能的集合ALL_FUNCS。功能是指模塊能完成的工作,通常一個功能與模塊的一個或多個接口相關。用戶可以通過這些接口來使用某功能。
角色集合ROLES。角色用于標識不同的權限集合,當用戶被賦予某角色后,它將具有與此角色對應的所有權限,這與RBAC等安全模型中的定義是一樣的。
所有功能權限的集合ALL_PERMS。功能權限是指用戶使用功能的權力,可以指定用戶有權或者無權以及如何使用此功能。
執行域集合EXEC_FIELDS。執行域提供代碼運行和訪問數據的區域,域內的代碼只能在域內進行訪問操作,不同的執行域之間相互隔離。執行域的實現與操作系統模型相關,如PT模型中的執行域對應于進程的地址空間。
執行域屬性集合EXEC_FIELD_ATTRS。執行域屬性說明以何種方式訪問執行域中的內容。
(2) 導出元素
模塊的功能集module_funcs: MODULES ® 2ALL_FUNCS。這是由模塊到其提供的功能集的映射關系。module_funcs ( M ),M Î MODULES給出了模塊M的提供的所有功能的集合。
功能訪問func_access = ( M, r, f ),M Î MODULES, r Î ROLES, f Î module_funcs( M )。這是由模塊、角色和功能定義的三元組,表示角色r的用戶可以請求模塊M的功能f。
功能(訪問)集合FUNC_SET Í MODULES ´ ROLES ´ module_funcs(M),MÎMODULES。這是由若干功能訪問func_access構成的集合,是將所有角色的用戶對某個模塊的所有功能訪問按照某種規則進行劃分后,被劃分到一起的功能訪問形成的集合,這個過程稱為功能劃分。
功能訪問權限func_perm: FUNC_SET ® 2ALL_PERMS。這是由功能訪問到權限集合的映射的關系,給出了用戶請求功能時的權限。
功能(訪問)集合權限func_set_perm: 2FUNC_SET ® 2ALL_PERMS。這是由功能訪問集合到權限集合的映射關系,其計算方式是取最小的但能囊括集合中所有功能權限的權限集合。特別的,當ALL_PERMS中的權限彼此獨立時,其計算方式為:func_set_perm ( FS ) = È f Î FS func_perm ( f ),FS Î 2FUNC_SET,即功能集合中所有功能訪問權限的并集。
(3) 功能隔離
功能隔離機制包括功能劃分操作和功能隔離操作,分別定義如下:
功能劃分操作func_divide: FUNC_SET ® 2FUNC_SET。這是由功能訪問到功能集合的映射關系,它將所有角色對某模塊所有功能的功能訪問根據其功能訪問權限劃分為功能集合;
功能隔離操作。表示為兩個函數,func_isolate和isolate_method。前者用于為各功能集合分配相互隔離的執行域,定義為func_isolate: 2FUNC_SET ® EXEC_FIELDS,后者用于根據功能集合的權限確定執行域的屬性,定義為isolate_method: 2ALL_PERMS ® 2EXEC_FIELD_ATTRS。
3 功能劃分
假設模塊M提供的所有功能表示為FM = { f1,f2,…,fm },系統中的所有角色表示為R = { r1,r2,…,rn },則以矩陣方式定義這些角色對模塊M中的所有功能的功能權限,稱之為功能權限矩陣,表示為:FPMM = { fpmij }
其中fpmij表示角色ri對功能fj具有的功能權限,這是權限集合P={ p1,p2,…,pn }的某個子集(包括空集)。而對"pkÎP,表示了角色可以如何操作(使用)某功能,其取值與具體的應用和安全策略相關,可由模塊根據自身需求確定。通常模塊可以按照最小特權原則或者數據機密性/完整性原則制定功能權限。pk的一種可能取值如表2所示。
表2 功能權限的一種定義方式
pk的取值 |
含義 |
只讀 |
只允許ri執行功能fj的操作,并且只允許執行時的讀數據操作 |
讀寫 |
只允許ri執行功能fj的操作,且允許執行時數據的讀和寫操作 |
只讀+寫時復制 |
只允許ri執行功能fj的操作,允許執行時數據的讀操作,當有寫操作時不直接修改原始數據,而是生成數據的副本并修改之 |
復制+只讀 |
只允許ri執行功能fj的操作,不允許直接讀取原始數據,而是當有讀操作時生成數據的副本并讀之 |
復制+讀寫 |
只允許ri執行功能fj的操作,不允許直接讀寫原始數據,而是當有讀或寫操作時生成數據的副本并讀寫之 |
執行 |
允許在執行功能fj的過程中調用其它的功能 |
另一種pk的取法是為每個角色和功能定義權限級(記為p(X)),以自然數編號,數值越高則權限級越低,其中p(ri)表示了ri能夠執行的功能的重要程度,而p(fj)則表示了執行fj的角色的重要程度。則pk可取為p(ri)<=p(fj)?1:0,即只允許角色執行比自身權限級低的功能。
可以按照多種方式劃分功能集合,前提是不同角色的功能訪問相互隔離,即不同角色的功能訪問(即FPM的不同行)一定屬于不同的功能集合中。如果允許不同角色的功能訪問在同一個功能集合中,則可以考慮在進行功能劃分和功能隔離時將這些角色看作是同一個角色。在此前提下,可以對同一角色的功能訪問(即FPM的某一行)進行更細粒度的劃分,劃分按照某種規則,例如將功能權限相同的或者在某個權限范圍中的功能訪問劃分到一起。將滿足這種規則的某兩個功能訪問的權限的關系定義為相似(記為@),即如果對于角色ri,其所執行的某兩個功能fs、ft屬于同一個功能集合,當且僅當其功能權限fpmis @ fpmit,此時一個功能集合只和一個角色相關,稱此功能集合為該角色的功能集合。因此可以按照下述功能劃分算法求得對模塊M的所有角色的功能集合并確定這些功能集合的權限:
輸入參數:R、M、FM、FPMM
輸出參數:對模塊M的所有角色的功能集合列表ΦM = {ΦMi," i,riÎR }
for each riÎR
初始化角色ri的功能集合列表ΦMi = { InitFuncSet }; //InitFuncSet是在模塊M向隔離機制注冊時靜態配置的
初始時ΦMi中的任意功能集合φ ÎΦMi,其權限P(φ) = InitPerm(φ);
//函數InitPerm返回功能集合φ的權限,這是根據功能集合權限的定義和M初始注冊的靜態配置信息計算得到的
for each fj Î FM {
for each φ ÎΦMi
if $ fx Î φ,使得fpmij @ fpmix { //將ri對fj的功能及其權限訪問加入到功能集合φ及其權限P(φ)中
φ = φ È {fj};
P(φ) = P(φ) È {fpmij};
break;
}
if Ø$ φ ÎΦMi滿足上述判定 {//建立新的功能集合及其權限
ΦMi =ΦMi È {{fj}};
P({fj}) = {fpmij};
}
}
得到對模塊M的角色ri的功能集合列表ΦMi = {φ};
顯然,按照該算法劃分得到的全部功能集合滿足兩個特性:(1) 屬于同一角色的功能集合中不會出現重復的功能;(2) 屬于不同角色的功能集合中則可能出現重復的功能。
4 基于進程的功能隔離(PFI)
PFI[10]是進程隔離方式的一種實現。功能隔離的目標是將劃分的每個功能集合分配到獨立的功能集合執行域中,執行域在PT模型中最直接的實現方式就是進程,PFI策略為每個需要隔離的功能集合分配一個進程。
這種隔離方式類似于客戶/服務器模型,但PFI方式對其進行了系統的擴展和完善。圖1給出了PFI策略的工作示意圖。
圖中隔離管理器IM(Isolation Manager)包含兩個部分:功能劃分機制和隔離管理機制。前者用于劃分功能集合,后者則實現各功能集合間的隔離。
模塊M首先將模塊及其各個功能的初始權能信息注冊到IM中,IM的功能劃分機制對它們進行劃分。圖中假設M的當前功能集合劃分為:F1為角色r1對功能f1、f2的功能訪問構成的功能集合,F2為r1對f3、f4的功能訪問構成的功能集合,F3為r2對f2、f3的功能訪問構成的功能集合。
圖1 PFI策略示意圖
當屬于角色r1的某個用戶請求模塊M的f1功能時,首先將該請求重定向給IM,如果IM的功能劃分機制判定需要為此請求執行隔離操作,則IM創建進程P1,P1稱為工作者進程,并按照功能集合F1的權限(P(F1))將M的相關代碼和數據以合適的方式映射到P1的地址空間中,同時也將IM的部分內容映射過去。然后IM使用IPC機制向P1發送消息,消息中包含了原始的功能請求參數。P1中IM的映射部分(IM')接收到該消息并將其解析后傳遞給P1中M的映射部分(M')。這樣r1對f1的功能請求就可以在隔離的進程空間中得到處理了。當消息處理完畢后,M'將結果傳遞給IM',IM'再通過IPC機制將結果發送給IM,最后由IM將結果回送給請求者,從而完成了一次完整的功能請求過程。
5 性能評測
PFI能將不同的功能訪問隔離到不同執行域中,因此可以保證不同執行域中的內容不相互干擾,從而提高安全可靠性。其代價是犧牲了一定的系統性能,此代價主要包括IPC機制、創建進程操作、地址空間映射操作。為了評估這種代價,作者在Linux中實現了PFI的原型,并使Linux的文件系統使用隔離機制運行。測試平臺為:硬件使用1 GHz處理器、128 MB內存、5400轉硬盤;操作系統使用Linux 2.6.19.7。此外,在所實現的原型系統中,參與的各個模塊都采用獨立的進程實現,以確保最佳的安全性。
(1) 文件操作實驗
本實驗對文件系統的文件打開操作實施功能隔離,即把各用戶對文件的打開操作隔離到不同的執行域中執行。所打開的文件/目錄集合是隨機生成的。結果如表3所示,其中比值是指PFI開銷與操作時間之比。
表3文件操作測試數據
路徑深度 |
打開操作時間 |
PFI開銷/比值 |
1 |
11.12ms |
318.57us |
2.87% |
3 |
20.84ms |
320.72us |
1.54% |
5 |
17.30ms |
322.68us |
1.87% |
7 |
27.62ms |
321.39us |
1.16% |
9 |
33.48ms |
322.18us |
0.96% |
由表3可看出,功能隔離機制的時間開銷相對于文件操作而言基本可以忽略,這是因為文件操作涉及對磁盤的操作,這一過程耗時較長。需要說明的是,深度為5時的打開操作時間反而小于深度為3時的打開操作時間,這是由于文件系統緩存的影響。
(2) B樹操作實驗
本實驗使用對B樹N次增加-查找-刪除操作序列來模擬數據庫系統中的事務負載,各個事務的執行被隔離到不同的執行域中。結果如表4所示。
表4 數據庫模擬操作測試數據
模擬次數N |
負載操作時間 |
PFI開銷/比值 |
10 |
325.51us |
333.31us |
102.40% |
30 |
544.99us |
330.64us |
60.67% |
50 |
765.44us |
333.06us |
43.51% |
70 |
985.60us |
333.46us |
33.83% |
90 |
1235.75us |
332.94us |
26.94% |
由表4可看出,開銷比值隨N的增大而降低。在現實系統中,數據庫的規模往往很龐大,而且經常涉及到外存的操作,單個事務或者操作的執行時間都會在毫秒甚至秒以上的量級,此時功能隔離機制的開銷就能足夠小到基本可被忽略。
一般而言,只有當功能本身的執行時間大于功能隔離機制的開銷時,功能隔離才不會對系統性能造成嚴重影響。對于耗時較短的功能,其執行過程相對簡單,其安全性可以得到較好的控制(可以進行非常完善的測試、甚至靜態代碼的形式化分析驗證等),不需要功能隔離機制就可以達到很好的安全可靠性,而耗時較長的功能往往意味著復雜的操作,此時僅通過測試或形式化驗證的方法很難達到目標,功能隔離機制則可以在不顯著影響系統性能的前提下大幅提高系統的安全可靠性。
6 結語
本文提出并詳細描述了功能隔離的概念及其實現技術。這是一種細粒度的空間隔離技術,可以使模塊的各個功能的執行互不干擾,從而顯著提高系統的安全可靠性,因此特別適用于對安全可靠性要求高的應用領域。評測結果表明,在保證高安全可靠性的前提下,功能隔離機制不會對系統性能造成嚴重影響。
參考文獻
[1] 劉克龍,馮登國,石文昌. 安全操作系統原理與技術. 科學出版社. 2004
[2] Knight J. C. Safety critical systems: challenges and directions. In Proceedings of the 24th international Conference on Software Engineering, New York: ACM Press, 2002. 547-550
[3] G Lamastra. The design of operating systems supporting temporal isolation: [Ph.D Thesis]. Pisa. Italy: ReTis Laboratory, Scuola Superiore S. Anna, 2000
[4] LynuxWorks. LynxOS. http://www.lynuxworks.com/rtos/rtos.php
[5] YANG Shi-Ping, SANG Nan, CHEN Hui et al. Design and Realization of Safety Critical Real Time Operating System Based on Temporal Isolation Safeguard Mechanisms. JOURNAL OF COMPUTER RESEARCH AND DEVELOPMENT, 2004, 41(1):1306~1314 (in Chinese)
楊仕平,桑楠,陳慧 等. 安全關鍵實時操作系統時間隔離保護機制的設計與實現. 計算機研究與發展,2004,41(7):1306~1314
[6] 楊季文. 80X86匯編語言程序設計教程. 清華大學出版社. 1998
[7] XieJun, HuangHao, ZhangJia. KERNEL MODULES ISOLATION MECHANISM BASED ON SEGMENTATION PROTECTION. Computer Applications and Software, 2006, 23(12):14~15 (in Chinese)
謝鈞,黃皓,張佳. 基于分段保護的內核模塊隔離機制. 計算機應用與軟件,2006,23(12):14~15
[8] Daniel P. Bovet, Marco Cesati. Understanding the Linux Kernel (3rd). O’REILLY. 2006
[9] U. Vahalia. Unix Internals: The New Frontiers (2nd). Prentice Hall. 2006
[10] Tang Ling. Research on Function Isolation Mechanism of Secure Operating System: [Ph.D. Thesis]. Hefei: University of Science and Technology of China, 2007 (in Chinese)
唐玲. 安全操作系統中的功能隔離機制研究:[博士學位論文]. 合肥:中國科學技術大學,2007
作者聯系方式:唐玲,華東政法大學,信息科學與技術系,09902