跳至內容
出自 Arch Linux 中文维基

Clam AntiVirus 是一款 UNIX 下開源的 (GPL) 反病毒工具包。它提供了包括一個靈活且可擴展的多線程守護進程,一個命令行掃描程序及用於自動更新資料庫的高級工具在內的多個實用程序。ClamAV 主要用被在文件和郵件伺服器上,它通過內置的特徵庫來檢測惡意軟體,且不能被當作傳統的終端安全套件來使用。

由於多重原因,Linux 反惡意軟體產品的現狀並不理想:

  1. 使用有限:和 Windows 相比,Linux 的用戶和終端數較少,導致公司不願為 Linux 平台開發產品。
  2. 安於現狀:很多人認為 Linux 本身就是安全的,導致缺乏惡意軟體防護的意識。這也導致主動防禦機制上的空缺。
  3. 缺乏功能:現有工具往往缺乏 Windows 反惡意軟體產品中常見的一些高級功能,因此在 Linux 上的效果較差。

由於基於 Linux 的伺服器和物聯網設備數量不斷增加,Linux 上的惡意軟體數量也在不斷增加,可能的攻擊面也在不斷擴大,因此這種情況尤為糟糕。

ClamAV 是當前 Linux 上為數不多的,且積極開發中的反惡意軟體解決方案之一。

安裝

安裝 clamav 軟體包。

該操作將安裝以下工具:

clamd:ClamAV 守护进程
clamonacc:访问实时保护
clamdscan:一个简易的扫描客户端
clamdtop:针对 clamd 的资源监控界面
freshclam:特征库更新守护进程
clamconf:用于创建和检查配置文件的工具

所有 ClamAV 相關的工具、服務和守護進程都通過套接字與 clamd 進行通信。

默認情況下,這是通過一個名為「LocalSocket」的本地套接字完成的。

ClamAV 還提供了通過使用網絡套接字進行遠程通信的功能,該套接字名為「TCPSocket」。

警告:在 LocalSocket 改為使用 TCPSocket 時,請注意與 clamd 埠安全相關的警告。通常來說會使用本地 unix 套接字,但請注意該埠未經驗證或保護。

更多信息請參考:

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.serviceclamav-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.serviceclamav-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= 配置。

啟用啟動 clamav-milter.service

對於 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 文件:

警告:參考 #安裝 中的警告了解 clamd 埠安全的相關信息:
# 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

參考