介紹如何在 Ubuntu Linux 中安裝並使用 ClamAV 防毒軟體的 clamd 常駐服務,加速掃描病毒的速度。

當安裝好基本的 ClamAV 防毒軟體之後,就可以使用 clamscan 進行掃毒,但是 clamscan 在每次掃毒前的初始化時間相當長,若要持續性進行多次掃描,可以加裝 clamd 常駐服務,改用 clamdscan 掃描工具,可大幅提高掃毒的速度。以下將介紹 clamd 的安裝與 clamdscan 的使用方式。

相關文章:
Ubuntu Linux 安裝、使用 ClamAV 防毒軟體 clamscan 掃毒指令教學與範例
Ubuntu Linux 安裝、使用 ClamAV 防毒軟體 clamonacc 自動掃描教學與範例

安裝 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 執行畫面

參考資料