linux 文件系統的監控

完整性檢查是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 Monitoringweb

 

做者 Michael Prokop 譯者 張永利 發佈於 2010年9月22日 上午12時0分正則表達式

概要 – 爲何須要監控文件系統?

在平常工做中,人們每每須要知道在某些文件(夾)上都有那些變化,好比:

  • 通知配置文件的改變
  • 跟蹤某些關鍵的系統文件的變化
  • 監控某個分區磁盤的總體使用狀況
  • 系統崩潰時進行自動清理
  • 自動觸發備份進程
  • 向服務器上傳文件結束時發出通知

一般使用文件輪詢的通知機制,可是這種機制只適用於常常改變的文件(由於它能夠確保每過x秒就能夠獲得i/o),其餘狀況下都很是低效,而且有時候會丟失某些類型的變化,例如文件的修改時間沒有改變。像Tripwire這樣的數據完整性系統,它們基於時間調度來跟蹤文件變化,可是若是想實時監控文件的變化的話,那麼時間調度就一籌莫展了。Inotify就這樣應運而生了。本文將簡要介紹inotify,告訴咱們如何監控文件夾,如何一有變化就報告相關消息事件,並介紹了一些相關工具, 咱們能夠把它們添加到本身的工具箱中。

Inotify究竟是什麼?

Inotify是一種文件變化通知機制,Linux內核從2.6.13開始引入。在BSD和Mac OS系統中比較有名的是kqueue,它能夠高效地實時跟蹤Linux文件系統的變化。近些年來,以fsnotify做爲後端,幾乎全部的主流Linux發行版都支持Inotify機制。如何知道你的Linux內核是否支持Inotify機制呢?很簡單,執行下面這條命令:

1
2
% grep INOTIFY_USER / boot / config - $ ( uname - r )
CONFIG_INOTIFY_USER = y

若是輸出(‘CONFIG_INOTIFY_USER=y’),那麼你能夠立刻享受Inotify之旅了。

簡單的文件變化通知樣例:

好的開始是成功的一半,對於瞭解Inotify機制來講,讓咱們從使用inotifywait程序開始,它包含在inotify-tools工具包中。假如咱們打算監控/srv/test文件夾上的操做,只需執行:

 
1
2
3
% inotifywait - rme modify , attrib , move , close_write , create , delete , delete_self / srv / test
Setting up watches . Beware : since - r was given , this may take a while !
Watches established .

上述任務運行的同時,咱們在另外一個shell裏依次執行如下操做:建立文件夾,而後在新文件夾下建立文件,接着刪除新建立的文件:

 
1
2
3
% mkdir / srv / test / infoq
% echo TODO &gt ; / srv / test / infoq / article . txt
% rm / srv / test / infoq / article . txt

在運行inotifywait的shell中將會打印如下信息:

 
1
2
3
4
5
/ srv / test / CREATE , ISDIR infoq
/ srv / test / infoq / CREATE article . txt
/ srv / test / infoq / MODIFY article . txt
/ srv / test / infoq / CLOSE_WRITE , CLOSE article . txt
/ srv / test / infoq / DELETE article . txt

顯而易見,只要有變化咱們就會收到相關的通知。若是想了解關於Inotify提供的事件(如modify, atrrib等)的詳細信息,請參考inotifywatch的manpage。實際使用時,若是並不想監控某個大文件夾,那麼就可使用inotifywait的exclude選項。例如:咱們要忽略文件夾/srv/test/large,那麼就能夠這樣來創建監控:

 
1
2
3
% inotifywait -- exclude '^/srv/test/(large|ignore)/' - rme modify , attrib , move , close_write , create , delete , delete_self / srv / test
Setting up watches . Beware : since - r was given , this may take a while !
Watches established .

上面的例子中,在exclude選項的匹配串中咱們使用了正則表達式,由於咱們不想將名稱中含有large或ignore的文件也排除掉。咱們能夠測試一下:

 
1
2
3
4
% echo test &gt ; / srv / test / action . txt
% echo test &gt ; / srv / test / large / no_action . txt
% echo test &gt ; / srv / test / ignore / no_action . txt
% echo test & gt ; / srv / test / large - name - but - action . txt

這裏inotifywait應該只會報告’action.txt’和’large-name-but-action.txt’兩個文件的變化,而忽略子文件夾’large’和’ignore’下的文件,結果也確實如此;

 
1
2
3
4
5
6
/ srv / test / CREATE action . txt
/ srv / test / MODIFY action . txt
/ srv / test / CLOSE_WRITE , CLOSE action . txt
/ srv / test / CREATE large - name - but - action . txt
/ srv / test / MODIFY large - name - but - action . txt
/ srv / test / CLOSE_WRITE , CLOSE large - name - but - action . txt

另外,經過使用-t選項咱們還能夠定義inotifywait的監控時間,既可讓它執行一段時間,也可讓它一直運行。util-linux-ng的logger命令也能夠實現此功能,不過得先把相關的消息事件發送到syslog,而後從syslog服務器再分析整合。

Inotifywatch – 使用inotify來統計文件系統訪問信息

Inotify-tools中還有一個工具叫inotifywatch,它會先監聽文件系統的消息事件,而後統計每一個被監聽文件或文件夾的消息事件,以後輸出統計信息。好比咱們想知道某個文件夾上有那些操做:

 
1
2
3
4
5
6
7
8
9
% inotifywatch - v - e access - e modify - t 120 - r ~ / InfoQ
Establishing watches . . .
Setting up watch ( es ) on / home / mika / InfoQ
OK , / home / mika / InfoQ is now being watched .
Total of 58 watches .
Finished establishing watches , now collecting statistics .
Will listen for events for 120 seconds .
total modify filename
2 2 / home / mika / InfoQ / inotify /

很顯然,這裏咱們監控的是~/InfoQ文件夾,而且能夠看到/home/mika/InfoQ/inotify上發生了兩個事件。方法雖簡單,但卻頗有效。

Inotify的配置選項

使用Inotify時,要特別注意內核中關於它的兩個配置。首先/proc/sys/fs/inotify/max_user_instances 規定了每一個用戶所能建立的Inotify實例的上限;其次/proc/sys/fs/inotify/max_user_watches規定了每一個Inotify實例最多能關聯幾個監控(watch)。你能夠很容易地試驗在運行過程當中達到上限,如:

 
1
2
3
4
% inotifywait - r /
Setting up watches . Beware : since - r was given , this may take a while !
Failed to watch / ; upper limit on inotify watches reached !
Please increase the amount of inotify watches allowed per user via ` / proc / sys / fs / inotify / max_user_watches' .

若是要改變這些配置,只要向相應的文件寫入新值便可,以下所示:

 
1
2
3
4
5
# cat /proc/sys/fs/inotify/max_user_watches
8192
# echo 16000 > /proc/sys/fs/inotify/max_user_watches
# cat /proc/sys/fs/inotify/max_user_watches
16000

 

使用Inotify的一些工具

近一段時間出現了不少基於Inotify的超炫的工具,如incron,它是一個相似於cron的守護進程(daemon),傳統的cron守護進程都是在規定的某個時間段內執行,而incron因爲使用了Inotify,能夠由事件觸發執行。同時incron的安裝簡單而直觀,好比在debian上,首先在/etc/incron.allow中添加使用incron的用戶(debian默認不容許用戶使用incron,由於若是incron使用不慎的話,例如造成死循環,則會致使系統宕機): 

 
1
# echo username > /etc/incron.allow

而後調用」incrontab -e「, 在彈出的編輯器中插入咱們本身的規則,例以下面的這條簡單的規則,文件一變化incron就會發郵件通知咱們:

 
1
/ srv / test / IN_CLOSE_WRITE mail - s "$@/$#\n" root

從如今開始,一旦/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了,咱們能夠運行下面的命令來確認:

 
1
2
3
4
# strace -e inotify_init,inotify_add_watch tail -f ~log/syslog
[ . . . ]
inotify_init ( ) = 4
inotify_add_watch ( 4 , "/var/log/syslog" , IN_MODIFY | IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF ) = 1

從如今開始,經過輪詢來確實文件是否須要從新讀取的方法應該做爲古董了。

在腳本中使用Inotify

Inotify機制並不侷限於工具,在腳本語言中也徹底能夠享受Inotify的樂趣,如Python中可使用pyinotifyinotifyx,Perl中有Filesys-Notify-SimpleLinux-Inotify2,Inotify的Ruby版有ruby-inotifyrb-inotyfssm

總結

綜上所述,Inotify爲Linux提供了一套高效監控和跟蹤文件變化的機制,它能夠實時地處理、調試以及監控文件變化,而輪詢是一種延遲機制。對於系統管理員,關於實現事件驅動的服務如系統備份,構建服務以及基於文件操做的程序調試等,Inotify無疑提供了強大的支持。

包子猜您可能還喜歡下列文章:

  1. AdviceIOPerfomance
  2. 解決Out of socket memory
  3. adore-ng也能夠經過echo或者cat進行控制
  4. 一個提權技巧和兩個本地後門技巧 zz from xiaoyu
  5. chroot ssh
相關文章
相關標籤/搜索