即時監控 檔案系統 事件驅動

避免檔案系統遭無聲異動 監控變化提高警覺

inotify/fswatch聯手 檔案目錄異動一目瞭然

2020-06-23
若擁有即時監控檔案系統的機制,IT管理會放心許多,當檔案系統被異常變動時,便立即記錄相關資訊並發出通知。本文將示範如何透過Linux作業系統的inotify機制與fswatch軟體來即時監控檔案系統,將檔案系統異動情況記錄在檔案中,供管理者查閱。

 

身為系統管理者,最害怕的事情莫過於所掌管主機內的檔案系統被異常更動,如新增檔案、目錄或是更動檔案內容。經常在新聞上常看到的網頁置換、被植入後門程式等事件,在本質上就是檔案系統被異常更動所導致,因此若能有一個即時監控檔案系統的機制,一旦檔案系統發生變動,便會記錄相關資訊,甚至通知管理者,相信就能夠更有效地解決此類問題的發生。本文將以Linux作業系統為例(採用CentOS 8),利用Linux的inotify機制和fswatch軟體來即時監控檔案系統,一旦監控到檔案系統有異動,便記錄在檔案中,供管理者日後查閱。

什麼是inotify

在Linux系統核心(Kernel)2.6.13之後的作業系統版本,提供了一種可即時監控檔案系統變動(例如可即時監控檔案、目錄的新增或刪除等事件)的核心模組,名為「inotify」。

inotify是一種基於事件驅動的模組程式,當發生變動事件時便會觸發相關事件,可用來即時地監控檔案系統的變動,並將檔案系統的異動情況通知應用程式。

本文中所使用的fswatch就是利用inotify模組來監控檔案系統的變動,並接收inotify模組偵測到的異動事件,再將相關的變動情況寫入至檔案中,用來記錄曾經發生過的檔案或目錄的異動情形。

首先,執行「grep INOTIFY_USER /boot/config-$(uname -r)」指令,確認系統是否支援inotify。如果回應「CONFIG_INOTIFY_USER=y」,表示系統可支援inotify模組功能。

由於在Linux系統上有多種樣式的檔案,除了一般實體的檔案或目錄外,還有一些特殊的檔案,例如區塊(Block)設備檔案或字元(Character)設備檔案等裝置檔案,此類檔案通常位於「/proc」目錄下。對inotify模組而言,僅能監控系統的實體目錄及檔案,而無法監控如設備檔案類型的特殊檔案。

在了解inotify模組的基本用途後,接下來說明inotify相關的用法。

inotify模組以實例(Instances)來表示所要監控的作業,使用者可在同一個監控作業中同時設定監控多個實體的檔案或目錄。在成功設定實例之後,便會排入隊列(Queue)中並等待系統的執行。當所監控的實體檔案或目錄發生異動時,將產生相對應的事件。一般來說,常用的異動事件包括了以下幾種:

‧IN_ACCESS:此類事件發生在檔案或目錄被存取時。

‧IN_MODIFY:此類事件發生在檔案的內容被修改時。

‧IN_ATTRIB:此類事件發生在檔案或目錄的屬性(例如修改時間、存取權限、擁有者等屬性)被改變時,便會觸發此事件。

‧IN_OPEN:此類事件發生在檔案被開啟的時候。

‧IN_CLOSE_WRITE:此類事件發生在一個已開啟的檔案或目錄被關閉時。

‧IN_MOVED_FROM:當被移動的檔案或目錄是來自於被監控的目錄,便會觸發此事件。

‧IN_MOVED_TO:當被移動的檔案或目錄被放置到被監控的目錄,便觸發此事件。

‧IN_DELETE:此類事件發生在檔案或目錄被刪除時。

‧IN_CREATE:此類事件發生在檔案或目錄建立時。

inotify模組提供了動態調整inotify組態的機制,使用者可利用調整「/proc/sys/fs/inotify」目錄下的檔案方式來調整相關的組態。在該目錄內提供了max_queued_events、max_user_instances、max_user_watches三個設定檔案,如圖1所示。相關檔案說明,如下所述:

圖1  「/proc/sys/fs/inotify」目錄下的三個設定檔。

‧max_queued_events:設定個別的實例可允許放入隊列中的監控事件(Event)最大個數,即表示每個實例所監控的檔案或目錄,異動的次數在一段時間內不能超過此組態所設定的值,檔案預設值為16384。

‧max_user_instances:指定每一個使用者最大可建立的實例個數,檔案預設值為128。

‧max_user_watches:設定每個實例最大能監控的檔案及目錄的個數,檔案預設值為8192。

安裝使用fswatch

fswatch是一種即時監控系統目錄與檔案變動的軟體,提供了不同作業系統的版本,使用者可利用在不同的系統上進行檔案系統變動的監控。fswatch在不同的作業平台上使用不同的監控機制,例如在macOS平台使用File System Events API, FreeBSD平台使用kqueue機制,Windows平台利用ReadDirectoryChangesW函數來監控檔案系統,而在Linux系統中則採用inotify機制(本文所採用的環境)。

了解fswatch所使用的機制後,接下來安裝fswatch。

首先至fswatch官網(https://github.com/emcrisostomo/fswatch/)取得最新版本(本文使用的版本為1.14),下載解壓縮後,以下列步驟進行編譯及安裝:

configure make make install

在安裝成功之後,將會產生一個名為「fswatch」的主程式,使用語法為:

fswatch [選項] [檔案或目錄名稱]

fswatch的常用選項,如下所述:

-M:此選項用來顯示fswatch所使用的監控機制,例如使用「fswatch -M」便會顯示所使用的監控機制(即使用inotify機制),如圖2所示。

圖2  顯示所使用的監控機制。

-a [檔名]:此選項用來設定fswatch所要監控的檔案,例如執行「fswatch -a /etc/passwd」表示要監控passwd檔案,一旦該檔案發生異動,就會即時記錄異動情況。

-d [目錄名稱]:此選項用來設定fswatch所要監控的目錄名稱,當該目錄或該目錄下的檔案發生異動,就會即時記錄異動情況。

-r:此選項用來設定遞迴監控目錄下的檔案異動情況。

-x [監控目錄]:以事件狀態來監控目錄的異動狀態。fswatch定義如下的事件:

NoOp:表示所監控的目錄或檔案並無任何異動事件發生。

Created:表示所監控的目錄或檔案發生新增的情況。

Updated:代表所監控的目錄或檔案發生被更動的情況。

Removed:表示所監控的目錄或檔案發生被刪除的情況。

Renamed:表示所監控的目錄或檔案發生被更名的情況。

OwnerModified:表示所監控的目錄或檔案發生檔案或目錄的擁有者被異動的情況。

AttributeModified:表示所監控的目錄或檔案發生屬性已被改變的情況。

MovedFrom:表示被搬移的檔案或目錄是來自於被監控的目錄或檔案。

MovedTo:表示將檔案或目錄搬移至被監控的目錄或檔案。

IsDir:表示被監控的物件為目錄型式。

IsFile:表示被監控的物件為檔案型式。

-x event [事件]:可設定欲監控目錄或檔案的事件,例如「fswatch -x --event Created /tmp」,表示僅監控在「/tmp」目錄下新增檔案或目錄的事件。

-l [秒數]:設定當監測到異動事件後,顯示訊息的時間間隔,例如「fswatch -l 5 -x --event Created /tmp」表示每隔5秒才會顯示監測到新增事件的訊息。

-t:設定顯示訊息的內容之中,必須有時間資訊。

開始實作

在了解fswatch相關用法後,以監控「/tmp/fswatch」目錄新增事件為例,首先執行:

fswatch -x --event Created -- event IsDir --event IsFile /tmp/ fswatch

接著,先執行「touch /tmp/fswatch/a1」命令,在該目錄下新增a1檔案,然後使用「mkdir /tmp/fswatch/a1dir」來新增a1目錄。fswatch將回覆訊息,如圖3所示,表示偵測到新增事件。

圖3  偵測到新增事件。

如果需要知道在什麼時候發生相關事件,只要加上-t參數,所回覆的訊息便會加上時間的資訊,如圖4所示。

圖4  顯示事件發生的時間。

使用者可依本身的需求來設定欲監控的事件類型。最後,如果要將相關的記錄儲存在檔案內,以便日後查閱,則執行以下的命令:

fswatch -x --event Created --event IsDir --event IsFile / tmp/fswatch >>/tmp/fswatch.log

執行之後,就會將相關資訊寫入至「fswatch.log」檔案中。日後,管理者查看此檔案時,就能夠得知相關檔案變動的情況。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>

 


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!