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