介紹如何在 Ubuntu Linux 中安裝並使用 ClamAV 防毒軟體的 clamd
常駐服務,加速掃描病毒的速度。
當安裝好基本的 ClamAV 防毒軟體之後,就可以使用 clamscan
進行掃毒,但是 clamscan
在每次掃毒前的初始化時間相當長,若要持續性進行多次掃描,可以加裝 clamd
常駐服務,改用 clamdscan
掃描工具,可大幅提高掃毒的速度。以下將介紹 clamd
的安裝與 clamdscan
的使用方式。
clamd
若在 Ubuntu Linux 系統中,clamd
被收錄在 clamav-daemon
套件中,可以使用 apt
安裝:
# 安裝 clamav-daemon 套件
sudo apt install clamav-daemon
安裝好 clamav-daemon
套件之後,系統上會多出一個 clamav-daemon
服務:
# 查看 clamav-daemon 系統服務狀態
systemctl status clamav-daemon
● clamav-daemon.service - Clam AntiVirus userspace daemon Loaded: loaded (/lib/systemd/system/clamav-daemon.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/clamav-daemon.service.d └─extend.conf Active: active (running) since Sun 2021-06-20 14:41:15 CST; 5min ago Docs: man:clamd(8) man:clamd.conf(5) https://www.clamav.net/documents/ Main PID: 31942 (clamd) Tasks: 2 (limit: 4915) CGroup: /system.slice/clamav-daemon.service └─31942 /usr/sbin/clamd --foreground=true [略]
clamd
設定檔clamd
的系統設定檔位於 /etc/clamav/clamd.conf
,設定檔的參數設定方式與說明可參考 clamd.conf
的線上說明。
# 查閱 clamd.conf 的線上說明文件
man clamd.conf
clamdscan
掃描病毒clamdscan
是一個搭配 clamd
常駐服務的掃毒工具,功能非常類似 clamscan
,執行效率較高,但是可用的參數較少(因為部分功能是由 clamd
控制的)。
clamd
與病毒碼版本在使用 clamdscan
進行掃毒之前,可以先測試與 clamd
的連接是否正常:
# 檢查與 clamd 的連接是否正常 clamdscan -p 3
PONG
若顯示 PONG
就表示與 clamd
的連線正常。
同時也檢查一下 ClamAV 與病毒碼版本:
# 檢查 ClamAV 版本 clamdscan --version
ClamAV 0.103.2/26206/Sat Jun 19 19:15:41 2021
在這段輸出中,26206
是病毒碼(signatures)的版本,而最後的日期則是病毒碼的日期。
執行 clamdscan
並指定檔案路徑,即可對指定檔案進行掃毒:
# 對 archive.zip 進行掃毒
clamdscan archive.zip
/home/ubuntu/tmp/archive.zip: OK ----------- SCAN SUMMARY ----------- Infected files: 0 Time: 0.002 sec (0 m 0 s) Start Date: 2021:06:20 15:54:46 End Date: 2021:06:20 15:54:46
執行 clamdscan
不帶任何參數,就會自動掃描目前所在的整個目錄:
# 對目前所在目錄進行掃毒
clamdscan
若指定目錄路徑,就會對該目錄進行掃毒:
# 對 /home/ubuntu 目錄進行掃毒
clamdscan /home/ubuntu
若要對指定的檔案清單進行掃毒,可以使用 -f
參數來指定檔案清單。
先準備好檔案清單 filelist.txt
,格式為一行一個檔案,例如:
/home/ubuntu/file1.zip /home/ubuntu/file2.docx /home/officeguide/file3.pptx
接著執行以下指令,對檔案清單內的檔案進行掃毒:
# 對檔案清單進行掃毒 clamdscan -f filelist.txt
將檔案描述符(file descriptor)權限傳遞給 clamd
,當 clamd
以不同的使用者權限執行時,若以這種方式進行掃毒,執行效率會比串流(streaming)更好。
# 傳遞檔案描述符權限 clamdscan --fdpass /home/ubuntu
執行 clamdscan
指令時若加上 -m
或 --multiscan
參數,clamdscan
就會嘗試以多執行緒(multithread)的方式平行掃描每個路徑下的檔案,在多核心 CPU 的環境下可大幅提升掃描速度,此參數可搭配 --fdpass
一起使用:
# 以多執行緒平行掃描 clamdscan -m --fdpass /home/ubuntu
clamscan
也可以對資料串流進行掃毒:
# 掃描資料串流
cat myfile | clamscan -
stream: OK ----------- SCAN SUMMARY ----------- Infected files: 0 Time: 0.216 sec (0 m 0 s) Start Date: 2021:06:20 15:54:09 End Date: 2021:06:20 15:54:09
當 clamdscan
偵測到中毒的檔案時,預設只會顯示訊息,不會刪除檔案,若要自動刪除感染病毒的檔案,可以加上 --remove
參數:
# 自動刪除中毒的檔案 clamdscan --remove /home/ubuntu
使用 --remove
參數會有誤判的風險,如果怕誤刪檔案,可以改用 --move
參數將中毒的檔案搬移到指定的隔離目錄:
# 將中毒檔案搬移至 /home/clamav/virus 目錄 clamdscan --move=/home/clamav/virus /home/ubuntu
另一種更保守的做法是只將中毒的檔案複製一份到指定的目錄,而不更動原始的檔案:
# 將中毒檔案複製一份至 /home/clamav/virus 目錄 clamdscan --copy=/home/clamav/virus /home/ubuntu
若希望 clamdscan
輸出較詳細的資訊,可以加上 -v
參數:
# 輸出詳細資訊 clamdscan -v /home/ubuntu
若希望 clamdscan
不要輸出任何訊息,可以使用 --quiet
參數:
# 不要輸出任何訊息 clamdscan --quiet /home/ubuntu
若不要輸出最後的掃描結果報表,可以加上 --no-summary
參數:
# 不要輸出掃描結果報表 clamdscan --no-summary /home/ubuntu
若要將輸出訊息直接儲存至檔案中,可以使用 -l
參數指定輸出的檔案路徑:
# 將訊息輸出至 scan.log clamdscan -l scan.log /home/ubuntu
clamdscan
傳回值clamdscan
指令在掃描完成後,會依據掃描結果傳回不同的值:
傳回值 | 說明 |
---|---|
0 |
未發現病毒。 |
1 |
發現有檔案感染病毒。 |
2 |
掃描過程出現錯誤。 |
若在 bash shell 指令稿中,可以透過傳回值來判斷是否掃出病毒:
#!/bin/bash # 以多執行緒平行掃描病毒 clamdscan -m --fdpass /home/ubuntu # 取得 clamdscan 傳回值 val=$? # 判斷掃描結果 if [ "$val" = "0" ]; then echo "未發現病毒。" elif [ "$val" = "1" ]; then echo "發現有檔案感染病毒。" else echo "掃描過程出現錯誤。" fi
clamd
狀態若需要查看 clamd
常駐服務的狀態,可以使用 clamdtop
這個指令工具,它類似標準的 top
工具,會顯示 clamd
的佇列、記憶體使用量以及病毒碼資訊等:
# 查看 clamd daemon 狀態
clamdtop
clamdtop
的執行畫面會類似這樣: