Clam AntiVirus 是一款 UNIX 下開源的 (GPL) 反病毒工具包。它提供了包括一個靈活且可擴展的多線程守護進程,一個命令行掃描程序及用於自動更新資料庫的高級工具在內的多個實用程序。ClamAV 主要用被在文件和郵件伺服器上,它通過內置的特徵庫來檢測惡意軟體,且不能被當作傳統的終端安全套件來使用。
由於多重原因,Linux 反惡意軟體產品的現狀並不理想:
- 使用有限:和 Windows 相比,Linux 的用戶和終端數較少,導致公司不願為 Linux 平台開發產品。
- 安於現狀:很多人認為 Linux 本身就是安全的,導致缺乏惡意軟體防護的意識。這也導致主動防禦機制上的空缺。
- 缺乏功能:現有工具往往缺乏 Windows 反惡意軟體產品中常見的一些高級功能,因此在 Linux 上的效果較差。
由於基於 Linux 的伺服器和物聯網設備數量不斷增加,Linux 上的惡意軟體數量也在不斷增加,可能的攻擊面也在不斷擴大,因此這種情況尤為糟糕。
ClamAV 是當前 Linux 上為數不多的,且積極開發中的反惡意軟體解決方案之一。
安裝
該操作將安裝以下工具:
clamd:ClamAV 守护进程 clamonacc:访问实时保护 clamdscan:一个简易的扫描客户端 clamdtop:针对 clamd 的资源监控界面 freshclam:特征库更新守护进程 clamconf:用于创建和检查配置文件的工具
所有 ClamAV 相關的工具、服務和守護進程都通過套接字與 clamd 進行通信。
默認情況下,這是通過一個名為「LocalSocket」的本地套接字完成的。
ClamAV 還提供了通過使用網絡套接字進行遠程通信的功能,該套接字名為「TCPSocket」。
更多信息請參考:
https://blog.clamav.net/2016/06/regarding-use-of-clamav-daemons-tcp.html
https://docs.clamav.net/manual/Usage/Scanning.html#clamd-v0101 (Daemon and then ClamD section)另一個需要注意的問題是,在使用 LocalSocket 時,clamd 需要在一個有權限掃描受監控文件的用戶下運行。
配置
正常情況下應已有默認配置文件,否則可以通過 clamconf 手動進行生成:
# clamconf -g freshclam.conf > freshclam.conf # clamconf -g clamd.conf > clamd.conf # clamconf -g clamav-milter.conf > clamav-milter.conf
下列文件中包含了對應的配置項:
- freshclam:
/etc/clamav/freshclam.conf
- clamd:
/etc/clamav/clamd.conf
- clamd 郵件過濾:
/etc/clamav/clamav-milter.conf
另外,你可以通過執行 clamconf
來檢查配置文件是否可用。
默認安裝方式將創建正常的默認配置,如 clamav 用戶/用戶組和所需的 clamd 配置。
還可以設置其它建議配置:
/etc/clamav/clamd.conf
# Log time with each message. # Default: no LogTime yes # Log additional information about the infected file, such as its # size and hash, together with the virus name. ExtendedDetectionInfo yes # Run as another user (clamd must be started by root for this option to work) # Default: don't drop privileges User clamav # Maximum depth directories are scanned at. # Default: 15 MaxDirectoryRecursion 20 DetectPUA yes HeuristicAlerts yes ScanPE yes ScanELF yes ScanOLE2 yes ScanPDF yes ScanSWF yes ScanXMLDOCS yes ScanHWP3 yes ScanOneNote yes ScanMail yes ScanHTML yes ScanArchive yes Bytecode yes AlertBrokenExecutables yes AlertBrokenMedia yes AlertEncrypted yes AlertEncryptedArchive yes AlertEncryptedDoc yes AlertOLE2Macros yes AlertPartitionIntersection yes
啟用實時保護(訪問時掃描,OnAccessScan)
訪問時掃描是一個實時保護守護進程,會在讀取/寫入或執行文件時對其進行掃描。它可被配置為在檢測到問題時發出提示或進行屏蔽。
可以通過編輯 /etc/clamav/clamd.conf
來配置訪問時掃描;使用該訪問時掃描需要進行以下更改:
/etc/clamav/clamd.conf
# Exclude the UID of the scanner itself from checking, to prevent loops OnAccessExcludeUname clamav
建議進行以下更改將將訪問時掃描器設為僅提醒模式:
/etc/clamav/clamd.conf
# Set the mount point where to recursively perform the scan, # this could be every path or multiple path (one line for path) OnAccessMountPath / # Alternatively, add some directories instead of mount points # OnAccessIncludePath /home # Prevention doesn't work with OnAccessMountPath. # It works with OnAccessIncludePath, as long as /usr and /etc are not included. # Including /var while activating prevention is also not recommended, because # this would slow down package installation by a factor of 1000. OnAccessPrevention no # Perform scans on newly created, moved, or renamed files OnAccessExtraScanning yes # Optionallyexclude root-owned processes # OnAccessExcludeRootUID true
為警報彈出通知提醒
目前為止,ClamAV 會靜默記錄所有檢測結果,但不會通知用戶。可以通過下面的操作在檢測到問題時提醒用戶。
首先,在 clamd 配置中添加一行:
/etc/clamav/clamd.conf
VirusEvent /etc/clamav/virus-event.bash
接下來,允許 clamav 用戶通過 sudo 以任何帶有自定義環境變量的用戶身份運行 notify-send:
/etc/sudoers.d/clamav
clamav ALL = (ALL) NOPASSWD: SETENV: /usr/bin/notify-send
然後創建 /etc/clamav/virus-event.bash
文件,添加以下內容並將其設為可執行:
/etc/clamav/virus-event.bash
#!/bin/bash PATH=/usr/bin ALERT="Signature detected by clamav: $CLAM_VIRUSEVENT_VIRUSNAME in $CLAM_VIRUSEVENT_FILENAME" # Send an alert to all graphical users. for ADDRESS in /run/user/*; do USERID=${ADDRESS#/run/user/} /usr/bin/sudo -u "#$USERID" DBUS_SESSION_BUS_ADDRESS="unix:path=$ADDRESS/bus" PATH=${PATH} \ /usr/bin/notify-send -w -u critical -i dialog-warning "Virus found!" "$ALERT" done
該文件使你可以自定義 clamd 訪問時掃描服務檢測到問題時彈出的消息內容。
默認情況下,clamonacc 會將剛訪問的文件名稱傳遞給 clamav 進行掃描。問題是,如果 clamav 用戶無法訪問對應的文件,就不能使用該方式進行掃描。作為替代,可以讓 clamonacc(其始終以根用戶權限運行)傳遞文件描述符。參考以下內容編輯 clamav-clamonacc.service
:
[Service] ExecStart= ExecStart=/usr/sbin/clamonacc -F --fdpass --log=/var/log/clamav/clamonacc.log
最後,啟動/啟用或重啟 clamav-clamonacc.service
和 clamav-daemon.service
。
參考:#啟動 ClamAV + OnAccessScanning 守護進程
如果 AppArmor 拒絕了 clamd,可以將其設為 complain 模式:
# aa-complain clamd
更新病毒庫
通過下列命令更新病毒庫:
# freshclam
如果你處於代理後,需編輯 /etc/clamav/freshclam.conf
並更新 HTTPProxyServer,HTTPProxyPort,HTTPProxyUsername 和 HTTPProxyPassword 的信息。
病毒庫保存在下列文件中:
/var/lib/clamav/daily.cld /var/lib/clamav/main.cld /var/lib/clamav/bytecode.cvd
For automatic updates first create and set the requires freshclam.log file:
touch /var/log/clamav/freshclam.log chmod 600 /var/log/clamav/freshclam.log chown clamav /var/log/clamav/freshclam.log
啟動/啟用 clamav-freshclam.service
或 clamav-freshclam-once.timer
來保持病毒庫為最新。
clamav-freshclam.service
將啟動 freshclam
為守護進程模式,默認每天進行 12 次檢查(每 2 小時一次)。檢查頻率可以在 /etc/clamav/freshclam.conf
中進行修改。
clamav-freshclam-once.timer
將啟動 freshclam
為每天檢查一次。檢查頻率可在 /usr/lib/systemd/system/clamav-freshclam-once.timer
中進行修改。
- 以守護進程模式啟動的 freshclam 在每次啟動服務時會進行檢查。
- 每小時檢查超過 1 次將被 CDN 屏蔽 24 小時。
-
.timer
單元將遵循計劃配置,與設備重啟或服務重啟無關。 - 可參考 #添加更多病毒庫/特徵庫 一節添加病毒特徵資料庫
啟動 ClamAV + OnAccessScanning 守護進程
該操作將把所有病毒特徵加載到內存中。以 2024 年 2 月為例,這些特徵共將占用至少 1.6GB 內存空間。在定期更新特徵時,將短時占用多一倍的內存空間。
- 在首次啟動服務前需要先運行
freshclam
,否則將出現報錯,並無法正常啟動 ClamAV。 - 如果你只需要使用獨立掃描器進行掃描,就無需啟動守護進程。更多信息可參考下方的掃描病毒部分。
- 如果沒有啟用訪問時掃描,那守護進程不會進行任何操作,詳細信息請參考 #啟用實時保護(訪問時掃描,OnAccessScan)
對應的服務是 clamav-daemon.service
。啟動它並啟用使它自動在啟動時運行。
另外請啟動並啟用 clamav-clamonacc.service
以開啟實時訪問保護。
測試
為了確保 ClamAV 和定義安裝正確,請使用 clamscan 掃描 EICAR 測試文件(無病毒代碼的無害簽名)。
$ curl https://secure.eicar.org/eicar.com.txt | clamscan -
輸出必須包括
stdin: Win.Test.EICAR_HDB-1 FOUND
實時防護
您可以下載 eicar 文件並保存在您配置 clamonacc 監控的目錄中。例如:
$ cd /home/user/Downloads/ $ wget https://secure.eicar.org/eicar.com.txt $ cat eicar.com.txt
添加更多病毒庫/特徵庫
ClamAV 可以使用來自其他存儲庫或安全廠商的病毒/特徵庫。
可通過安裝 clamav-unofficial-sigsAUR(參見 GitHub 描述)或是 python-fangfrischAUR(參見線上文檔)來添加最重要的部分。兩者都會添加來自如 MalwarePatrol,SecuriteInfo,Yara,Linux Malware Detect 等著名供應商的特徵/病毒庫。
clamav-freshclam.service
才能從 ClamAV 鏡像更新官方特徵信息。選項 #1:配置 Fangfrisch
Fangfrisch 在設計上目標成為更安全,靈活和方便的 clamav-unofficial-sigs 替代品,且無需太多配置(/etc/fangfrisch/fangfrisch.conf
)。
最重要的是,與 clamav-unofficial-sigs 不同,Fangfrisch 用不需要以 root 權限運行
通過以下命令創建庫結構:
# sudo -u clamav /usr/bin/fangfrisch --conf /etc/fangfrisch/fangfrisch.conf initdb
啟用 fangfrisch.timer
(系統層級)。
選項 #2:配置 clamav-unofficial-sigs
啟用 clamav-unofficial-sigs.timer
。
這將根據 /etc/clamav-unofficial-sigs
目錄下的配置文件信息定期更新非官方特徵信息。
可通過如下方法手動更新特徵:
# clamav-unofficial-sigs.sh
可參考 /etc/clamav-unofficial-sigs/user.conf
來修改默認設置。
MalwarePatrol 病毒庫
如果你想使用 MalwarePatrol 病毒庫,需要先在 https://malwareblocklist.org 註冊帳號(需付費)。
在 /etc/clamav-unofficial-sigs/user.conf
中,修改以下內容來啟用該功能:
malwarepatrol_receipt_code="YOUR-RECEIPT-NUMBER" # 输入收据编号 malwarepatrol_product_code="8" # 免费账号设为 8,高级客户设为 15 malwarepatrol_list="clamav_basic" # clamav_basic 或是 clamav_ext malwarepatrol_free="yes" # 免费账号设为 yes,高级客户设为 no
來源:https://www.malwarepatrol.net/clamav-configuration-guide/
掃描病毒
有兩種方法進行按需掃描:
使用獨立掃描器
clamscan
可用以掃描文件, 用戶目錄亦或是整個系統:
$ clamscan myfile $ clamscan --recursive --infected /home/archie # clamscan --recursive --infected --exclude-dir='^/sys|^/dev' /
- 如果希望
clamscan
刪除感染的文件,請使用--remove
參數。 - 使用
-l path/to/file
參數可以將clamscan
的日誌寫入 log 文件。
如果希望 clamscan
刪除感染的文件,請使用 --remove
參數,也可以使用 --move=/dir
來隔離文件。
你可能會想要 clamscan
掃描大文件,在這一情況下,可將 {{ic|1=--max-filesize=4000M} 和 --max-scansize=4000M
添加到命令中。'4000M' 指的是最大值,可按需降低。
-l /path/to/file
選項將把 clamscan
的日誌輸出為文本文件,方便定位受感染文件。
使用守護進程
clamdscan
與上一選項類似,但使用了守護進程,因此必須要守護進程運行中才能使用。由於守護進程會讀取 /etc/clamav/clamd.conf
中指定的配置,大多數選項都將被忽略。
使用 milter
Milter 會檢查 sendmail 伺服器中的郵件是否含有病毒。根據需要編輯 /etc/clamav/clamav-milter.conf
,例如:
/etc/clamav/clamav-milter.conf
MilterSocket /tmp/clamav-milter.socket MilterSocketMode 660 FixStaleSocket yes User clamav MilterSocketGroup clamav PidFile /run/clamav/clamav-milter.pid TemporaryDirectory /tmp ClamdSocket unix:/run/clamav/clamd.ctl LogSyslog yes LogInfected Basic
創建 /etc/systemd/system/clamav-milter.service
:
/etc/systemd/system/clamav-milter.service
[Unit] Description='ClamAV Milter' After=clamav-daemon.service Restart=Always [Service] Type=forking ExecStart=/usr/bin/clamav-milter --config-file /etc/clamav/clamav-milter.conf [Install] WantedBy=multi-user.target
如需使用如 logrotate 等自動化程序停止服務,可能會需要不同的 Restart=
配置。
對於 Postfix,將以下內容添加到 /etc/postfix/main.cf
:
/etc/postfix/main.cf
smtpd_milters = unix:/tmp/clamav-milter.socket milter_default_action = tempfail
檢查 journalctl 來確認 postfix 對 clamav-milter.socket
的訪問權限是否正常。如有問題,請將 postfix 添加到 clamav
組中。
小貼士
使用多線程運行
使用 clamscan
通過命令行使用 clamscan
掃描文件或文件夾時只會使用單 CPU 線程。如果不考慮時間或者希望電腦不卡,就沒什麼大問題。但如果你要掃描大型目錄,或者需要快速掃描 U 盤,就最好使用全部 CPU 核心來加速進程。
clamscan
設計上為單線程,因此可以使用 xargs
進行多線程掃描:
$ find /home/archie -type f -print0 | xargs -0 -P $(nproc) clamscan
在這一例子中,xargs
的 -P
參數同時調用了儘可能多的 CPU 核心(數量由 nproc
提供)。--max-lines
和 --max-args
參數可以更精細地調整線程間的負載分配。
因為每個進程都是獨立的,且都會單獨加載特徵文件,所以該操作會消耗大量內存。單個線程會消耗大概 1G 或以上的內存,且可能會由於內存不足(OOM)導致系統卡住。可以考慮使用 clamdscan。
使用 clamdscan
如果你已經啟動了 clamd
守護進程,可以使用 clamdscan
(參考 #啟動 ClamAV + OnAccessScanning 守護進程):
$ clamdscan --multiscan --fdpass /home/archie
其中 --multiscan
參數會讓 clamd
使用可用線程並行掃描文件夾中的內容。由於守護進程是以 clamav
用戶和用戶組身份運行的,因此必須使用 --fdpass
參數將文件描述符權限傳遞給 clamd
。
clamdscan
的可用線程數是由 /etc/clamav/clamd.conf
中的 MaxThreads
參數決定的(默認為 10)clamd.conf(5)。只有在指定了 --multiscan
選項時,clamdscan
才會使用多線程掃描,否則將保持使用單線程。
啟用 TCPSocket
如果你在 /etc/clamav/clamd.conf
中啟用了 TCPSocket,需要一併編輯 clamav-daemon.socket
(參考 FS#57669),將 systemd socket 文件中的配置改為對應的 IP 地址和埠:
/etc/systemd/system/clamav-daemon.socket.d/override.conf
[Socket] ListenStream= ListenStream=/run/clamav/clamd.ctl ListenStream=127.0.0.1:3310
最後重啟 clamav-daemon.socket
,就能看到 Clamd 綁定到了 TCP 3310 埠:
# ss -tulpn | grep clamd
tcp LISTEN 0 4096 127.0.0.1:3310 0.0.0.0:* users:(("clamd",pid=599,fd=4),("systemd",pid=1,fd=44))
疑難解答
clamscan
的用戶擁有病毒庫文件(/var/lib/clamav/*.c?d
)的讀取權限。Error: Clamd was NOT notified
如果你在運行 freshclam 命令之後出現下列信息:
WARNING: Clamd was NOT notified: Cannot connect to clamd through /var/lib/clamav/clamd.sock connect(): No such file or directory
為 clamav 添加一個 sock 文件:
# touch /run/clamav/clamd.ctl # chown clamav:clamav /run/clamav/clamd.ctl
然後, 編輯 /etc/clamav/clamd.conf
,去掉該行注釋:
LocalSocket /run/clamav/clamd.ctl
保存文件並重啟 clamav-daemon.service
。
Error: No supported database files found
當啟動守護進程時出現下列錯誤信息:
LibClamAV Error: cli_loaddb(): No supported database files found in /var/lib/clamav ERROR: Not supported data format
這意味著 /etc/clamav/clamd.conf
中的 DatabaseDirectory
設置與 /etc/clamav/freshclam.conf
中的 DatabaseDirectory
設置不匹配。/etc/clamav/freshclam.conf
指向了 /var/lib/clamav
,而 /etc/clamav/clamd.conf
指向了 /usr/share/clamav
(默認)或其它目錄。你需要編輯 /etc/clamav/clamd.conf
,將其中的 DatabaseDirectory
改為與 /etc/clamav/freshclam.conf
一致,之後就能正常啟動 clamav 了。
Error: Can't create temporary directory
如果提示如下錯誤並給出包含 UID 和 GID 的提示,
# can't create temporary directory
請修改權限:
# chown UID:GID /var/lib/clamav && chmod 755 /var/lib/clamav