介紹如何在 Ubuntu Linux 環境安中並使用 ClamAV 防毒軟體的 clamonacc
工具提供系統自動掃描病毒(On-Access)的功能。
ClamAV 的自動掃描病毒(on-access)是透過 Linux 核心的 fanotify API 功能,阻止行程存取被病毒感染的檔案,這個保護機制是作用在 Linux 核心層級(kernel-space),所以保護力會比一般使用者層級(user-space)更高。
clamonacc
在使用 clamonacc
之前,必須先安裝好 clamd
常駐服務。
若在 Ubuntu Linux 中,clamonacc
這個工具被收錄在 clamav-daemon
套件中,只要安裝好 clamd
常駐服務之後,就可以直接使用 clamonacc
這個工具。
若要使用 clamonacc
的 On-Access 自動掃描病毒功能,要先編輯 /etc/clamav/clamd.conf
設定檔,加入基本的 On-Access 相關設定:
# On-Access 自動掃描作用路徑 OnAccessIncludePath /home # 防止行程存取感染病毒的檔案 OnAccessPrevention true # 排除 clamav 使用者 OnAccessExcludeUname clamav
這裡的 OnAccessIncludePath
是用來指定 On-Access 自動掃描病毒功能的作用路徑,若指定為 /home
,則 clamonacc
就會對整個 /home
目錄與子目路以下的所有檔案進行監控並掃毒。
OnAccessPrevention
功能是自動防止行程存取受病毒感染的檔案,如果有行程嘗試存取有病毒的檔案,就會出現 Operation not permitted
的錯誤。
OnAccessExcludeUname
則是用來排除指定使用者的行程,以 Ubuntu Linux 來說,預設執行 clamd
的使用者是 clamav
,所以將其排除。
完成基本的設定之後,就可以用 root
權限執行 clamonacc
:
# 啟動 clamonacc 常駐程式
sudo clamonacc
如果 clamonacc
相關的設置都沒問題的話,它就會自動以常駐程式的方式在系統上執行,這樣就完成 On-Access 自動掃描病毒的設置了。
如果要測試 On-Access 自動掃描病毒的功能是否有正常運作,我們可以自己建立一個 EICAR 測試病毒檔:
# 建立 EICAR 測試病毒檔 cat > eicar.virus <<'EOF' X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* EOF
接著再以 cat
指令嘗試存取這個測試用的病毒檔案:
# 測試存取病毒檔案
cat eicar.virus
cat: eicar.virus: Operation not permitted
由於 clamonacc
偵測到這一個 eicar.virus
檔案含有病毒,所以就自動禁止 cat
行程讀取該檔案。
所有被 clamonacc
偵測到的病毒檔案也都會自動被記錄在 /var/log/syslog
記錄檔中:
Jun 22 19:22:02 largeimg clamd[10702]: Tue Jun 22 19:22:02 2021 -> ~/home/ubuntu/eicar.virus: Eicar-Signature(69630e4574ec6798239b091cda43dca0:69) FOUND
clamd.conf
設定以下設定可讓 clamonacc
監控整個系統,排除 root
管理者與 clamav
使用者。由於這裏沒有設定 OnAccessPrevention
,所以當發現病毒時並不會限制行程存取,只會顯示警告訊息。
# 監控整個系統 OnAccessMountPath / # 排除 root 管理者 OnAccessExcludeRootUID yes # 排除 clamav 使用者 OnAccessExcludeUname clamav
OnAccessIncludePath 與 OnAccessExcludePath 可以納入與排除指定的目錄,並且可以使用多次來指定不同的目錄。以下設定可讓 clamonacc
監控整個 /home
目錄,但排除 /home/user2
與 /home/user4
兩個目錄:
# 監控 /home 目錄,但排除 /home/user2 與 /home/user4 兩個目錄
OnAccessIncludePath /home
OnAccessExcludePath /home/user2
OnAccessExcludePath /home/user4
若希望 OnAccessIncludePath
在指定目錄時,不要涵蓋任何子目錄,可以將 OnAccessDisableDDD
設定為 yes
:
# 停用對子目錄掃毒功能
OnAccessDisableDDD yes
若 clamonacc
沒有如預期般正常運作,可以加上 --foreground
與 --verbose
參數,讓 clamonacc
以前景模式執行,並輸出詳細的訊息,方便除錯。
如果在執行 clamonacc
時出現類似這樣的錯誤訊息:
ERROR: ClamInotif: could not watch path '/home', No space left on device
可以嘗試執行以下指令,將 /etc/sysctl.conf
中的 fs.inotify.max_user_watches
設定值調高一些:
# 調整 fs.inotify.max_user_watches 的設定值 echo fs.inotify.max_user_watches=524288 | \ sudo tee -a /etc/sysctl.conf && sudo sysctl -p