ClamAV - Arch Linux 中文维基

跳至內容

# ClamAV

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 ClamAV，最近一次同步於 2025-05-01，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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

啟用並啟動 `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

## 參考

- Wikipedia:ClamAV

分類：​

- 安全

ClamAV
新增話題