DazukoFS ClamAV Linux 病毒 資安

超簡單自建Linux即時病毒掃描系統

2011-08-22
在微軟的作業系統中,即時掃描電腦病毒,似乎是一件理所當然的事,也就是,當使用者對檔案進行存取動作時即會對該檔案進行病毒掃描,這也許是封閉系統的優點。單一的作業系統核心可以很方便地實作任何功能,但是在開放系統如Linux系統的世界裡就沒有這麼幸運了。
在「自由」的大旗下,所有人都可以盡情地發揮想像力開發系統,但這也代表著很難可以找到一個解決方案可以符合所有開放系統的要求。不過,這不就是開放系統最珍貴的價值所在。

言歸正傳,那在Linux系統下是否能有一個解決方案可以解決即時掃描病毒的要求(這聽起來就覺得應該會動到Linux的核心)。或許有人會想:那就利用Linux系統下最富盛名的掃毒程式ClamAV定時去掃描系統目錄不就好了。的確,這樣的方式可以解決大部分的問題,但這總覺得差那麼一點點,不夠即時,如果能在檔案存取的階段就進行掃描,就更棒了。

所以在本文將利用ClamAV搭配DazukoFS核心模組,來實作一個具有即時掃描病毒功能的系統,其所需的套件如下表所示。

什麼是DazukoFS

在說明什麼是DazukoFS核心模組前,首先來說明一下Linux的VFS(Virtual Filesystem Switch)檔案系統。眾所周知,在Linux系統底下支援很多的檔案系統(如ext2、ext3等等),讀者如果有興趣,可利用指令「ls -l /lib/modules/$(uname -r)/kernel/fs」來查看目前系統支援那些檔案系統。其中的$(uname -r)是查看目前系統所使用的系統核心(Kernel)版本。

而Linux核心是如何與不同的檔案系統進行溝通?其實Linux核心並不是直接與檔案系統溝通,而是利用VFS(Virtual Filesystem Switch)系統來讀取不同的檔案系統。

簡而言之,可簡單地將VFS檔案系統視為底層的檔案系統與系統的中介層。而DazukoFS則是介接在VFS檔案系統上,監控檔案的存取動作,當檔案有任何的存取動作時,即立即觸發相關事件(Event)。

接下來,繼續安裝DazukoFS核心模組,由於DazukoFS僅支援某些版本的核心。以本解決方案為例,最新版本的DazukoFS(DazukoFS 3.1.4)僅支援2.6.36,因此可利用指令「uname -r」查看目前的Kernel版本,Kernel版本若不是2.6.36,就須要重新安裝編譯核心,而安裝過程須經過下列的操作步驟。

重新編譯核心
重新編譯核心以符合Dazuko核心模組所支援的核心。目前DazukoFS核心模組最新的版本為3.1.4,所支援的核心為2.6.36,因此將重新編譯Kernel 2.6.36核心,步驟如下:

執行指令「wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.tar.gz」取得2.6.36核心原始碼。然後,輸入指令「tar xvzf linux-2.6.36.tar.gz」來解壓縮核心程式碼。接著以指令「mv linux-2.6.36 /usr/src」將原始碼搬移到「/usr/src」目錄下。

隨後,執行指令「cd /usr/src/linux-2.6.36」切換至「/usr/src/linux-2.6.36」目錄下。接著執行指令「make oldconfig」,利用舊的核心參數來設定核心組態以符合目前的系統環境,藉此減少系統可能不相容的問題(舊的核心參數檔置於「/boot/config-2.6.35.6-45.fc14.i686」)。

在設定的過程中會詢問一些問題,在此均使用預設即可,亦即直接按下〔Enter〕按鍵。

如果讀者還想要微調核心組態以更符合目前系統的現況,即可利用指令「make menuconfig」或「make xconfig」來微調相關組態,相關Kernel組態編譯的方法,請自行參閱相關文件。

接著執行指令「make」來編譯核心,並輸入指令「make modules」編譯核心模組。隨後執行指令「make modules_install」,安裝核心模組。

如果使用VMware(虛擬機器)環境來安裝的話,由於在2.6.36的核心中,已經將vmware_balloon.ko(在VMware環境中運作所需的模組)更名為vmw_balloon.ko,所以可能出現無法載入vmware_balloon.ko模組的情形,此時可將vmi_balloon.ko(位於「/lib/modules/2.6.36/kernel/drivers/misc/」目錄下)更名為vmware_balloon.ko即可。若是在使用真實機器的環境,則不必理會此問題。

接著,執行指令「make install」重新安裝核心並重新設定開機組態(一般位於「/etc/grub.conf」),並且透過指令「reboot」重新開機。重新開機後,即會使用新編譯的核心開機。此外,可利用「uname -r」指令來驗證是否為2.6.36的核心。

安裝DazukoFS核心模組?
DazukoFS是一種可堆疊式的檔案系統(Stackable File System),架構在VFS檔案系統上,提供一組介面讓使用者能夠自行撰寫應用程式來控制檔案的存取,其最主要的目的是用來與防毒軟體(如本解決方案中的Clamav防毒軟體)結合,以提供即時掃描的掃毒服務。

但由另外一個角度來看,如果DazukoFS可以取得檔案變動的情況,似乎可用來當做主機型入侵偵測(HOST IDS)功能使用。這部分也許讀者可自行發揮想像力來思考,不過在本文中還是以提供病毒即時掃描的解決方案為主。

Dazuko專案目前有分為Dazuko核心模組與DazukoFS核心模組。據Dazuko官方網站的說明,作者似乎有利用DazukoFS核心模組來取代Dazuko模組的想法,因此在本文中將以DazukoFS核心模組為主。接下來,就來安裝DazukoFS。

先至DazukoFS的官方網站取得最新版本(目前最新的版本為DazukoFS 3.1.4,支援Kernel 2.6.36版本的核心,這也是為什麼安裝的第一個步驟須重新編譯核心的原因)。

解壓縮後,直接執行指令「make && make dazukofs_install」來編譯相關模組,將會產生一個dazukofs.ko核心模組。

編譯成功後,利用「modprobe dazukofs」來載入DazukoFS模組。可使用lsmod指令來檢查是否已載入DazukoFS模組。

在本解決方案中,將利用DazukoFS模組搭配ClamAV病毒掃描程式來進行即時的病毒掃描,但如果想即時監控系統內某個目錄的檔案變動情形(如Windows系統中的Filemon程式功能),同樣地,也可利用DazukoFS核心模組達到相同的功能。

在載入DazukoFS核心模組之後,就可以利用mount指令以DazukoFS檔案系統來掛載(mount)系統內的某個目錄來進行監控。

執行指令「mount -t dazukofs /<被掛載目錄名> /<目錄名>」,其中「被掛載目錄名」指的是被監控的目錄,若想要監控「/usr」目錄下的檔案變動情況,即可使用指令「mount –t dazukofs /usr /usr」,利用DazukoFS檔案系統來掛載「usr」目錄。

一旦「/usr」目錄(DazukoFS是利用遞迴監控的方式來監控,亦即監控「/usr」目錄下的所有檔案與目錄)下的檔案發生變動的時候,DazukoFS即可立即偵測到。

上述的例子為監控「/usr」目錄,那如果要監控全系統呢?也許有人可能會說,那就是「mount -t dazukofs / /」吧,將根目錄掛載起來就可以監控全系統?

但不幸的是,根據DazukoFS官方網站的說明(可詳細閱讀README檔案以取得更詳盡的資訊,檔案內詳細說明了DazukoFS核心模組的限制)。DazukoFS核心模組目前仍不能完全監控特殊的檔案(若以記憶體形式存在的檔案或直接掛載根目錄,或者掛載單一的檔案,勉強掛載可能會造成系統當機的後果),因此還是只能一個目錄一個目錄的掛載來進行監控,而尚未能達到全系統監控的要求。

可將要監控的目錄設定在「/etc/fstab」檔案中,在系統開機時自動的掛載相關目錄,以下簡單的說明「/etc/fstab」檔案。「/etc/fstab」檔案主要是記錄系統開機時要掛載的檔案系統相關資訊,fstab一共分為六個欄位,如下所示:

[磁碟裝置檔名][掛載點][檔案系統][檔案系統參數][是否能進行dump備份指令][是否能進行檢驗磁區]

其中各欄位的說明如下:
[磁碟裝置檔名]:說明檔案系統的裝置檔名,如「/dev/had」等。
[掛載點]:所要掛載的目錄名稱,如「/usr」等。
[檔案系統]:所掛載的檔案系統名稱,例如ext2、ext3等。
[檔案系統參數]:可在此欄位加上檔案系統相關的參數,列舉常用參數如下表所示:

[是否能進行備份]:是否要對此檔案系統進行備份。0表示不需要,1表示可進行備份。
[是否能進行檢驗磁區]:是否可對此檔案系統進行磁區檢驗。0表示不能,1表示可以。

在了解「/etc/fstab」的用法以後,即可將欲監控的目錄設定在此檔案之中,在開機時即可利用DazukoFS檔案系統將該目錄掛載進來。例如掛載「/usr」目錄,設定「/usr /usr dazukofs defaults 0 0」,以便在開機之時利用DazukoFS檔案系統掛載「/usr」目錄。

設定完成後,可至DazukoFS原始碼目錄中一個名稱為「test」的目錄內,其中有個「showfiles.c」檔案,其內容為如何自行撰寫程式與DazukoFS模組溝通,並取得DazukoFS模組所偵測到的檔案變動的資訊(包含Process Id及變動的檔案名稱)。

讀者可自行編譯此程式,如果一切設定都正常,可先執行showfiles程式,此時可利用如cp、rm等指令來變動「/usr」目錄下的檔案,showfiles程式可以即時地顯示相關的檔案變動情形。

讀者可自行研究該檔案,以了解如何以自行撰寫的應用程式來取得DazukoFS模組所提供的檔案相關資訊。

安裝ClamAV

ClamAV是Linux系統下最富盛名的掃毒軟體,請至ClamAV的官方網站取得最新版的ClamAV(筆者所取得的版本為0.96.3),之後下達如下的指令:

將ClamAV安裝「在/usr/local/clamav/」目錄底下,並且開啟支援clamuko模組的功能。隨後,執行指令「make」來編譯相關程式,並輸入指令「make install」安裝相關的程式至「/usr/local/clamav」目錄上。

接下來,將設定ClamAV的相關組態檔(位於「/usr/local/clamav/etc/」目錄上),ClamAV組態檔如下所述:

clamd.conf:設定ClamAV運作的主組態檔。這裡將使用Socket的方式與ClamAV的伺服器連線。須設定的選項如下表所示。

freshclam.conf:設定ClamAV病毒碼更新的相關組態,須設定的選項如下:

在設定完成後,建議讀者先執行freshclam程式來更新病毒碼。建議可將此指令寫入crontab中,定時地每日更新病毒碼。

更新完成後,即可執行「clamd」啟動ClamAV伺服器。基本上,ClamAV提供兩種執行方式常駐程式(daemon)及手動執行,如下所述:

常駐程式
常駐程式執行模式分為掃描伺服器程式和掃描客戶端程式兩種,使用者必須先執行掃描伺服器端程式(clamd)後,再執行掃描客戶端程式(clamdscan)以透過掃描伺服器端程式進行掃描。

在此種模式下,使用者可自行開發病毒掃描程式。因為只要透過clamd所提供的命令介面,即可控制clamd程式來進行掃描病毒的工作。

在此僅介紹幾個常用的命令介面,其餘相關的命令介面請自行參考官方網站的說明。下為常用命令介面說明。

PING:檢查clamd程式是否正在執行中,如果clamd正在執行中,即會回應pong訊息(亦即ping-pong的檢查)。
RELOAD:通知clamd程式,重新載入病毒碼資料庫。
SHUTDOWN:停止clamd程式執行。
SCAN:掃描檔案或目錄,如果掃描的對象是目錄,即會以遞迴的方式掃描。
MULTISCAN:運用多執行緒(Thread)的掃描方式,此種方式在多處理器的系統下會達到更高的掃描效率。
INSTREAM:要求clamd程式掃描網路上傳送的封包資料,這裡要特別注意一點的是,INSTREAM所傳送的封包不能大於在clamd設定檔中StreamMaxLength欄位的設定,否則會發生中斷連線的問題。
STATUS:要求clamd程式顯示目前執行的統計資訊,如記憶體、CPU的使用狀況等。

手動執行
手動方式的執行,即是簡單使用clamscan程式來掃描。讀者可簡單的利用指令格式「clamscan <目錄/檔案>」來掃描目錄或檔案是否有感染病毒。

以下列出常用的命令選項,其餘相關進階用法請自行參閱相關文件說明。

-i:只顯示被感染的檔案。
--log=FILE:將相關的掃描結果儲存在的檔案。
--bell:在掃描的過程中,如果有發現被感染的檔案,即發出Bell聲警示。
-r:以遞迴的方式掃描目錄下的所有檔案。
--remove:當發現有被感染的檔案,即直接刪除。
--exclude=REGEX:排除掃描的檔案,若符合REGEX所定義的檔案,即不予掃描。其中REGEX可利用正規表示法定義,例如「clamscan --exclude=import.php /tmp」指令,即是不掃描在「/tmp」目錄下的import.php檔案。
--include=REGEX:設定欲掃描的檔案,如果符合REGEX所定義的檔案才予掃描,其中REGEX可利用正規表示法定義,例如「clamscan --include=import.php /tmp」指令,即是只掃描在「/tmp」目錄下的import.php檔案。

在此不多加說明更進階用法,其餘相關的進階用法,請自行參閱相關文件說明。

在設定完成後,即可開始使用ClamAV。先行更新病毒碼ClamAV所提供的freshclam程式來更新病毒碼。建議可將freshclam加入crontab中,每日定時的更新病毒碼資訊。

在更新完成後,執行指令「clamd -c /usr/local/clamav/etc/clamd.conf」來啟動clamd程式。

此外,可利用指令「netstat –an | grep 3310」,檢查是否有類似下列字句,以便確認clamd已經正常地啟動:

接下來,可利用clamdscan指令來掃描病毒。例如,執行指令「clamdscan /tmp/」掃描「/tmp」目錄下的檔案。如果有看到相關的掃描結果資訊,即表示ClamAV已成功安裝。

測試環境

以下將實作Linux系統即時病毒掃描的功能,相關步驟如下:

首先執行指令「modprobe dazukofs」,載入DazukoFS核心模組。在本例之中,假設要即時掃描「/home」(可遞迴掃描)目錄下是否有病毒。

執行指令「mount –t dazukofs /home /home」,可利用DazukoFS檔案系統將「/home」目錄掛載起來,亦即修改「/usr/local/clamav/etc/clamd.conf」檔案,如下表所示。

先執行指令「/usr/local/clamav/bin/freshclam」,將病毒碼更新到最新。然後以指令「clamd -c /usr/local/clamav/etc/clamd.conf」啟動clamd。至此,即可測試是否可即時的掃描病毒。

執行指令「wget https://secure.eicar.org/eicar.com.txt」至該網址取得病毒測試樣本。eicar是用來測試掃毒軟體是否有正常動作的檔案,其內容為病毒測試文字,對系統並不會造成任何的危害,但所有的病毒掃描軟體均會將此檔案視為病毒。

下載此檔案時,最好先將系統上的防毒軟體關閉,不然系統可能會判定此檔案為病毒。

可以透過ClamAV所提供的clamdscan,先行掃描這個eicar檔案,由於筆者將eicar檔案下載至「/tmp」目錄內,所以執行指令「clamdscan /tmp/eicar.com.txt」。此時,ClamAV應會回報字串「/tmp/eicar.com.txt: Eicar-Test-Signature FOUND」,即表示該檔案為病毒。

由於在本例中將「/home」目錄設為會即時掃描病毒的目錄,因此將「/tmp/eicar.com.txt」檔案拷貝至「/home」目錄下。如果Clamukofs模組有正確動作,執行指令「cat /tmp/clamd.log」後,將會發現如下的字串:

這表示該檔案已被Clamukofs視為病毒,並進行清除動作。此時,如果對該檔案進行存取,將會發生「Operation not permitted」錯誤而被拒絕存取,但可對於該檔案進行刪除的動作。至此,一個即時掃描病毒系統已完成。

結語

Clamukofs核心模組主要是用來控制檔案變動的情形,在一般的情況下,大多用來實作「即時病毒掃描」功能,但其實換個角度想,如果讀者有C語言基礎,即可自行撰寫相關的應用程式來與Clamukofs溝通,以取得檔案變動的情況(在Clamuko的官方網站上有很詳盡的API說明),以便實作出具有主機入侵偵測系統特性的系統(Host IDS)。

另一個應用是,在筆者服務經驗中,被駭客入侵的學校通常都有提供上傳檔案功能(最常見的就是課程作業的上傳),但卻又未對上傳的檔案進行適當的掃描,以致於常被上傳惡意的檔案。對此,也可應用此模組來進行病毒掃描。其他的應用,就請讀者自行發揮想像力了。


追蹤我們Featrue us

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

我知道了!