ClamAV

来自 ArchWiki

Clam AntiVirus 是一个用于 UNIX 的开源 (GPL) 反病毒工具包。它提供了许多实用程序,包括灵活且可扩展的多线程守护进程、命令行扫描器和用于自动数据库更新的高级工具。由于 ClamAV 的主要用途是在文件/邮件服务器上,因此它主要通过其内置签名检测恶意软件,而不是传统的终端安全套件。

Linux 上反恶意软件产品的现状并不理想,原因有以下几个方面

  1. 种类有限:与 Windows 相比,Linux 的用户/客户端较少,导致公司开发 Linux 产品的兴趣有限。
  2. 自满情绪:许多人认为 Linux 本身是安全的,导致缺乏对恶意软件防护的意识和关注。这在主动防御机制中造成了差距。
  3. 功能缺失:现有工具通常缺乏 Windows 反恶意软件产品中常见的先进功能,使其在 Linux 上效果较差。

这种情况尤其糟糕,因为 Linux 上的恶意软件数量正在增加,同时由于基于 Linux 的服务器和 IoT 设备数量的增加,可能的攻击面也在扩大。

目前,在 Linux 上,为数不多且积极开发的反恶意软件解决方案之一是 ClamAV。

安装

安装 clamav 软件包。

这将安装以下工具

clamd: ClamAV Daemon
clamonacc: On-Access real-time protection
clamdscan: A simple scanning client
clamdtop: A resource monitoring interface for clamd
freshclam: Daemon for virus signature updates
clamconf: Tool to create and check configuration files

所有 ClamAV 相关工具、服务和守护进程都通过套接字与 clamd 通信。

默认情况下,这是通过配置并命名为“LocalSocket”的本地套接字完成的。

ClamAV 还提供了通过使用配置并命名为“TCPSocket”的网络套接字来启用通过远程位置通信的可能性。

警告: 请注意以下关于 clamd 端口安全的警告,当更改配置以使用 TCPSocket 而不是 LocalSocket 时。通常使用本地 unix 套接字,但请注意,此端口未经过身份验证或保护。

有关更多详细信息,请参阅

https://blog.clamav.net/2016/06/regarding-use-of-clamav-daemons-tcp.html

https://docs.clamav.net/manual/Usage/Scanning.html#clamd-v0101(守护进程,然后是 ClamD 部分)

另一个需要注意的重要事项是,当使用 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

按需扫描是实时保护守护进程,它将在读取、写入或执行文件时扫描该文件。它可以配置为在检测到威胁时通知或阻止/阻止。

按需扫描需要内核在编译时启用 fanotify 内核模块(内核 >= 3.8),这对于官方 Arch Linux 内核软件包来说是正确的。在启用按需扫描之前,请检查是否已启用 fanotify。您可以通过运行以下命令来检查是否已启用所需模块

$ zgrep FANOTIFY /proc/config.gz

OnAccessScan 的配置通过编辑 /etc/clamav/clamd.conf 配置文件完成。

以下更改是 OnAccessScan 工作所必需的

/etc/clamav/clamd.conf
# Exclude the UID of the scanner itself from checking, to prevent loops
OnAccessExcludeUname clamav

# WARNING: for security reasons, clamd should NEVER run as root.
# Previous instructions in this wiki included this line, remove it:
# User root    # REMOVE THIS
# Add this instead:
User 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 用户通过 sudo 以任何用户身份和自定义环境变量运行 notify-send

/etc/sudoers.d/clamav
clamav ALL = (ALL) NOPASSWD: SETENV: /usr/bin/notify-send

为警报创建通知弹出窗口

到目前为止,ClamAV 将静默记录任何检测,但不会向用户发出警报。可以添加弹出窗口以在检测到任何威胁时提醒用户。

首先,将以下行添加到您的 clamd 配置中

/etc/clamav/clamd.conf
VirusEvent /etc/clamav/virus-event.bash

接下来,创建文件 /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(始终以 root 身份运行)使用文件描述符传递。编辑 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 守护进程

如果您收到关于 clamdAppArmor 拒绝,请将配置文件设置为仅投诉模式

# 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

对于自动更新,首先创建并设置所需的 freshclam.log 文件

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 守护进程

这将把所有病毒签名加载到 RAM 中。截至 2024 年 2 月,这些签名至少需要 1.6GB 的可用 RAM。在定期更新签名期间,会短暂使用两倍的 RAM。

注意
  • 您需要在首次启动服务之前运行 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)。

最重要的是,Fangfrisch 永远不需要以 root 权限运行,这与 clamav-unofficial-sigs 不同。

通过运行以下命令创建数据库结构

# 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" # enter your receipt number here
malwarepatrol_product_code="8" # Use 8 if you have a Free account or 15 if you are a Premium customer.
malwarepatrol_list="clamav_basic" # clamav_basic or clamav_ext
malwarepatrol_free="yes" # Set to yes if you have a Free account or no if you are a Premium customer.

来源:https://www.malwarepatrol.net/clamav-configuration-guide/

扫描病毒

有两种按需扫描选项

使用独立扫描器

clamscan 可用于扫描特定文件、主目录或整个系统

$ clamscan myfile
$ clamscan --recursive --infected /home/archie
# clamscan --recursive --infected --exclude-dir='^/sys|^/dev' /

如果您希望 clamscan 删除受感染的文件,请在命令中添加 --remove 选项,或者您可以使用 --move=/dir 将它们隔离。

您可能还希望 clamscan 扫描更大的文件。在这种情况下,请将选项 --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

[Service]
Type=forking
ExecStart=/usr/bin/clamav-milter --config-file /etc/clamav/clamav-milter.conf
Restart=Always

[Install]
WantedBy=multi-user.target

您的系统可能需要不同的 Restart= 指令。例如,当 logrotate 等自动化工具停止服务时,就需要它。

启用启动 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 线程。在时间不重要或您不希望计算机变得迟缓的情况下,这可能是可以接受的。如果需要快速扫描大型目录或 USB 驱动器,您可能希望使用所有可用的 CPU 来加快处理速度。

clamscan 被设计为单线程的,因此可以使用 xargs 并行运行扫描

$ find /home/archie -type f -print0 | xargs -0 -P $(nproc) clamscan

在此示例中,xargs-P 参数在与 CPU 数量(由 nproc 报告)相同的进程中同时运行 clamscan--max-lines--max-args 选项将允许更精细地控制跨线程的批处理工作负载。

这将消耗大量 RAM,因为所有进程都是独立的,并且将加载签名文件。单个线程将消耗大约 1G(或更多)的 RAM,并且可能会使您的计算机挂起,除非 OOM 足够智能。您可能需要考虑改用 clamdscan。

使用 clamdscan

如果您已经运行了 clamd 守护进程,则可以改用 clamdscan(请参阅 #启动 ClamAV + OnAccessScanning 守护进程

$ clamdscan --multiscan --fdpass /home/archie

在这里,--multiscan 参数使 clamd 能够使用可用线程并行扫描目录内容。 --fdpass 参数是必需的,以便将文件描述符权限传递给 clamd,因为守护进程在 clamav 用户和组下运行。

clamdscan 可用线程的数量在 /etc/clamav/clamd.conf 中通过 MaxThreads 参数确定 clamd.conf(5)。即使您可能会看到指定的 MaxThreads 数量超过一个(当前默认值为 10),但当您从命令行启动使用 clamdscan 的扫描并且未指定 --multiscan 选项时,只有一个有效的 CPU 线程将用于扫描。

启用 TCPSocket

如果您在 /etc/clamav/clamd.conf 中启用 TCPSocket,则还必须编辑 clamav-daemon.socket(请参阅 FS#57669)。 systemd 套接字文件需要配置匹配的端口和 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 以查看绑定在 TCP 端口 3310 的 Clamd

# 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) 的读取权限

错误:Clamd 未被通知

如果在运行 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

错误:未找到受支持的数据库文件

如果在启动守护进程时遇到以下错误

LibClamAV Error: cli_loaddb(): No supported database files found
in /var/lib/clamav ERROR: Not supported data format

发生这种情况的原因是 /etc/clamav/freshclam.conf 设置 DatabaseDirectory/etc/clamav/clamd.conf 设置 DatabaseDirectory 之间不匹配。 /etc/clamav/freshclam.conf 指向 /var/lib/clamav,但 /etc/clamav/clamd.conf(默认目录)指向 /usr/share/clamav 或其他目录。在 /etc/clamav/clamd.conf 中编辑并替换为与 /etc/clamav/freshclam.conf 中相同的 DatabaseDirectory。之后,clamav 将成功启动。

错误:无法创建临时目录

如果您收到以下错误,以及包含 UID 和 GID 号码的“提示”

# can't create temporary directory

更正权限

# chown UID:GID /var/lib/clamav && chmod 755 /var/lib/clamav

参见