15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
24.10.2024

如何在Linux上安装ClamAV:完整技术指南

ClamAV 是一款由 Cisco Talos 维护的开源跨平台防病毒引擎,可检测病毒、木马、rootkit、恶意软件及其他恶意威胁。它采用基于特征的检测模型,并由持续更新的数据库(/var/lib/clamav/)提供支持,是 Linux 服务器、邮件网关和 Web 托管环境的事实标准防病毒解决方案。

本指南涵盖完整的安装生命周期:系统准备、各主流发行版的软件包安装、使用 freshclam 进行病毒数据库管理、守护进程配置、扫描策略、隔离处理、cron 自动化,以及通过 clamonacc 实现实时扫描——包括大多数教程所忽略的生产级注意事项。

为什么 ClamAV 在 Linux 服务器上至关重要

Linux 系统并非对恶意软件免疫。虽然针对 Linux 的漏洞利用比 Windows 威胁少见,但运行 Web 应用程序、邮件中继或文件共享服务的服务器是恶意软件传播的活跃载体——即使 Linux 主机本身并非主要攻击目标。受感染的 VPS 托管环境可能在用户不知情的情况下向终端用户重新分发受感染文件、触发垃圾邮件数据库的黑名单,或成为更大攻击链中的跳板。

ClamAV 通过以下方式解决这些问题:

  • 按需扫描——用于计划或触发式分析
  • 守护进程模式扫描clamd)——用于高吞吐量、低延迟检查
  • 邮件网关集成——通过 clamsmtpamavisd-newMilter
  • 实时文件系统监控——通过 clamonacc(Linux 内核 fanotify
  • 字节码特征——用于超越静态模式匹配的启发式检测

第一步:准备并更新系统

在安装任何软件包之前,请同步软件包索引并应用待处理的安全补丁。在安全工具旁运行过时的系统库会产生虚假的安全感。

适用于 Debian/Ubuntu:

sudo apt update && sudo apt upgrade -y

适用于 CentOS/RHEL 7:

sudo yum update -y

适用于 Rocky Linux / AlmaLinux / RHEL 8+:

sudo dnf update -y

适用于 Fedora:

sudo dnf update -y

请确认您的内核和 glibc 版本是最新的,因为 clamonacc(实时扫描)需要内核 5.1+ 才能稳定支持 fanotify

第二步:安装 ClamAV

ClamAV 在所有主流发行版的默认软件仓库中均可获取。关键区别在于您是仅安装扫描器(clamav),还是同时安装后台守护进程(clamav-daemon / clamd)——对于任何生产服务器,强烈建议安装守护进程。

适用于 Debian/Ubuntu:

sudo apt install clamav clamav-daemon -y
  • clamav — 安装 clamscanfreshclam
clamav-daemon — 安装 clamd,这是将病毒数据库常驻内存的持久扫描守护进程,可大幅降低每次扫描的开销

适用于 CentOS/RHEL 7(需要 EPEL):
sudo yum install epel-release -y
sudo yum install clamav clamav-update clamav-scanner-systemd clamd -y
适用于 Rocky Linux / AlmaLinux / RHEL 8+(需要 EPEL):
sudo dnf install epel-release -y
sudo dnf install clamav clamav-update clamd -y
适用于 Fedora:
sudo dnf install clamav clamav-update clamd -y
安装后需验证的二进制文件位置:




二进制文件
路径
用途




clamscan
/usr/bin/clamscan
按需 CLI 扫描器


clamd
/usr/sbin/clamd
后台扫描守护进程


freshclam
/usr/bin/freshclam
病毒数据库更新程序


clamdscan
/usr/bin/clamdscan
委托给 clamd 的客户端


clamonacc
/usr/sbin/clamonacc
实时访问扫描器




第三步:更新病毒特征数据库
ClamAV 的检测能力完全取决于其特征数据库的时效性。数据库位于 /var/lib/clamav/,由以下几个文件组成:main.cvd、daily.cvd(或 .cld)和 bytecode.cvd。
首次更新前停止守护进程(Debian/Ubuntu)
在 Debian/Ubuntu 系统上,clamav-freshclam.service 会在安装后自动运行并锁定数据库目录。如果您在此服务运行时尝试手动运行 freshclam,将会遇到锁冲突。请先停止该服务:
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam
在 CentOS/RHEL/Rocky/Alma 上:
sudo freshclam
成功更新后的预期输出:
ClamAV update process started at ...
daily.cvd updated (version: 27xxx, sigs: xxxxxxx, ...)
main.cvd is up to date
bytecode.cvd is up to date
配置自动数据库更新
freshclam 由 /etc/clamav/freshclam.conf 控制。需要检查的关键指令:
sudo nano /etc/clamav/freshclam.conf
关键参数:

Checks 24 — 每天的更新检查次数(某些发行版默认为 12)
DatabaseMirror database.clamav.net — 官方镜像;除非使用私有镜像,否则不要更改
NotifyClamd /etc/clamav/clamd.conf — 指示 freshclam 在更新后向 clamd 发送信号,使守护进程无需重启即可重新加载特征

第四步:配置并启动 ClamAV 守护进程
clamd 守护进程将完整的病毒数据库常驻于 RAM 中(通常为 500 MB–1.2 GB,具体取决于数据库版本)。这消除了 clamscan 多秒的启动开销,使其对于任何频繁或并发扫描的环境都至关重要。
Debian/Ubuntu
sudo systemctl start clamav-daemon
sudo systemctl enable clamav-daemon
sudo systemctl status clamav-daemon
CentOS/RHEL 7
在 RHEL 7 上,服务单元名为 clamd@scan,引用配置文件 /etc/clamd.d/scan.conf:
sudo systemctl start clamd@scan
sudo systemctl enable clamd@scan
Rocky Linux / AlmaLinux / RHEL 8+
sudo systemctl start clamd@scan
sudo systemctl enable clamd@scan
clamd.conf 关键参数
守护进程配置位于 /etc/clamav/clamd.conf(Debian/Ubuntu)或 /etc/clamd.d/scan.conf(RHEL 系列)。请检查以下指令:
sudo nano /etc/clamav/clamd.conf
重要设置:

LocalSocket /run/clamav/clamd.ctl — clamdscan 使用的 Unix 套接字路径;确保与客户端配置一致
MaxFileSize 100M — 要扫描的最大文件大小;对于处理大型附件的邮件服务器,请适当增大
MaxScanSize 400M — 解压后每个文件的最大扫描数据量
StreamMaxLength 100M — 与基于 milter/stream 的扫描相关
User clamav — 守护进程以 clamav 用户身份运行;确保该用户对您要扫描的目录具有读取权限
LogFile /var/log/clamav/clamd.log — 启用持久日志记录以便审计追踪

关键注意事项:如果 clamd 以 clamav 用户身份运行,而您扫描 /home/user/uploads/,则 clamav 用户必须对该路径具有读取权限。忽略此点将导致静默扫描失败——clamd 将在其日志中报告”Access denied”错误,而非返回干净/感染的判定结果。
第五步:使用 clamscan 和 clamdscan 运行扫描
使用 clamscan 进行按需扫描
clamscan 是独立扫描器。每次调用时都从磁盘加载数据库,速度较慢,但不依赖守护进程。
递归扫描指定目录:
clamscan -r /path/to/directory
扫描并仅显示受感染文件:
clamscan -r --infected /path/to/directory
详细输出扫描并记录结果:
sudo clamscan -r --infected --log=/var/log/clamav/manual_scan.log /var/www/html
将受感染文件移至隔离目录:
sudo clamscan -r --move=/var/quarantine /path/to/directory
自动删除受感染文件(在生产环境中请谨慎使用):
sudo clamscan -r --remove /path/to/directory
扫描整个文件系统(在大型磁盘上预计运行时间较长):
sudo clamscan -r --infected --exclude-dir="^/sys" --exclude-dir="^/proc" --exclude-dir="^/dev" /
必须排除 /sys、/proc 和 /dev——扫描这些伪文件系统会产生误报错误并可能导致挂起。
使用 clamdscan 进行高性能扫描
当 clamd 运行时,请使用 clamdscan 代替 clamscan。它通过 Unix 套接字将扫描请求提交给已加载的守护进程,对于重复或批量扫描,速度可提升数个数量级。
clamdscan --fdpass /path/to/directory
--fdpass 标志将文件描述符直接传递给 clamd,绕过了守护进程用户无法直接读取目标路径时产生的权限问题。
使用 clamdscan 进行多线程扫描:
clamdscan --multiscan --fdpass /var/www/html
--multiscan 指示 clamd 使用其线程池并行扫描文件,在多核系统上可显著缩短实际耗时。
clamscan 与 clamdscan:性能对比




属性
`clamscan`
`clamdscan`




每次扫描加载数据库
是(启动慢)
否(守护进程将数据库保留在 RAM 中)


典型启动时间
5–30 秒
不到 1 秒


需要 clamd 运行
否
是


并行扫描
否
是(--multiscan)


最佳使用场景
一次性手动扫描
自动化、频繁或批量扫描


权限模型
以调用用户身份运行
以 clamav 用户身份运行(使用 --fdpass)




第六步:使用 Cron 自动化扫描
为实现持续保护,请使用 cron 安排定期扫描。以下示例每天凌晨 02:00 扫描 Web 根目录并记录带时间戳的结果。
sudo crontab -e
添加以下条目:
0 2 * * * /usr/bin/clamdscan --multiscan --fdpass --log=/var/log/clamav/daily_scan_$(date +%Y%m%d).log /var/www/html
带感染邮件告警的生产级 cron:
0 2 * * * /usr/bin/clamscan -r --infected /var/www/html 2>&1 | grep -v "^$" | mail -s "ClamAV Daily Scan Report - $(hostname)" admin@yourdomain.com
这将非空输出直接通过管道发送给邮件收件人,确保仅在发现问题或发生错误时才收到告警。请确保服务器上已配置 mailutils 或 postfix。
轮转扫描日志以防止磁盘无限增长:
sudo nano /etc/logrotate.d/clamav-scan
/var/log/clamav/daily_scan_*.log {
    weekly
    rotate 4
    compress
    missingok
    notifempty
}
第七步:使用 clamonacc 进行实时访问扫描
clamonacc 是 ClamAV 的访问扫描组件,在 ClamAV 0.102 中作为稳定功能引入。它挂钩到 Linux 内核的 fanotify 子系统,拦截文件打开和关闭事件,在文件被访问之前进行扫描。
要求:

Linux 内核 5.1 或更高版本(用于支持 FAN_OPEN_EXEC_PERM 的 fanotify)
ClamAV 0.102+
clamd 必须正在运行
Root 权限

在 clamd.conf 中启用访问扫描
sudo nano /etc/clamav/clamd.conf
添加或取消注释:
OnAccessIncludePath /home
OnAccessIncludePath /var/www/html
OnAccessPrevention yes
OnAccessExcludeUname clamav

OnAccessPrevention yes — 实时阻止对受感染文件的访问(拒绝模式);设置为 no 则为仅检测模式
OnAccessExcludeUname clamav — 防止 clamd 自身触发递归扫描循环

启动 clamonacc
sudo clamonacc --log=/var/log/clamav/clamonacc.log --daemonize
要将其作为 systemd 服务运行,请创建单元文件:
sudo nano /etc/systemd/system/clamonacc.service
[Unit]
Description=ClamAV On-Access Scanner
Requires=clamav-daemon.service
After=clamav-daemon.service

[Service]
Type=simple
ExecStart=/usr/sbin/clamonacc --log=/var/log/clamav/clamonacc.log --foreground
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now clamonacc
已知注意事项:在高吞吐量服务器上(例如繁忙的文件上传端点),OnAccessPrevention yes 可能引入可测量的 I/O 延迟。在生产环境中启用防护模式之前,请对您的工作负载进行基准测试。考虑将 OnAccessIncludePath 的范围限定在尽可能窄的必要路径,而非 / 等宽泛目录。
第八步:将 ClamAV 与邮件服务器集成
ClamAV 最广泛的生产用例是邮件网关扫描。如果您在 VPS 托管或独立服务器基础设施上运行邮件服务器,将 ClamAV 与您的 MTA 集成是关键的安全层。
常见集成方案:

Postfix + amavisd-new + ClamAV — amavisd-new 充当 Postfix 和 ClamAV 之间的内容过滤器,同时处理 SpamAssassin
Postfix + clamsmtp — 轻量级 milter 风格代理
Exim + ClamAV — 原生 Exim av_scanner 指令通过套接字直接支持 clamd

示例:clamd/etc/exim4/exim4.conf 中的 Exim 集成:

av_scanner = clamd:/run/clamav/clamd.ctl

这条单一指令在投递前将所有消息内容路由到正在运行的 clamd 实例。将此与适当的邮件托管配置配合使用,以确保您的邮件基础设施得到全面保护。

常见 ClamAV 问题排查

freshclam 失败并提示”locked by another process”

sudo systemctl stop clamav-freshclam
sudo rm -f /var/lock/clamav/freshclam.lock
sudo freshclam
sudo systemctl start clamav-freshclam

clamd 启动失败:”ERROR: Can’t open/parse the config file”

验证配置文件路径和语法:

sudo clamd --config-file=/etc/clamav/clamd.conf --debug 2>&1 | head -50

内存占用过高

clamd 在加载完整数据库后通常消耗 500 MB–1.2 GB 的 RAM。在内存受限的系统上,请考虑:

  • clamd.conf 中设置 MaxThreads 2 以限制并发数
  • 对于不频繁的扫描,使用不带守护进程的 clamscan
  • 升级到具有足够 RAM 的方案——运行 clamd 并搭配 Web 技术栈,至少需要 2 GB RAM 的 VPS 托管方案

扫描返回文件”Access denied”

clamd 守护进程以 clamav 用户身份运行。授予读取权限:

sudo setfacl -R -m u:clamav:rX /path/to/scan

或使用 clamdscan --fdpass 从调用用户的上下文传递文件描述符。

误报

ClamAV 偶尔会标记合法文件,尤其是压缩归档文件或某些 PHP 框架。要通过哈希将已知安全文件加入白名单:

sigtool --md5 /path/to/legitimate/file >> /var/lib/clamav/whitelist.fp

修改 .fp 文件后重启 clamd

ClamAV 在共享托管、VPS 与独立服务器上的对比

部署模式对 ClamAV 的配置方式有显著影响:

环境推荐模式备注
共享虚拟主机通过 cron 按需运行 clamscan无 root 访问权限;守护进程模式不可用
VPS(2–4 GB RAM)clamd 守护进程 + cron clamdscan在性能与内存限制之间取得平衡
独立服务器clamd + clamonacc + 邮件集成完整功能集;无资源妥协
GPU/高计算节点clamd 守护进程避免 clamonacc I/O 开销影响数据管道

对于需要最大吞吐量和对安全工具完全控制的环境,独立服务器提供了足够的硬件余量,可同时运行 clamdclamonacc 和邮件扫描,而不会产生资源争用。

技术决策矩阵与关键要点

在部署 ClamAV 之前,请验证以下各项:

  • 内核版本 — 运行 uname -r;如需 clamonacc,请确认版本为 5.1+
  • 可用 RAMclamd 需要 1–1.5 GB;在启用守护进程之前请相应规划
  • freshclam 自动化 — 确认 clamav-freshclam.service 已启用,且 NotifyClamd 已在 freshclam.conf 中设置
  • 套接字权限 — 验证 clamav 用户可读取所有扫描目标;在 ACL 不实用的情况下,配合 clamdscan 使用 --fdpass
  • 排除路径 — 递归扫描时始终排除 /proc/sys/dev
  • 日志轮转 — 在启用每日 cron 任务之前,为所有 ClamAV 日志文件实施 logrotate
  • OnAccessPrevention — 在生产系统切换到阻止模式(yes)之前,先在仅检测模式(no)下测试
  • 邮件集成 — 如果运行邮件服务器,请通过 amavisd-new 或原生 MTA av_scanner 指令进行集成,而非仅依赖定期文件扫描
  • 隔离目录 — 在使用 --move 之前,预先创建具有适当所有权的 /var/quarantineclamscan 不会自动创建该目录
  • 误报管理 — 维护 .fp 白名单文件,并在每次数据库更新后检查扫描日志以发现回归问题

常见问题解答

ClamAV 在 Linux 上默认提供实时保护吗?

不。安装后,ClamAV 仅以按需模式运行。实时保护需要在 clamd.conf 中显式启用 clamonacc 以及 OnAccessIncludePathOnAccessPrevention 指令,并且需要支持 fanotify 的内核(5.1+)。

clamscanclamdscan 有什么区别?

clamscan 是一个独立二进制文件,每次调用时都从磁盘加载病毒数据库,导致 5–30 秒的启动延迟。clamdscan 是一个轻量级客户端,将扫描任务提交给已运行的 clamd 守护进程,该守护进程将数据库保留在 RAM 中——对于重复或自动化扫描,速度显著更快。

ClamAV 守护进程需要多少 RAM?

加载当前完整数据库(main + daily + bytecode)后,clamd 通常需要 700 MB 至 1.2 GB 的常驻内存。在总 RAM 少于 2 GB 的系统上,将守护进程与 Web 服务器或数据库同时运行可能导致内存压力。在内存受限的实例上,请使用不带守护进程的 clamscan

ClamAV 能扫描压缩归档文件和电子邮件附件吗?

可以。ClamAV 原生解包并扫描 ZIP、RAR、7z、TAR、GZIP、BZIP2、CAB 及许多其他归档格式,以及 OLE2 文档(Microsoft Office)、PDF 文件和 ELF/PE 可执行文件。clamd.conf 中的 MaxScanSizeMaxFileSize 指令控制归档扫描的深度和大小限制。

为什么 freshclam 在安装后立即报告”locked by another process”?

在 Debian/Ubuntu 上,clamav-freshclam systemd 服务在软件包安装后自动启动,并对数据库目录持有独占锁。在此服务运行时手动运行 freshclam 会导致锁冲突。请使用 sudo systemctl stop clamav-freshclam 停止该服务,运行手动更新,然后重启该服务。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用