王張軍 陳莉君
(西安郵電大學(xué)計(jì)算機(jī)學(xué)院 西安710121)
WANG ZhangjunCHEN Lijun
(School of Computer Science,Xi'an University of Posts and Telecommunications,Xi'an 710121)
隨著計(jì)算機(jī)技術(shù)的進(jìn)步,敏感信息泄露的風(fēng)險(xiǎn)也隨著更加便利的信息獲取和分享方式而變得日益嚴(yán)峻。常見(jiàn)的計(jì)算機(jī)安全保護(hù)措施如防火墻、專用網(wǎng)絡(luò)、入侵檢測(cè)等措施都是以入侵者無(wú)法直接接觸敏感信息為前提的,但是當(dāng)入侵者可以直接接觸到存儲(chǔ)著敏感信息的設(shè)備時(shí),對(duì)于機(jī)密信息的安全威脅也隨之增加。這種安全隱患的根源在于數(shù)據(jù)在存儲(chǔ)設(shè)備上是明文的,解決這種安全隱患的根本方法就是對(duì)數(shù)據(jù)進(jìn)行加密。透明加密技術(shù)[1]在數(shù)據(jù)存儲(chǔ)時(shí)默認(rèn)為數(shù)據(jù)加密,讀取時(shí)為數(shù)據(jù)解密,加解密的過(guò)程是自動(dòng)的、透明的,既保證了文件的安全,也不影響用戶正常的讀寫(xiě)文件習(xí)慣。當(dāng)敏感信息文件以某種手段被獲取時(shí),會(huì)因?yàn)槊撾x了透明加密文件系統(tǒng)的環(huán)境,而保證了數(shù)據(jù)的不可讀性。
Linux目前已有的透明加密文件系統(tǒng)主要分為三種:用戶態(tài)透明加密文件系統(tǒng)[2~3]、基于攔截系統(tǒng)調(diào)用的加密文件系統(tǒng)[4~5]和基于過(guò)濾頁(yè)緩沖(page cache)[6~7]的透明加密文件系統(tǒng)。用戶態(tài)透明加密文件系統(tǒng)由于要完成內(nèi)核態(tài)和用戶態(tài)的頻繁切換,性能損耗較大;攔截系統(tǒng)調(diào)用技術(shù)需要對(duì)用戶態(tài)復(fù)雜的參數(shù)進(jìn)行驗(yàn)證,不利于程序的健壯性,另外由于沒(méi)有采用系統(tǒng)級(jí)的緩存優(yōu)化,系統(tǒng)利用率低。而目前基于過(guò)濾頁(yè)緩沖的透明加密文件系統(tǒng),均采用單緩沖的方式,即只有一份頁(yè)緩沖,這在支持授信和非授信進(jìn)程訪問(wèn)時(shí),就需要頻繁的在明文和密文數(shù)據(jù)之間進(jìn)行切換,降低了系統(tǒng)的緩沖性能。
本文在總結(jié)已有方案的基礎(chǔ)上,提出一種新的透明加密機(jī)制,即基于雙緩沖的透明加密,為授信進(jìn)程提供明文緩沖區(qū),為非授信進(jìn)程提供密文緩沖區(qū),減少對(duì)同一塊緩沖頻繁加解密的次數(shù),同時(shí)這些操作位于內(nèi)核態(tài),有效的提高了透明加解密的性能。
虛擬文件系統(tǒng)[8](Virtual File System,VFS)作為內(nèi)核的子系統(tǒng),為用戶態(tài)程序提供統(tǒng)一操作文件的系統(tǒng)調(diào)用,當(dāng)VFS接受到用戶態(tài)程序的系統(tǒng)調(diào)用時(shí),經(jīng)過(guò)一定的處理,便將調(diào)用傳遞給下面的具體文件系統(tǒng)。
堆棧式文件系統(tǒng)[9]是位于VFS和具體文件系統(tǒng)之間的一層文件系統(tǒng)。它通過(guò)把要實(shí)現(xiàn)的文件系統(tǒng)功能加載到原有文件系統(tǒng)之上以實(shí)現(xiàn)“遞增”式開(kāi)發(fā)。即在堆棧式文件系統(tǒng)中實(shí)現(xiàn)新的功能需求,而不需要對(duì)底層文件系統(tǒng)做任何代碼級(jí)的修改。于是,開(kāi)發(fā)測(cè)試工作的焦點(diǎn)就集中在堆棧式文件系統(tǒng)上,而無(wú)需關(guān)心原有的底層文件系統(tǒng)。同時(shí),堆棧式文件系統(tǒng)以內(nèi)核模塊的形式運(yùn)行在內(nèi)核態(tài),省去了內(nèi)核態(tài)和用戶態(tài)頻繁切換的時(shí)間開(kāi)銷,因此堆棧式文件系統(tǒng)擴(kuò)展的系統(tǒng)功能具有性能損失小,開(kāi)發(fā)代價(jià)低等優(yōu)點(diǎn)。堆棧式文件系統(tǒng)的架構(gòu)模型如圖1所示。
圖1 堆棧式文件系統(tǒng)模型
在Linux系統(tǒng)中,只有在打開(kāi)(open)文件后,才能通過(guò)系統(tǒng)調(diào)用read和write對(duì)文件進(jìn)行讀寫(xiě)操作,read和write系統(tǒng)調(diào)用經(jīng)過(guò)VFS映射到具體文件系統(tǒng)(如:EXT4),具體文件系統(tǒng)進(jìn)而在頁(yè)緩沖(page cache)中查找或者寫(xiě)入文件內(nèi)容。頁(yè)緩沖是Linux內(nèi)核為了提升I/O性能,為最近剛“讀”或“寫(xiě)”過(guò)的文件內(nèi)容在內(nèi)核中保留一份副本,當(dāng)再次需要緩存中的內(nèi)容時(shí)就不必從磁盤(pán)讀入,而寫(xiě)入時(shí),則是先寫(xiě)入到頁(yè)緩沖中,空閑時(shí)候再?gòu)木彌_寫(xiě)入磁盤(pán)。
在Linux中,通過(guò)address_space結(jié)構(gòu)體描述一個(gè)文件的頁(yè)緩沖,在該結(jié)構(gòu)體中,通過(guò)address_space_operation來(lái)維護(hù)頁(yè)緩沖與具體文件系統(tǒng)設(shè)備層之間的關(guān)系與操作,例如具體文件系統(tǒng)ext4,該數(shù)據(jù)結(jié)構(gòu)為:
該結(jié)構(gòu)體為操作具體文件系統(tǒng)的塊設(shè)備提供了統(tǒng)一的接口,readpage和writepage即實(shí)現(xiàn)的是頁(yè)緩沖的讀取和寫(xiě)入。每個(gè)特定的文件系統(tǒng)都需要實(shí)現(xiàn)address_space_operations結(jié)構(gòu)體中的函數(shù),這為在頁(yè)緩沖上進(jìn)行數(shù)據(jù)的加解密提供了有利的條件。
本文提出的基于雙緩沖的透明加密文件系統(tǒng)主要由一個(gè)堆棧式文件系統(tǒng)組成,其在Linux內(nèi)核中的位置如圖2所示。
圖2 系統(tǒng)架構(gòu)圖
該架構(gòu)設(shè)計(jì)主要分為四個(gè)部分,用戶態(tài)的控制臺(tái)用于配置授信和非授信進(jìn)程;訪問(wèn)控制管理層結(jié)合配置策略,決定進(jìn)程應(yīng)該訪問(wèn)明文緩沖還是密文緩沖;密鑰管理層負(fù)責(zé)密鑰的生成、存儲(chǔ)和管理;page cache層維護(hù)著每個(gè)文件的密文緩沖和明文緩沖。
配置策略層:在用戶態(tài),使用QT為用戶呈現(xiàn)一個(gè)易操作的配置界面,用來(lái)配置授信和非授信進(jìn)程。該部分使用netlink與內(nèi)核中的訪問(wèn)控制管理層進(jìn)行通信。
訪問(wèn)控制管理層:在該層將配置策略層傳遞下來(lái)的策略信息用鏈表組織起來(lái),并且實(shí)現(xiàn)了VFS定義的通用接口(open,read,write等),從而將用戶態(tài)傳遞下來(lái)的對(duì)文件的操作和參數(shù)攔截下來(lái)。利用內(nèi)核態(tài)描述進(jìn)程和文件的結(jié)構(gòu)體,獲取當(dāng)前正在操作的文件或者進(jìn)程,和鏈表中的數(shù)據(jù)進(jìn)行比對(duì),來(lái)決定需要明文或者密文。
雙緩沖層:在內(nèi)核中使用名為address_space的結(jié)構(gòu)體表示頁(yè)緩沖,并使用基數(shù)樹(shù)(radix Tree)進(jìn)行組織。在該部分用兩個(gè)address_space結(jié)構(gòu)體,分別表示明文緩沖和密文緩沖,以供授信進(jìn)程和非授信進(jìn)程讀取。另外,當(dāng)發(fā)生寫(xiě)操作時(shí),需要考慮數(shù)據(jù)一致性的問(wèn)題,因?yàn)樵趯?xiě)文件的時(shí)候,只是向密文緩沖區(qū)中寫(xiě)數(shù)據(jù),必然導(dǎo)致兩個(gè)緩沖區(qū)的內(nèi)容有差異,為了解決數(shù)據(jù)同步的問(wèn)題,在發(fā)生寫(xiě)操作時(shí),需要去更新另一個(gè)緩沖區(qū)中基數(shù)樹(shù)上對(duì)應(yīng)的內(nèi)容。
密鑰管理:在本文中使用128位密鑰的AES(Advanced Encryption Standard)算法和 FEK(File Encryption Key)、UEK(User Encryption Key)兩種密鑰[10]。加密文件內(nèi)容使用的密鑰被稱為FEK,為了使得某個(gè)加密文件的FEK被泄露后,其他文件仍然安全,每個(gè)文件使用不同的FEK,即FEK隨機(jī)產(chǎn)生,并且將加密過(guò)后的FEK寫(xiě)在每個(gè)文件末尾的128個(gè)字節(jié),作為文件的元數(shù)據(jù)。另外使用公開(kāi)密鑰算法加密FEK,這樣就需要一對(duì)密鑰,統(tǒng)稱為UEK,在加密文件系統(tǒng)中,UEK的私鑰用來(lái)解密加密過(guò)的FEK,這是加密文件系統(tǒng)的重要信息,需要被安全的存放,在本文中使用對(duì)稱加密算法AES對(duì)UEK進(jìn)行加密,并將加密的UEK存放在用戶主目錄下使用ACL禁止別的用戶訪問(wèn)。
Linux為了支持各種不同的文件系統(tǒng),并且要給用戶提供一個(gè)統(tǒng)一的文件系統(tǒng)界面,抽象了一個(gè)文件系統(tǒng)通用層,即虛擬文件系統(tǒng)(VFS)。VFS主要由一組抽象的,標(biāo)準(zhǔn)的文件操作構(gòu)成,并且為用戶提供系統(tǒng)調(diào)用,如read(),write()等。
為了實(shí)現(xiàn)雙緩沖透明加密功能,首先需要對(duì)VFS中定義的open(),read(),write()函數(shù)進(jìn)行重定向,在本文中稱之為double_cache_open(),double_cache_file_read()和 double_cache_file_write()函數(shù)。在打開(kāi)文件時(shí),首先需要去文件末尾獲取元數(shù)據(jù),如果獲取到了則說(shuō)明該文件為加密過(guò)的文件,導(dǎo)入用戶UEK私鑰,解密并保存FEK,為后面解密密文數(shù)據(jù)做好準(zhǔn)備;如果沒(méi)有獲取到元數(shù)據(jù),則該文件為明文信息,在讀寫(xiě)時(shí)依據(jù)策略選擇加密或者不加密。
讀流程如圖4所示,T表示查找成功,F(xiàn)表示查找失敗,Y表示是,N表示否。
圖3 讀操作流程圖
圖3所示的讀文件的執(zhí)行流程如下:
通過(guò)訪問(wèn)控制判定需要獲取文件的明文或者密文信息。
1)如果需要獲取明文數(shù)據(jù),則在明文的頁(yè)緩沖中查找。
(1)查找成功,則返回明文信息給用戶態(tài)。
(2)查找失敗,則在密文緩沖中查找對(duì)應(yīng)的密文數(shù)據(jù),找到后解密返回給用戶態(tài),并將該明文信息緩存于明文緩沖;如果沒(méi)有找到,則從塊設(shè)備獲取對(duì)應(yīng)的密文數(shù)據(jù),解密返回給用戶態(tài)并保存于明文緩沖。
2)如果需要查找密文數(shù)據(jù),則在密文緩沖中查找數(shù)據(jù)。
(1)查找成功,返回密文信息給用戶態(tài)。
(2)查找失敗,從塊設(shè)備中獲取所需頁(yè),然后依據(jù)元數(shù)據(jù)判斷該頁(yè)是明文還是密文,如果是明文,需要先加密再返回給用戶態(tài),如果是密文直接返回給用戶態(tài)。
寫(xiě)流程如圖4所示。
圖4 寫(xiě)操作流程圖
圖4所示的寫(xiě)文件的執(zhí)行流程如下:
1)判斷明文緩沖是否存在。
(1)存在,寫(xiě)入明文緩沖。
(2)不存在,新建明文緩沖后寫(xiě)入。
2)判斷密文緩沖是否存在。
(1)存在,生成FEK對(duì)要寫(xiě)入的數(shù)據(jù)進(jìn)行加密。
(2)不存在密文緩沖,新建密文緩沖,生產(chǎn)FEK對(duì)要寫(xiě)入的數(shù)據(jù)進(jìn)行加密。
對(duì)塊設(shè)備的讀取和寫(xiě)入,內(nèi)核提供了統(tǒng)一的接口,即struct address_space_operations中定義的鉤子函數(shù),所以需要對(duì)該結(jié)構(gòu)體中的函數(shù)進(jìn)行重定向,在編碼時(shí),做了以下定義:structaddress_space_operations{
在readpage和readpages函數(shù)中,當(dāng)需要明文信息時(shí),需要進(jìn)行解密操作;在使用prepare_writepage和commit_write進(jìn)行寫(xiě)操作時(shí),進(jìn)行加密操作,在磁盤(pán)上統(tǒng)一存放密文信息。
本文采用的軟硬件測(cè)試環(huán)境如表1所示。
表1 性能測(cè)試的軟硬件測(cè)試環(huán)境
為了評(píng)估雙緩沖透明加密文件系統(tǒng)的整體性能,筆者分別將基于單緩沖的透明加密文件系統(tǒng)ecryptfs[11]和基于雙緩沖的透明加密文件系統(tǒng)安裝(mount)在本地磁盤(pán)(EXT4)上,并且設(shè)置iozone測(cè)試工具為非授信進(jìn)程,創(chuàng)建一個(gè)守護(hù)進(jìn)程作為授信進(jìn)程,并發(fā)對(duì)文件進(jìn)行讀寫(xiě)操作,分別測(cè)試以下幾種情況:
1)write:測(cè)試寫(xiě)入新文件的功能。
2)re-write:測(cè)試寫(xiě)入已經(jīng)存在文件的性能。
3)read:測(cè)試讀取新文件的性能。
4)re-read:測(cè)試讀取最近剛讀過(guò)的文件性能。
對(duì)以上幾種測(cè)試情況,分別打開(kāi)iozone測(cè)試工具的write,re-write,read,re-read測(cè)試開(kāi)關(guān),測(cè)試文件大小選擇4M,16M,256M,4G。
安裝ecryptfs文件系統(tǒng)后的測(cè)試結(jié)果如圖表2所示。
表2 ecryptfs測(cè)試結(jié)果(單位:s)
安裝雙緩沖透明加密文件系統(tǒng)后的測(cè)試結(jié)果如圖表3所示。
表3 雙緩沖加密文件系統(tǒng)測(cè)試結(jié)果(單位:s)
由表2和表3可以得出,re-read和re-write相比于read和write對(duì)文件的操作時(shí)間明顯減少,這主要是由于內(nèi)核中的頁(yè)緩沖對(duì)文件做了緩存,避免了從磁盤(pán)讀取文件。基于雙緩沖的透明加密文件系統(tǒng)在re-read時(shí),由于在內(nèi)存中緩存了文件對(duì)應(yīng)的明文和密文信息,省去了頻繁加解密的操作,所消耗的時(shí)間較ecryptfs減少了20%~33%。在寫(xiě)操作時(shí),雙緩沖透明加密文件系統(tǒng)較ecryptfs文件系統(tǒng)所消耗的時(shí)間增加了10%左右,這是由于雙緩沖透明加密文件系統(tǒng)在寫(xiě)操作時(shí),需要同步兩個(gè)緩沖帶來(lái)的時(shí)間消耗。
綜合上面的測(cè)試結(jié)果可以得出,與單緩沖的透明加密文件系統(tǒng)相比,基于雙緩沖的透明加密文件系統(tǒng),在寫(xiě)操作上性能相差不大,在讀操作上性能得到了明顯的提升。在保證文件安全性的前提下,提升了透明加密文件系統(tǒng)的整體性能。
本文在現(xiàn)有透明加密文件系統(tǒng)的基礎(chǔ)上,提出了一種基于雙緩沖的透明加密機(jī)制,減少了現(xiàn)有透明加密文件系統(tǒng)中授信和非授信進(jìn)程對(duì)同一塊頁(yè)緩沖頻繁加解密的次數(shù),從而提升了透明加密文件系統(tǒng)的整體性能,同時(shí)該文件系統(tǒng)以內(nèi)核模塊的形式存在,可移植性強(qiáng)。最后,通過(guò)實(shí)驗(yàn)證明了其可用性和高效性。隨著信息安全技術(shù)的快速發(fā)展,如何在保證文件安全的前提下提高加密文件系統(tǒng)的性能,這為L(zhǎng)inux操作系統(tǒng)上的加密文件系統(tǒng)提出了更高的要求。