胡雯 李燕 趙海廷
引言:本文以Linux系統(tǒng)為平臺(tái),深入研究了文件系統(tǒng)監(jiān)控技術(shù)的方法,并通過inotify程序?qū)崿F(xiàn)其對(duì)所監(jiān)控文件的報(bào)警功能,為文件系統(tǒng)的安全保護(hù)策略提供供參考依據(jù)。
一、引言
隨著計(jì)算機(jī)系統(tǒng)安全技術(shù)的發(fā)展,涉及企業(yè)商業(yè)機(jī)密以及決策信息的文件已成為安全監(jiān)控的新目標(biāo)。以往對(duì)文件系統(tǒng)采用的監(jiān)控技術(shù)大部分屬于“辦公自動(dòng)化方法”,將文件集中管理,對(duì)文件操作不便且不能有效監(jiān)控和防止文件的對(duì)外傳播。操作系統(tǒng)中具備的文件系統(tǒng)的功能較少,僅限于對(duì)文件的保護(hù)性檢測(cè),對(duì)文件的具體操作等記錄不詳,鑒于這種狀況,本文選擇具有較高安全性的Linux操作系統(tǒng)平臺(tái),使用inotify技術(shù)對(duì)文件系統(tǒng)的安全監(jiān)控進(jìn)行研究。
二、文件監(jiān)控系統(tǒng)
文件監(jiān)控系統(tǒng)一般主要由管理終端(Keeper)和監(jiān)控終端(Monitor)組成。Keeper端和Monitor端通過網(wǎng)絡(luò)相連,盡量使用專用實(shí)現(xiàn)管理終端的功能。監(jiān)控系統(tǒng)為用戶提供對(duì)重要文件的安全保護(hù)。
文件監(jiān)控系統(tǒng)由兩個(gè)模塊組成,分別是監(jiān)控模塊,還原模塊。還原模塊嵌入到Keeper端,監(jiān)控模塊式嵌入到Monitor端。見下圖1。
圖1 監(jiān)控系統(tǒng)邏輯結(jié)構(gòu)
首先,管理者將要監(jiān)控的文件加入到Monitor端的監(jiān)控文件列表,進(jìn)行實(shí)時(shí)監(jiān)控時(shí),先將Monitor端的監(jiān)控文件一次性備份到Keeper端,讓Keeper端作為備份服務(wù)器;同時(shí)將監(jiān)控文件的路徑寫入到數(shù)據(jù)庫(kù)。之后,監(jiān)控模塊開始工作,當(dāng)檢測(cè)到文件被誤刪、篡改等非法操作時(shí),立即對(duì)Keeper端發(fā)送警告信息,管理者針對(duì)這非法操作實(shí)行禁止或者允許策略。當(dāng)選擇允許策略時(shí),監(jiān)控系統(tǒng)只做記錄,不還原被修改文件;當(dāng)選擇禁止策略時(shí),監(jiān)控系統(tǒng)根據(jù)數(shù)據(jù)庫(kù)自動(dòng)還原Monitor端被破壞的文件。
三、監(jiān)控模塊
監(jiān)控模塊的主要功能包括檢測(cè)、防修改、告警及自我保護(hù)[1]。
檢測(cè)功能對(duì)需要進(jìn)行監(jiān)控的文件及目錄進(jìn)行如增、刪、改、查等操作的檢測(cè),一旦發(fā)現(xiàn)就根據(jù)用戶策略的設(shè)置向管理者進(jìn)行告警處理。
防修改功能包對(duì)特定文檔或重要文件進(jìn)行設(shè)定,凡是檢測(cè)到非法操作的文件都會(huì)無條件的恢復(fù)此文檔內(nèi)容或文件數(shù)據(jù)。
告警功能根據(jù)用戶策略對(duì)事件進(jìn)行實(shí)時(shí)告警。事件包括針對(duì)文件的非法操作、監(jiān)控系統(tǒng)的功能啟用/禁用等。
監(jiān)控系統(tǒng)自我保護(hù)功能是避免非法用戶關(guān)閉系統(tǒng)。如關(guān)閉監(jiān)控系統(tǒng)時(shí)輸入密碼等。
四、監(jiān)控技術(shù)
Linux系統(tǒng)的文件監(jiān)控技術(shù)主要有以下三種:
(1)替換shell。用perl之類的腳本語言寫一個(gè)shell,替換bash,cshell,設(shè)置成用戶的默認(rèn)shell,對(duì)刪除文件、修改文件等操作做記錄,追查方便。優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,風(fēng)險(xiǎn)低;缺點(diǎn)是容易繞過,沒法記錄二進(jìn)制程序?qū)ξ募牟僮鳌?/p>
(2)寫驅(qū)動(dòng)程序,使用hook系統(tǒng)調(diào)用監(jiān)控文件操作。優(yōu)點(diǎn)是底層操作,不易繞過;缺點(diǎn)是風(fēng)險(xiǎn)高,通用性差,開發(fā)難度大。
(3)使用inotify監(jiān)控文件。inotify是基于事件的監(jiān)控,無需定時(shí)輪詢文件狀態(tài),也無需做內(nèi)核模塊hook系統(tǒng)調(diào)用,簡(jiǎn)單可靠?,F(xiàn)階段大部分Linux系統(tǒng)均采用該方法監(jiān)控文件。
Inotify的監(jiān)控機(jī)制是[2]:Inotify
不打開被監(jiān)視的目標(biāo)文件的描述符,如果目標(biāo)在可移動(dòng)介質(zhì)上,那么在 umount 該介質(zhì)上的文件系統(tǒng)后,目標(biāo)對(duì)應(yīng)的 watch 將被自動(dòng)刪除,并產(chǎn)生一個(gè) umount 事件。
既可以監(jiān)視文件,也可以監(jiān)視目錄。
使用系統(tǒng)調(diào)用來通知文件系統(tǒng)事件。
使用文件描述符作為接口,可以使用通常的文件I/O 操作select和poll來監(jiān)視文件系統(tǒng)的變化。
Inotify可監(jiān)控文件的訪問、讀/寫、屬性修改、刪除等,也包括對(duì)目錄的操作,還可跟蹤活動(dòng)的源頭和目標(biāo)等細(xì)節(jié)。
五、inotify監(jiān)控實(shí)例
使用inotify編寫監(jiān)控程序[3],并在Monitor端執(zhí)行。具體過程如下:
創(chuàng)建一個(gè)文件描述符,附加一個(gè)或多個(gè)監(jiān)視器,然后使用 read() 方法從描述符獲取事件信息,事件發(fā)生前先阻塞read()。
具體步驟如下:
int fd = inotify_init(); 初始化inotify實(shí)例。
int wd = inotify_add_watch(fd, path, mask); 添加監(jiān)視對(duì)象,即事件的位標(biāo)記集合。
size_t len = read(fd, buf, BUF_LEN); 讀取事件數(shù)據(jù),buf是一個(gè)指向inotify_event結(jié)構(gòu)數(shù)組的指針。
int ret = inotify_rm_watch(fd, wd); 通過此函數(shù)來刪除已存在的監(jiān)視對(duì)象。
監(jiān)控程序開始執(zhí)行后,進(jìn)行測(cè)試:
用某用戶身份登錄;在被保護(hù)文件范圍內(nèi)進(jìn)行創(chuàng)建文件操作。操作完成后,在執(zhí)行監(jiān)控程序的終端立即顯示如圖2所示告警信息。證明監(jiān)控功能實(shí)現(xiàn)。
圖2 管理端獲得的告警信息
本監(jiān)控實(shí)驗(yàn)程序,只實(shí)現(xiàn)了對(duì)所監(jiān)控文件的創(chuàng)建操作。
小結(jié)
通過上述實(shí)踐證明,使用inotify技術(shù)對(duì)文件系統(tǒng)進(jìn)行監(jiān)控是可行的,程序過程并不復(fù)雜。inotify技術(shù)對(duì)文件系統(tǒng)的監(jiān)控功能較全面,使用方法簡(jiǎn)單,該技術(shù)值得推廣。本文未實(shí)現(xiàn)還原模塊的功能,由于其涉及到文件范圍的識(shí)別,文件傳輸?shù)膶?shí)時(shí)性及并發(fā)性等問題,有待今后深入研究其實(shí)現(xiàn)方法。
參考文獻(xiàn)
[1] (美)Aron Hsiao . Linux系統(tǒng)安全基礎(chǔ)[M].人民郵電出版社. 2002.2
[2] 燚楊. Inotify -- Linux 2.6 內(nèi)核中的文件系統(tǒng)變化通知機(jī)制[EB|OL].
http://www.ibm.com/developerworks/cn/linux/l-inotifynew/
[3] Michael Prokop. Inotify: 高效、實(shí)時(shí)的Linux文件系統(tǒng)事件監(jiān)控框架[EB|OL]. http://www.infoq.com/cn/articles/inotify-linux-file-system-event-monitoring/
(作者單位:武昌理工學(xué)院)