ClamAV
Clam AntiVirus 是一个用于 UNIX 的开源 (GPL) 反病毒工具包。它提供了许多实用程序,包括灵活且可扩展的多线程守护进程、命令行扫描器和用于自动数据库更新的高级工具。由于 ClamAV 的主要用途是在文件/邮件服务器上,因此它主要通过其内置签名检测恶意软件,而不是传统的终端安全套件。
Linux 上反恶意软件产品的现状并不理想,原因有以下几个方面
- 种类有限:与 Windows 相比,Linux 的用户/客户端较少,导致公司开发 Linux 产品的兴趣有限。
- 自满情绪:许多人认为 Linux 本身是安全的,导致缺乏对恶意软件防护的意识和关注。这在主动防御机制中造成了差距。
- 功能缺失:现有工具通常缺乏 Windows 反恶意软件产品中常见的先进功能,使其在 Linux 上效果较差。
这种情况尤其糟糕,因为 Linux 上的恶意软件数量正在增加,同时由于基于 Linux 的服务器和 IoT 设备数量的增加,可能的攻击面也在扩大。
目前,在 Linux 上,为数不多且积极开发的反恶意软件解决方案之一是 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”的网络套接字来启用通过远程位置通信的可能性。
有关更多详细信息,请参阅
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 守护进程
如果您收到关于 clamd 的 AppArmor 拒绝,请将配置文件设置为仅投诉模式
# 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.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 守护进程
这将把所有病毒签名加载到 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 等自动化工具停止服务时,就需要它。
对于 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 文件
# 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