即時備份監控網站 發現竄改立刻遠端回復
用開源方案打造網站保鑣

2010-04-25
隨著Internet的興起,有越來越多的企業擁有自己的網站。但或許是管理人力不足或疏於管理,以至於常常成為駭客覬覦的對象,常被入侵篡改網頁或被放置惡意程式(在筆者的服務經驗中,網站的危安事件以放置惡意程式和釣魚網頁占最大宗),但不論是何種形式的入侵,都會對企業的形象和商譽造成莫大的傷害。
有鑑於網路入侵問題嚴重,本文結合開源碼社群中的「完整性分析」工具和「遠端備份」工具實作一套網站保護系統。當網站內的資料被不正常更動時能即時地監控並立即回復。而在本系統中希望能夠具備下列幾項功能:  

●能即時地偵測網站內的資料更動情形,例如新增(檔案或目錄)、刪除(檔案或目錄)及修改檔案等。  

●當偵測到網頁資料被不正常地更動時,會啟動回復(Restore)系統,自動至遠端備份主機取得相關的備份資料,來回復被不正常更動的網頁資料。  

這裡會使用到的開源碼程式如下表所示:  

 

安裝integrit 完整性分析軟體

說到完整性分析工具,很多人第一時間想到的可能是Tripwire(官方網址為http://www.tripwire.org/),Tripwire是一個知名且功能強大的分整性分析工具,但相對地,其系統資源消耗較多且設定複雜,況且Tripwire目前已成為商業化軟體,因此這裡將介紹另一套具有相同功能但較為精緻的完整性分析工具integrit,integrit主要功能在於比對檔案系統是否有不正常的更動情形。  

integrit的工作原理是,在系統剛建立完成時(在乾淨的情況下)先建立一個基準系統狀態資料庫(在此稱為known database)。比對時,先建立目前系統狀態資料庫(在此稱為current database),並與known database進行比對。  

如果基準系統狀態資料庫與目前系統狀態資料庫比對不一致,即表示目前的系統狀態有被更動過,integrit將會顯示出被更動的檔案或目錄。  

由於integrit並未提供如rpm等包裝檔,所以要利用原始檔直接編譯,請至「http://sourceforge.net/projects/integrit/」取得最新版本的integrit。截至目前為止,筆者取得的版本為4.1。  

下載完成後,利用指令「configure && make && make install」安裝integrit。完裝完成後,將產生integrit主程式。  

另外,integrit在「utils」目錄下提供了工具程式i-viewdb來查看資料庫的內容。可至「utils」目錄下直接執行指令「make」,即可編譯出i-viewdb執行檔。編譯成功後,繼續設定integrit的設定檔(/etc/integrit.conf),設定檔內容如下表所示。  

 

 

以下將以integrit來檢查檔案系統變動的情況,假設在「/usr/local/apache2/htdocs/test/」目錄下有一個名叫index.html的檔案,其內容如下:  

<html>
<b>hello world!!!</b>
</html>  

然後,在「/etc/integrit.conf」加入下列的設定:  

known=/root/known.cdb #基準系統狀態資料庫
current=/root/current.cdb #目前系統狀態資料庫
root=/usr/local/apache2/htdocs/test #比對啟始目錄  

首先,使用integrit來建立基準資料庫(請自行查閱integrit用法),以下列指令建立基準系統狀態資料庫:  

integrit -u -C /etc/integrit.conf -N /root/known.cdb  

其中-u為update,-C為使用「/etc/integrit.conf」設定檔,-N則為產生目前系統狀態資料庫,如果讀者參閱integrit的用法,會發現-N參數原意是用來產生目前系統狀態資料庫,而另一個參數-O才是用來產生基準系統資料庫,但筆者測試結果發現,使用-O參數並無任何作用,所以還是利用-N參數來建立基準系統狀態資料庫。  

建立完成後,可利用i-viewdb來查看integrit的資料庫內容,並利用指令「i-viewdb /root/known.cdb」查看known.cdb的內容。  

建立好基準系統狀態資料庫後,將測試下列四種狀況:  

檔案系統新增情況

先利用指令「touch /usr/local/apache2/htdocs/test/index2.html」新增一個檔案,接著執行指令「integrit -u -c -C /etc/integrit.conf」進行檢查(-c的意思為check,即為檢查):

integrit一旦發現有新增檔案,就會以new來表示該新增檔案。  

刪除情況

先利用指令「rm -f /usr/local/apache2/htdocs/test/index.html」刪除檔案,然後使用指令「integrit -u -c -C /etc/integrit.conf」進行檢查。integrit若發現有被刪除檔案,即以missing來表示該被刪除檔案。

修改情況

先執行指令「touch /usr/local/apache2/htdocs/test/index.html」,重新更動index.html的存取時間,接著使用指令「integrit -u -c -C /etc/integrit.conf」來檢查:

如果integrit發現檔案已經被修改過(在本例中為檔案存取時間被更動),就會以changed來表示該檔案已被修改。  

特別選項(switch)情況

integrit也提供可針對個別的檔案或目錄特別的檢查選項(switch)。若不在意檔案修改時間被改變,可利用設定switch選項來達到此要求。切換到「/etc/integrit.conf」,然後加入以下的設定:  

/usr/local/apache2/htdocs/test/index.html AMC  

該行設定表示不須對index.html的存取時間(A)、更動時間(M)和新建時間(C)做檢查(使用大寫字母即表示不對該選項做檢查)。  

接著重新執行指令「integrit -u -c -C /etc/integrit.conf」進行檢查,會發現integrit不會認定index.html有變動的情形。其他更細緻的switch設定,請自行測試。

設定rsync遠端備份程式  

rsync是一種異地備份軟體,目前由Samba組織維護。一般備份軟體備份方式可分為「鏡像備份」(Mirror Backup)和「增量備份」(Incremental Backup)兩種。「鏡像備份」就像鏡子一樣,將資料一對一的備份過去,就如同copy指令一樣。而「增量備份」每次備份前會先比較兩邊資料的不同,僅備份異動的資料。  

rsync軟體備份方式即屬於增量備份方式,每次備份之前會先比較來源端和目的端的檔案差異,僅將有差異的資料備份至目的端。在開始介紹rsync之前,先行定義下列名詞:  

來源端:欲備份的主機 目的端:備份主機(存放被備份主機的資料)  

而rsync的運作方式分成伺服器(Server)模式與客戶端(Client)模式。伺服器模式是以daemon方式運作,即rsync伺服器;客戶端模式則是以一般程式方式運作,可視為Client端程式。此外,rsync備份時可區分Push和Pull兩種行為,Push是從來源端將備份資料庫備份到目的端,而Pull是將目的端的備份資料備份至來源端。  

安裝rsync軟體的方法很簡單,使用指令「yum install rsync*」即可安裝好相關相關的軟體。安裝完成後,首先必須設定目的端的rsync伺服器的設定檔(/etc/rsyncd.conf),內容設定如下:  

[restore] #備份代號,名稱可自訂. path = /restore #用來設定備份檔案要存放的目錄 auth users = restore_user #可允許使用的帳號 uid = root #設定rsync執行時,所使用的個人權限 gid = root #設定rsync執行時,所使用的群組權限 secrets file = /etc/rsyncd.secrets #認證用密碼檔,在此檔案設定client端的帳號及密碼 read only = no  

接著,設定「/etc/rsyncd.secrets」檔案,此檔案格式為「帳號:密碼」,設定如下:  

restore_user:passwd (請自行設定帳號及密碼)  

這裡要特別要注意的是,須將「/etc/rsyncd.secrets」擁有者設為root,並且將權限設定為600,不然備份指令可能不會成功:  

chown root:root /etc/rsyncd.secrets #更動檔案擁有者 為root chmod 600 /etc/rsyncd.secrets #重新設定檔案權限  

然後,須設定來源端的密碼檔(/etc/rsyncd.secrets),此檔案僅須設定密碼passwd,以本例而言即為passwd。同樣地,此檔案也須設定擁有者為root以及將權限設為600:  

chown root:root /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets  

完成來源和目的端設定之後,在目的端上要先行啟動rsync伺服器,預設rsync會由xinetd所啟動。請開啟「/etc/xinetd.d/rsync」檔案並設定如下的組態資料:  

service rsync { disable = no #將預設disable =yes 改為 disable=no flags = IPv6 socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID }  

設定完成後,利用指令「xinetd start」來啟動目的端的rsync伺服器。可利用指令「netstat -ant | grep LISTEM」來判別目的端rsync服務是否啟動(檢查服務埠873是否有開啟),如下圖所示。

在rsync伺服器啟動完成後,可先行測試下列狀況:  

Push-從來源端將資料備份至目的端 先在來源端上下達下列的指令:  

rsync -rvlHpogDtS --password-file=/etc/rsyncd.secrets /usr/local/apache2/htdocs/test/* restore_user@xxx.xxx.xxx.xxx::restore  

執行上述指令是為了將來源端上的「/usr/local/apache2/htdocs/test」目錄資料備份至xxx.xxx.xxx.xxx的伺服主機,restore為上例設定的備份代號,而restore_user是使用者名稱。其中rsync的參數用法說明如下:  

-r:recursive,以遞迴的模式備份
-v:verbose,詳細模式輸出
-l:軟連結(Soft Link)的檔案也要備份過去
-H:保留硬連結(Hard Llink)
-p:保留文件權限
-o:保留文件擁有者資訊
-g:保留文件群組資訊
-D:devices,設備檔案也要備份過去
-t:times,保留文件時間
-S:進行特殊處理,以節省儲存空間

如果一切順利,來源端的「/usr/local/apache2/htdocs」目錄的資料,將會被備份至目的端的「/restore」目錄。  

Pull-將資料從目的端下載至來源端 接著,在來源端上執行如下的指令:  

rsync -rvlHpogDtS --password-file=/etc/rsyncd.secrets restore_user@xxx.xxx.xxx.xxx::restore /usr/local/apache2/htdocs/test  

該指令的作用是,從xxx.xxx.xxx.xxx下載備份資料至本機,其中restore為設定的備份代號,restore_user為使用者名稱,如果一切順利,來源端將從目的端上的「/restore」目錄內取回相關的備份資料並置於「/usr/local/apache2/htdocs/test」目錄下。其餘相關指令用法,請自行參閱rsync的說明。。(更多精采內容請見網管人51期)


追蹤我們Featrue us

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

我知道了!