杜軍龍,周劍濤
(江西省信息中心,南昌 330001)
強制性訪問控制(Mandatory Access Control,MAC)[1]被美國國家計算機安全中心NCSC的安全標準TCSEC列為B級安全操作系統的基本要求[2]。MAC具有非常強的魯棒性,能夠絕對執行安全管理員預定的訪問控制策略,有效防止特洛伊木馬的攻擊。目前對Linux操作系統平臺的MAC機制研究較多且側重點不同,主要研究包括Flask模型、Clark-Wilson模型、Bell-lapadula模型、Biba模型、Chinese-Wall模型、DTE模型和Lattice模型以及各企業、團體自主研發的設計模型等[3-6]。
然而,在特殊單位中,單一MAC機制很難完全滿足其通用Linux平臺使用的特殊性與多樣性安全需求,需要多種MAC機制并存互補,以提供更高的系統安全性。目前針對通用Linux系統中的多MAC機制并存研究較少,以Selinux機制為代表的具有主/從性的多MAC堆疊并存機制較為普及,它將Selinux作為主安全模塊,后續MAC機制通過mod_reg_security函數在主模塊中進行注冊成為從安全模塊,較好地支持了MAC并存與調用,但從安全模塊受主安全模塊策略的約束與管理,并且在kernel-2.6.19以后不支持mod_reg_security函數的使用[7]。文獻[8]設計了一種在kernel源碼中以安全域數組的形式實現的多MAC機制并存管理器,有效地支持了多MAC并存,但這種并存管理器的平臺可遷移性差,對于不愿更改內核的用戶,他們難以接受這種方法。文獻[9]利用擴展內核hook安全域的形式,以內核通用鏈表做載體為系統提供一種多MAC并存機制,但是該法的綜合決策和鏈式調用存在系統開銷大和靈活性不足問題。
基于以上問題,在沿襲內核hook安全域擴展的基礎上,本文提出一種多種MAC機制并存的動態裝載方法。該方法使MAC機制以動態方式載入系統且能與平臺自有MAC機制實現并存,同時輔以優先級調度算法實現靈活調度[10]。
目前, Linux操作系統平臺自帶的通用MAC機制大都是依托Flask模型進行工程實現的[11]。Flask模型以進程為主體,按照集中式或分散式的策略權限訪問系統資源客體,存在類型強制與多層安全非強制的形式,同時具備控制精細、策略靈活與可配置等特點。通用MAC機制通過更改內核全局描述表security_ops中hook地址指向,以KO的形式進行動態裝載[12]。通用MAC裝載及其控制流程如圖1所示。

圖1 通用MAC裝載流程
通用MAC裝載流程主要包括以下步驟:
1)系統開機,內核層首先進行安全初始化,將內核全局描述表security_ops地址指向系統默認安全模塊default_security_ops,此過程無任何MAC機制,僅作為初始化使用。
2)平臺自帶Flask模型的MAC機制將獲取內核全局描述表security_ops地址,并進行地址替換,使之指向MAC機制中自定義的全局描述表,此時系統平臺的初始化安全模塊default_security_ops失效,MAC機制裝載成功且生效。
3)用戶層進程訪問客體,首先讀取系統文件目錄項,查找系統資源客體inode節點,并獲取inode節點屬性信息,然后經過內核接口執行程序功能性錯誤檢查。
4)進行系統平臺傳統的DAC權限檢查校驗。
5)經過以上步驟,在用戶進程即將訪問客體之前,內核層生效的MAC機制將讀取強訪策略,最終確定主體訪問客體權限。
系統內核中的透明安全域是一個void*類型指針,它將安全模塊中的安全信息和內核內部對象聯系起來,對MAC機制的支持具有唯一性,如若安全域被主模塊占用,勢必導致其他MAC機制失效。針對要實現2種甚至多種MAC機制的并存問題,本節對多種MAC機制并存動態裝載進行設計與實現。
針對Linux平臺需要多種MAC機制并存以增強系統安全性的需求,提出一種具備靈活調度的多種MAC機制并存動態裝載方法。該方法主要分為MAC機制裝載與還原、并存調度策略、訪問仲裁和安全防篡改4個部分,其設計裝載流程如圖2所示,其中,header為跳躍表頭。

圖2 MAC并存裝載流程
多種MAC機制并存裝載沿襲了內核安全域擴展思想,但在安全模塊加載過程與傳統通用動態裝載的hook地址替換法不同,它利用跳躍表[13]對內核全局描述表security_ops的入口點進行重新構造,以實現多MAC裝載管理機制與MAC模塊功能的靜態分離。跳躍表裝載多MAC的機制作為與MAC功能模塊交互的唯一途徑,具有順鏈式(先進先出的MAC互聯邏輯)與跳躍式(任意順序的MAC互聯邏輯)2種調用,如圖2所示。鑒于系統安全的第一要義是安全,其次是性能,管理機制可無上限裝載多個MAC有違系統安全和性能要求,將MAC裝載上限以可配置的方式予以提供。多種MAC機制還原是對跳躍表裝載方式移除后的環境歸整,還原為系統平臺自帶MAC的強訪境況。
并存調度策略摒棄了以往FIFO模型實現的鏈式順序調度思想,利用優先級算法實現了多MAC機制的并存靈活調度設計。優先級P是根據實際中不同MAC機制的側重點不同進行的靜態標簽設置,如圖2所示。預定義P為8個等級,P={P0,P1,…,P7},P0優先級最高,依次逐級遞減,同等優先級時,按照先進先出順序進行調度。
訪問仲裁是多MAC機制并存策略最終的決策者,決定了策略最終實施的成功與否。在已有并存技術中,全部MAC機制運行后對返回結果做統一仲裁的方式具有可行性,但卻要將系統已裝載的MAC都運行。簡單說,如果系統中第一個MAC機制已確認該操作不安全,下面的MAC機制則不需要運行實施,可直接給出仲裁結果。鑒于不同MAC機制具體的權威性與可信性不同,如若直接給出仲裁結果,可能導致仲裁偏差與失誤,本文設計的訪問仲裁通過引進權重比W的方式對結果進行修正,以增添仲裁可信性。W可設置為W={W0,W1,…,Wn},權重值越大,則影響力越大[14],如圖2所示。
安全防篡改功能是MAC機制并存方法在系統中的自安全增強機制,具備防篡改監控和自修復2個特點,如圖2所示。防篡改監控包含監控時間片和地址判斷2個要素。自修復是在防篡改監控發現被篡改的情景下做出的并存機制重載修復操作。
假設存在以下條件:
1)需并存裝載的MAC機制集合M={M0,M1,…,M6}。
2)已定義優先級P為8個等級,P={P0,P1,…,P7}。
3)已定義權重W為3個等級,W={W0,W1,W2}。
多種MAC機制并存動態裝載設計的實現過程如下:
1) MAC并存裝載與還原
內核安全域已被系統中自帶MAC機制占用,首先將安全域以SkipList形式進行擴展,以支持多安全模塊的注冊,以file結構的安全域void *f_security為例進行擴展,擴展前為struct file{…void*f_security;…},擴展后則為struct file {…struct mskiplist *list;void*f_security;…}。
file結構安全域擴展后的調用原理如圖3所示。file結構的安全域由之前指向系統自帶MAC機制的file結構,更改為指向SkipList的頭節點,SkipList中的各個節點安全域指針被設置指向具體安全模塊的file結構。
MAC并存裝載要對系統內核全局描述表security_ops的地址進行備份與替換,然而在通用Linux內核2.6.22及以上版本[15]中,已經不支持通過register_security函數操作security_ops地址方式,需手動進行獲取,其關鍵數據結構實現如下所示:
static int __coexit_init(void)
{static struct security_operations sec_ops_bak;
memset(&sec_ops_bak,0,sizeof(sec_ops_bak));
sec_ops_p = look_up_symbol("security_ops");
…;
memcpy(&sec_ops_bak,sec_ops_p,sizeof(sec_ops_bak));
…}
其中,第1行和第2行是為security_ops備份地址申請空間并初始化,第3行和第4行將獲取的security_ops地址進行備份。
多MAC裝載需維護一個安全模塊函數鏈表,該鏈表以跳躍表的數據結構實現,其節點結構如下所示:
typedef struct skiplist_node{
int p; /*優先級*/
float w; /*權重*/
int levels; /*保存結點的層數*/
struct security_operations * security_ops;
/*MAC機制中hook函數表*/
struct skiplist_node_level{
struct skiplist_node *forward; /*前指針*/
}level[]; /*level最大值為32*/
struct skiplist_node *backward; /*后指針*/
}skiplist_node;
將所需并存的MAC機制M={M0,M1,…,M6}裝載在安全模塊函數鏈表中,其示意圖如圖4所示。

圖4 多MAC并存裝載示意圖
2) MAC并存調度
并存調度策略引入了優先級調度算法思想,MAC的優先級P以靜態標簽形式存在。已知集合M,設M與P的自由組合為{M0,P0}、{M1,P7}、{M2,P2}、{M3,P0}、{M4,P1}、{M5,P1}和{M6,P0},如圖5所示。根據優先級高先調用、同等級按照先進先出的調度原則,MAC并存調度機制首先調用的是優先級最高的P0級,調用順序為{M0,P0}、{M3,P0}和{M6,P0},如圖5中所標線(長虛曲線)所示;然后,調用的是{M4,P1}和{M5,P1},如圖5中所標線(短虛曲線)所示;最后,調用的是{M2,P2},如圖5中所標線(實曲線)所示。

圖5 MAC調度示意圖
3) 訪問仲裁
訪問仲裁中處理的對象包含MAC集合M={M0,M1,…,M6},權重W={W0,W1,W2},K表示計算結果動態修正系數,R表示當前模塊返回結果,Z表示最后計算結果,以Ψ表示訪問仲裁集合,Ψ={M,W,K,R,Z}。
(1) MAC機制集合M={M0,M1,…,M6},按照優先級P的順序依次執行,并對應返回結果R={R0,R1,…,Rn}。
(2)結果集R結合模塊權重W和修正系數K進行決策計算,得出仲裁結果Z={undef,Z1,Z2,…,Zn}。其計算公式為:
(1)
4) 安全防篡改
安全防篡改中的篡改監控特征是通過周期輪巡的方式進行實現,通過比對security_ops的入口地址是否被跳躍表以外的地址進行替換而做出篡改判斷依據,其時間片可設置為3 s,如若被非法篡改,自修復特征將重新獲取security_ops的入口地址主動權,將多MAC機制重新裝載入系統。
本文將該并存方法在Linux通用系統平臺中進行了實現,主要的系統性能驗證如下:
1) 系統功耗性驗證
測試條件:
(1)系統中已默認裝載Flask模型實現的MAC機制。
(2)設存在系統MAC補充機制M0和M1,并且M0和M1中的功能hook均返回0,用以忽略hook函數內部的功能影響,以代表訪問過程均安全放行。
在Linux平臺條件(1)和(2)的環境下,實驗對比了多MAC機制堆疊并存裝載方法[7]和本文設計的多MAC機制并行裝載方法,分別執行10 000次、100 000次和1 000 000次的文件打開與關閉,并記錄執行所用時間,每一組重復執行10次,然后取其平均值。2組實驗結果對比如圖6所示。

圖6 通用堆疊與并行裝載執行時間對比
2) 防篡改功能驗證
假設在Linux通用系統平臺中已安裝本文可支持的多種MAC并存動態裝載機制,同時該并存動態裝載機制中包含系統自帶MAC及其補充MAC機制M0和M1。參照系統syslog審計方式,在并存動態裝載機制中每隔一定時間片主動獲取系統時間與內核全局描述表security_ops地址,并通過vfs_write函數將相關信息記錄到/var/log/security_ops.log中。
在Linux通用系統平臺中,創建文件replace_security_ops.c用以強占并更改security_ops指向地址。在文件replace_security_ops.c中,首先獲取當前系統內核全局描述表security_ops指向地址,然后更改security_ops指向地址,最終將文件以KO模塊形式編譯生成lsm.ko,通過執行insmod命令,將lsm.ko插入內核,如圖7所示。

圖7 安全防篡改測試截圖
在日志/var/log/security_ops.log中,每隔3 s輸出當前security_ops指向地址,在insmod操作動作執行前,系統輸出提示信息的INFO語句,顯示security_ops地址為ffffffff81ae2420。當執行insmod操作動作后,系統輸出提示信息WARN語句,顯示系統security_ops地址已被篡改,且篡改后地址為ffffffff81fdadc8。此時安全防篡改模塊將執行自修復功能,重新主動占據security_ops指向地址。經上述security_ops強占測試后,最終確認此方法具備安全防篡改功能。
本文提出一個多MAC機制并存的動態裝載方法,在并存裝載的同時以優先級調度算法對其進行靈活調度。測試結果表明,相比于通用堆疊并存技術,該方法能夠滿足多種MAC機制的系統并存需求,系統性能開銷小,并且模塊具備安全防篡改功能。下一步將對并存方法中的各種MAC機制運行時間片進行研究,在考慮優先級的情況下同時考慮時間要素,以先調用同優先級、時間片較小的MAC機制的方式達到更優的調度方案,進而提高系統性能。