本文將示範打造一個防駭的網站金鐘罩系統,利用SVN版本控管系統產生網站目錄的初始版本,並採用integrit建立基準狀態資料庫,然後定時透過integrit產生現存狀態資料庫來進行比對,這樣一來不但能夠保存網站目錄被不當變動時的資訊,還可即時地回復網站伺服器原有的內容。
接下來,以實例來實際說明SVN版本控制系統。假設「/tmp/mytree」為SVN工作目錄,而「/tmp/newrepos」是SVN放置檔案庫的目錄,用來儲存各個不同版本的檔案。
先建立第一個版本的檔案,假設該版本有hello1、hello2等檔案,執行指令「svnadmin create /tmp/newrepos」,以便在「/tmp/newrepos」目錄中產生檔案庫。指令執行後,該目錄會產生如下圖示所示的檔案。
接著使用指令「svn import first -m "initial" file:///tmp/newrepos」,將「first」目錄內的檔案當成第一個版本放入檔案庫中,並加上註解為"initial",如下圖示。
然後執行指令「cd /tmp/mytree」切換至SVN工作區。再下達指令「svn checkout file:///tmp/newrepos」,從該檔案庫中取得最新版本的檔案,將檔案庫中的內容存放至「/tmp/mytree/newrepos」目錄內,並在該目錄內新增「.svn」目錄,指令執行情形如下圖所示,其中行首A代表此檔案是新增的檔案。
以下講解SVN所定義的檔案狀態,其檔案狀態如表3所示。
表3 SVN所定義的檔案狀態
接下來,在工作區的目錄中模擬更動原先檔案,並回存至檔案庫中。
首先,執行指令「echo "hello">hello1」,設定hello1檔案的內容為hello。然後,使用指令「svn commit -m "initial 2" /tmp/mytree/newrepos/」,將工作區目錄變動的檔案,傳遞至檔案庫中儲存(版本編號為2),如下圖示。
如果有新增的檔案,就不能直接Commit,而是要先新增才能進行Commit,如下所描述。
執行指令「echo "hello3">hello3」,在工作區目錄中新增一個檔案,名稱為hello3,模擬網站被放置了新的檔案。接著,先新增該檔案讓SVN控管,所以下達指令「svn add /tmp/mytree/newrepos/hello3」。
然後,透過指令「svn commit -m "initial 2" /tmp/mytree/newrepos/」再Commit,成為版本3,日後取出版本3的檔案時就會包含hello3的檔案,如下圖所示。
integrit簡介
integrit是一個小而美的檔案系統完整性檢查工具,可用來檢查檔案的變動情形,例如新增、刪除或修改等情形,其工作原理如圖1所示。
|
▲圖1 integrit的工作原理。 |
一開始,在系統剛建立完成時(在乾淨的情況下),先利用單向hash函數針對所要比對的目錄和檔案建立一個基準系統狀態資料庫(在此稱為Known Database,亦即圖1中的KNOWNDB),並將KNOWNDB資訊置於安全的地方。
在要進行比對的時候,就利用相同的單向hash函數建立資料庫(在此稱為Current Database,亦即圖1中的CURRDB)。在建立完成後,再將KNOWDB與CURRDB進行比對。
如果KNOWNDB資料庫與CURRDB資料庫經比對後發現不一致,即表示所監控的目錄或檔案已經發生改變了。
以上所述是簡單的檔案完整性檢查原理,而在integrit軟體中還能指出被更動的檔名或目錄等資訊。由於integrit並未提供如rpm等包裝檔,所以這裡將以原始檔直接編譯。
先至「http://integrit.sourceforge.net/」取得最新版本的integrit(本文使用版本為4.1)。下載完成後,利用「configure」指令組態integrit,以「make」指令進行編譯程序,然後使用「make install」指令開始安裝integrit。
完裝完成之後,將產生檔案名稱為「integrit」的主程式。
integrit為了方便使用者檢查integrit所產生的資料庫內容,還提供一個檢視資料庫的程式,名稱為「i-viewdb」,其原始碼位於「utils」目錄下,可直接至「utils」目錄下執行指令「make」,即可編譯出程式名稱為「i-viewdb」的執行檔。