介紹如何在 Ubuntu Linux 中安裝並使用 ClamAV 防毒軟體的 clamscan
指令工具,對檔案進行掃毒。
ClamAV 是一套免費且開放原始碼的防毒軟體,軟體與病毒碼的更新皆由社群免費發布,常用於 Linux 等 UNIX-like 系統的郵件伺服器掃毒,但亦可用於 Windows 或 macOS 系統,詳細的介紹與應用可以參考維基百科的 ClamAV 文件。
若要在 Ubuntu Linux 系統上安裝 ClamAV 防毒軟體,可以使用 apt
來安裝:
# 安裝 clamav 套件
sudo apt install clamav
若要對 RAR 壓縮檔進行掃毒,可以加裝 libclamunrar9
套件:
# 安裝 libclamunrar9 套件
sudo apt install libclamunrar9
freshclam
更新病毒碼ClamAV 的病毒碼更新是由 freshclam
這個程式在負責的,更新的方式可透過預設的系統服務自動更新,或是強制手動更新。
在安裝好 clamav
套件之後,系統上會建立 clamav-freshclam
這個新的 daemon 服務,負責自動更新病毒碼:
# 查看 clamav-freshclam 服務狀態
systemctl status clamav-freshclam
● clamav-freshclam.service - ClamAV virus database updater Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-06-17 18:25:48 CST; 45min ago Docs: man:freshclam(1) man:freshclam.conf(5) https://www.clamav.net/documents Main PID: 8110 (freshclam) Tasks: 1 (limit: 4915) CGroup: /system.slice/clamav-freshclam.service └─8110 /usr/bin/freshclam -d --foreground=true [略]
正常來說,clamav-freshclam
這個服務 daemon 會自動處理病毒碼更新,管理者並不需要去管它,而如果在一些特殊情況下需要手動立即更新病毒碼的話,可以在 clamav-freshclam
停止的狀況下,執行 freshclam
手動更新病毒碼:
# 手動更新病毒碼
sudo freshclam
freshclam
病毒碼更新相關的設定都寫在 /etc/clamav/freshclam.conf
,其中比較常用的設定有:
# 產生詳細記錄 LogVerbose disabled # 每日更新病毒碼次數 Chcekcs 24 # 壓縮本機資料庫(可節省空間,但執行效率較低) CompressLocalDatabase no # 病毒碼資料庫鏡像站 DatabaseMirror db.local.clamav.net DatabaseMirror database.clamav.net
關於 /etc/clamav/freshclam.conf
設定檔的詳細說明,可以參考 freshclam.conf
的線上手冊:
# 查閱 freshclam.conf 線上手冊
man freshclam.conf
freshclam
病毒碼更新的記錄檔則位於 /var/log/clamav/freshclam.log
,這個記錄檔非常重要,管理者必須定期檢視此檔,確認病毒碼都有即時更新。
clamscan
掃描病毒進行掃毒之前,檢查 ClamAV 與病毒碼版本:
# 檢查 ClamAV 版本 clamscan --version
ClamAV 0.103.2/26203/Wed Jun 16 19:07:58 2021
在這段輸出中,26203
是病毒碼(signatures)的版本,而最後的日期則是病毒碼的日期。
若要針對個別檔案進行病毒掃描,可以使用 clamscan
指令,並指定要進行掃毒的檔案即可:
# 對 archive.zip 進行掃毒
clamscan archive.zip
clamscan
在掃毒完成後,會輸出類似這樣的掃描結果:
/home/ubuntu/tmp/archive.zip: OK ----------- SCAN SUMMARY ----------- Known viruses: 8539526 Engine version: 0.103.2 Scanned directories: 0 Scanned files: 1 Infected files: 0 Data scanned: 1.21 MB Data read: 0.15 MB (ratio 7.97:1) Time: 15.972 sec (0 m 15 s) Start Date: 2021:06:17 19:55:22 End Date: 2021:06:17 19:55:38
若要對整個目錄進行掃毒,可以在執行 clamscan
時加上 -r
參數,即可遞迴掃描整個目錄與子目錄下的所有檔案。例如掃描 /home/ubuntu
目錄:
# 對 /home/ubuntu 目錄進行掃毒 clamscan -r /home/ubuntu
/home/ubuntu/tmp/zip/ar.zip: OK /home/ubuntu/tmp/zip/date2.txt: OK /home/ubuntu/tmp/zip/Health-02.zip: OK /home/ubuntu/tmp/zip/Health-01.zip: OK /home/ubuntu/tmp/zip/date.txt: OK ----------- SCAN SUMMARY ----------- Known viruses: 8540340 Engine version: 0.103.2 Scanned directories: 1 Scanned files: 5 Infected files: 0 Data scanned: 1.48 MB Data read: 85.50 MB (ratio 0.02:1) Time: 16.097 sec (0 m 16 s) Start Date: 2021:06:18 21:21:38 End Date: 2021:06:18 21:21:54
--max-dir-recursion
參數可用來設定遞迴層數上限值:
# 設定遞迴層數上限為 6 clamscan -r --max-dir-recursion=6 /home/ubuntu
clamscan
在掃描檔案時,預設會顯示每一個檔案的檢查結果,若檔案正常就會顯示 OK
。若不想輸出大量 OK
的檔案資訊,可以加上 -o
參數:
# 對 /home/ubuntu 目錄進行掃毒,不顯示 OK 的檔案 clamscan -o -r /home/ubuntu
如果希望只顯示中毒的檔案,可以加上 -i
參數:
# 對 /home/ubuntu 目錄進行掃毒,只顯示中毒檔案 clamscan -i -r /home/ubuntu
clamscan
也可以對資料串流進行掃毒:
# 掃描資料串流
cat myfile | clamscan -
stdin: OK ----------- SCAN SUMMARY ----------- Known viruses: 8540340 Engine version: 0.103.2 Scanned directories: 0 Scanned files: 1 Infected files: 0 Data scanned: 0.13 MB Data read: 0.12 MB (ratio 1.03:1) Time: 14.812 sec (0 m 14 s) Start Date: 2021:06:19 05:50:41 End Date: 2021:06:19 05:50:56
若要對指定的檔案清單進行掃毒,可以使用 -f
參數來指定檔案清單。
先準備好檔案清單 filelist.txt
,格式為一行一個檔案,例如:
/home/ubuntu/file1.zip /home/officeguide/file2.docx /home/officeguide/file3.pptx
接著執行以下指令,對檔案清單內的檔案進行掃毒:
# 對檔案清單進行掃毒 clamscan -f filelist.txt
當 clamscan
偵測到中毒的檔案時,預設只會顯示訊息,不會刪除檔案,若要自動刪除感染病毒的檔案,可以加上 --remove
參數:
# 自動刪除中毒的檔案 clamscan -r --remove /home/ubuntu
使用 --remove
參數會有誤判的風險,如果怕誤刪檔案,可以改用 --move
參數將中毒的檔案搬移到指定的隔離目錄:
# 將中毒檔案搬移至 /home/clamav/virus 目錄 clamscan -r --move=/home/clamav/virus /home/ubuntu
另一種更保守的做法是只將中毒的檔案複製一份到指定的目錄,而不更動原始的檔案:
# 將中毒檔案複製一份至 /home/clamav/virus 目錄 clamscan -r --copy=/home/clamav/virus /home/ubuntu
若希望 clamscan
輸出較詳細的資訊,可以加上 -v
參數:
# 輸出詳細資訊 clamscan -v archive.zip
若希望 clamscan
不要輸出任何訊息,可以使用 --quiet
參數:
# 不要輸出任何訊息 clamscan --quiet archive.zip
若不要輸出最後的掃描結果報表,可以加上 --no-summary
參數:
# 不要輸出掃描結果報表 clamscan --no-summary archive.zip
clamscan
的 --max-scantime
參數可設定掃描單一檔案時間上限(單位為毫秒),預設值為 120000
(120 秒):
# 設定掃描時間上限為 60 秒 clamscan --max-scantime=60000 archive.zip
設定掃描時間上限是為了要預防 Zip 炸彈(zip bomb)攻擊。
clamscan
的 --max-filesize
參數可以設定掃描壓縮檔的檔案大小上限,若壓縮檔超過這個上限值,就會跳過,可用的單位為 K
與 M
。
# 設定掃描壓縮檔的檔案大小上限為 25 MB clamscan --max-filesize=25M archive.zip # 設定掃描壓縮檔的檔案大小上限為 512 KB clamscan --max-filesize=512K archive.zip
而 --max-scansize
參數則可設定壓縮檔本身的大小,再加上壓縮檔案內所有檔案的大小總和的上限值,可用的單位為 K
與 M
:
# 設定掃描壓縮檔與內部所有檔案大小總和上限為 100 MB clamscan --max-filesize=100M archive.zip
--max-files
參數可以設定一個壓縮檔內最多解開多少個檔案進行掃描:
# 設定一個壓縮檔內最多解開 10000 個檔案進行掃描 clamscan --max-files=10000 archive.zip
--max-recursion
參數可以設定壓縮檔內的遞迴層數上限值:
# 設定壓縮檔內的遞迴層數上限值為 16 clamscan --max-files=16 archive.zip
clamscan
傳回值clamscan
指令在掃描完成後,會依據掃描結果傳回不同的值:
傳回值 | 說明 |
---|---|
0 |
未發現病毒。 |
1 |
發現有檔案感染病毒。 |
2 |
掃描過程出現錯誤。 |
若在 bash shell 指令稿中,可以透過傳回值來判斷是否掃出病毒:
#!/bin/bash # 進行掃毒 clamscan archive.zip # 取得 clamscan 傳回值 val=$? # 判斷掃描結果 if [ "$val" = "0" ]; then echo "未發現病毒。" elif [ "$val" = "1" ]; then echo "發現有檔案感染病毒。" else echo "掃描過程出現錯誤。" fi
ClamAV 的病毒碼預設放在 /var/lib/clamav/daily.cvd
,我們可以使用 sigtool
檢視這個 cvd 檔案:
# 檢視 CVD 病毒碼檔案資訊 sigtool --info /var/lib/clamav/daily.cvd
File: /var/lib/clamav/daily.cvd Build time: 16 Jun 2021 07:07 -0400 Version: 26203 Signatures: 3989972 Functionality level: 63 Builder: raynman MD5: ad64e4b560ce5d89822e385f8054a084 Digital signature: VLGnREZF0DFxo2peO5hzFYRkraLYFaRsxrCdiyS4CFzfcM/PQlgDNQo0Yi0YyEZhaxQciNUYGLeiM2uc9hJHeP3987LTx6ZizZwih1MFKbCa1amOXUKRXAxLxnC/Q83pKRRnENAx5ZPj7H/Gla/v/h+xd8RtUwk8ylh7UqtASXe Verification OK.
如果想要測試 ClamAV 的掃毒功能,可以下載 EICAR 的測試病毒檔,或是自己建立一個包含以下字串的文字檔:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
這一串長度為 68 位元組的文字是 EICAR 所定義的測試病毒碼,當然它實際上並不是真正的病毒,是專門用於防毒軟體測試使用的檔案,任何檔案只要以這 68 個字元開頭,就會被支援 EICAR 測試病毒的防毒軟體視為病毒。
我們可以用以下指令快速測試 ClamAV 的掃毒功能:
# 建立 EICAR 測試病毒檔 cat > eicar.virus <<'EOF' X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* EOF # 測試 ClamAV 掃毒功能是否正常 clamscan eicar.virus
/home/ubuntu/eicar.virus: Eicar-Signature FOUND ----------- SCAN SUMMARY ----------- Known viruses: 8540340 Engine version: 0.103.2 Scanned directories: 0 Scanned files: 1 Infected files: 1 Data scanned: 0.00 MB Data read: 0.00 MB (ratio 0.00:1) Time: 15.196 sec (0 m 15 s) Start Date: 2021:06:19 15:17:21 End Date: 2021:06:19 15:17:36
除了 EICAR 的測試病毒檔之外,也可以使用 Ubuntu Linux 的 clamav-testfiles
套件所整理的測試檔案來測試掃毒功能:
# 安裝 clamav-testfiles 套件
sudo apt install clamav-testfiles
安裝好 clamav-testfiles
套件之後,就可以在 /usr/share/clamav-testfiles
目錄下看到各種類型的測試檔案了。
# 測試 ClamAV 掃毒功能是否正常
clamscan /usr/share/clamav-testfiles/clam.ppt
/usr/share/clamav-testfiles/clam.ppt: Clamav.Test.File-6 FOUND ----------- SCAN SUMMARY ----------- Known viruses: 8540743 Engine version: 0.103.2 Scanned directories: 0 Scanned files: 1 Infected files: 1 Data scanned: 0.00 MB Data read: 0.03 MB (ratio 0.00:1) Time: 15.451 sec (0 m 15 s) Start Date: 2021:06:19 20:52:05 End Date: 2021:06:19 20:52:21