完整性檢查是HIDS的重要組成部分之一,linux下作完整性檢查的思路有3個php
一、哈希對比css
二、簽名校驗html
三、inotifynode
方法有2個:jquery
A、按期檢測,例如經過cron或程序內置計時器linux
B、實時檢測,inotifygit
一、2通常和A,3通常和B。用inotify作完整性檢查的程序如今貌似還沒現成比較好用的,誰推薦一個。github
內核2.6.13以上,RHEL5默認支持inotify,RHEL4不確認這個功能是否有backport,查看英文原文:Inotify: Efficient, Real-Time Linux File System Event Monitoring。web
做者 Michael Prokop 譯者 張永利 發佈於 2010年9月22日 上午12時0分正則表達式
在平常工做中,人們每每須要知道在某些文件(夾)上都有那些變化,好比:
一般使用文件輪詢的通知機制,可是這種機制只適用於常常改變的文件(由於它能夠確保每過x秒就能夠獲得i/o),其餘狀況下都很是低效,而且有時候會丟失某些類型的變化,例如文件的修改時間沒有改變。像Tripwire這樣的數據完整性系統,它們基於時間調度來跟蹤文件變化,可是若是想實時監控文件的變化的話,那麼時間調度就一籌莫展了。Inotify就這樣應運而生了。本文將簡要介紹inotify,告訴咱們如何監控文件夾,如何一有變化就報告相關消息事件,並介紹了一些相關工具, 咱們能夠把它們添加到本身的工具箱中。
Inotify是一種文件變化通知機制,Linux內核從2.6.13開始引入。在BSD和Mac OS系統中比較有名的是kqueue,它能夠高效地實時跟蹤Linux文件系統的變化。近些年來,以fsnotify做爲後端,幾乎全部的主流Linux發行版都支持Inotify機制。如何知道你的Linux內核是否支持Inotify機制呢?很簡單,執行下面這條命令:
若是輸出(‘CONFIG_INOTIFY_USER=y’),那麼你能夠立刻享受Inotify之旅了。
好的開始是成功的一半,對於瞭解Inotify機制來講,讓咱們從使用inotifywait程序開始,它包含在inotify-tools工具包中。假如咱們打算監控/srv/test文件夾上的操做,只需執行:
上述任務運行的同時,咱們在另外一個shell裏依次執行如下操做:建立文件夾,而後在新文件夾下建立文件,接着刪除新建立的文件:
在運行inotifywait的shell中將會打印如下信息:
顯而易見,只要有變化咱們就會收到相關的通知。若是想了解關於Inotify提供的事件(如modify, atrrib等)的詳細信息,請參考inotifywatch的manpage。實際使用時,若是並不想監控某個大文件夾,那麼就可使用inotifywait的exclude選項。例如:咱們要忽略文件夾/srv/test/large,那麼就能夠這樣來創建監控:
上面的例子中,在exclude選項的匹配串中咱們使用了正則表達式,由於咱們不想將名稱中含有large或ignore的文件也排除掉。咱們能夠測試一下:
這裏inotifywait應該只會報告’action.txt’和’large-name-but-action.txt’兩個文件的變化,而忽略子文件夾’large’和’ignore’下的文件,結果也確實如此;
另外,經過使用-t選項咱們還能夠定義inotifywait的監控時間,既可讓它執行一段時間,也可讓它一直運行。util-linux-ng的logger命令也能夠實現此功能,不過得先把相關的消息事件發送到syslog,而後從syslog服務器再分析整合。
Inotify-tools中還有一個工具叫inotifywatch,它會先監聽文件系統的消息事件,而後統計每一個被監聽文件或文件夾的消息事件,以後輸出統計信息。好比咱們想知道某個文件夾上有那些操做:
很顯然,這裏咱們監控的是~/InfoQ文件夾,而且能夠看到/home/mika/InfoQ/inotify上發生了兩個事件。方法雖簡單,但卻頗有效。
使用Inotify時,要特別注意內核中關於它的兩個配置。首先/proc/sys/fs/inotify/max_user_instances 規定了每一個用戶所能建立的Inotify實例的上限;其次/proc/sys/fs/inotify/max_user_watches規定了每一個Inotify實例最多能關聯幾個監控(watch)。你能夠很容易地試驗在運行過程當中達到上限,如:
若是要改變這些配置,只要向相應的文件寫入新值便可,以下所示:
近一段時間出現了不少基於Inotify的超炫的工具,如incron,它是一個相似於cron的守護進程(daemon),傳統的cron守護進程都是在規定的某個時間段內執行,而incron因爲使用了Inotify,能夠由事件觸發執行。同時incron的安裝簡單而直觀,好比在debian上,首先在/etc/incron.allow中添加使用incron的用戶(debian默認不容許用戶使用incron,由於若是incron使用不慎的話,例如造成死循環,則會致使系統宕機):
而後調用」incrontab -e「, 在彈出的編輯器中插入咱們本身的規則,例以下面的這條簡單的規則,文件一變化incron就會發郵件通知咱們:
從如今開始,一旦/src/test文件夾中的文件被修改,就會發送一封郵件。可是注意不要讓incron監控整個子目錄樹,由於Inotify只關注inodes,而不在意是文件仍是文件夾,因此基於Inotify的軟件都須要本身來處理/預防遞歸問題。關於incontab詳細使用,請參考incrontab的manpage。
若是你還要處理incoming文件夾,那麼你可能須要inoticoming。當有文件進入incoming文件夾時Inoticoming就會執行某些動做,從而能夠用inoticoming來管理debian的軟件倉庫(例如軟件倉庫中一旦有上傳源碼包或是新添加的二進制包就馬上自動進行編譯),另外,還能夠用它來監控系統是否有新上傳文件,若是有就發送通知。相似的工具還有(它們都各有專長):inosync(基於消息通知機制的文件夾同步服務),iwatch(基於Inotify的程序,對文件系統進行實時監控),以及lsyncd(一個守護進程(daemon),使用rsync同步本地文件夾)。
Inotify甚至對傳統的Unix工具也進行了改進,例如tail。使用inotail,同時加上-f選項,就能夠取代每秒輪詢文件的作法。此外,GNU 的coreutils從版本7.5開始也支持Inotify了,咱們能夠運行下面的命令來確認:
從如今開始,經過輪詢來確實文件是否須要從新讀取的方法應該做爲古董了。
Inotify機制並不侷限於工具,在腳本語言中也徹底能夠享受Inotify的樂趣,如Python中可使用pyinotify和inotifyx,Perl中有Filesys-Notify-Simple和Linux-Inotify2,Inotify的Ruby版有ruby-inotifyrb-inoty和fssm。
綜上所述,Inotify爲Linux提供了一套高效監控和跟蹤文件變化的機制,它能夠實時地處理、調試以及監控文件變化,而輪詢是一種延遲機制。對於系統管理員,關於實現事件驅動的服務如系統備份,構建服務以及基於文件操做的程序調試等,Inotify無疑提供了強大的支持。
包子猜您可能還喜歡下列文章: