介紹如何在 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 的執行畫面會類似這樣:
clamdtop 執行畫面