Linux服务器如何部署ClamAV?文件扫描与恶意程序检测教程

很多人有个误解:Linux 不会中毒。事实是,Linux 服务器同样会被植入恶意程序——挖矿木马、WebShell、后门、勒索软件、以及专门针对服务器组件的蠕虫。而且 Linux 服务器承担的往往不是"个人电脑"的角色,它是 Web 服务、文件共享、邮件网关的载体。一台被感染的服务器,不只是它自己出事,还可能成为攻击其他机器的跳板、给用户分发病毒的源头。

ClamAV 是 Linux 上最常用的开源反病毒引擎,由 Cisco 维护(现归属 Cisco Talos)。它的定位是文件扫描而非实时防护,特别适合几类场景:文件服务器/网盘的入库扫描、邮件网关的附件过滤、Web 上传目录的定期排查、以及服务器应急时"扫一遍看有没有已知恶意文件"。它自带命令行扫描器 clamscan、常驻守护进程 clamd、以及配合 Mail 的 clamav-milter。

这篇文章讲清楚:ClamAV 的原理和它适合/不适合做什么、如何在不同发行版上安装、如何更新病毒库(这是新手最容易卡住的地方)、如何在服务器上做全盘和定向扫描、如何用 clamd + onaccess 做准实时防护,以及怎么把它接进日常运维。文中命令以 root 或 sudo 执行。

一、先理解 ClamAV 的能力边界

用任何安全工具之前,搞清楚它能做什么、不能做什么,比会敲命令更重要。ClamAV 的核心是特征码匹配:它把已知恶意文件的特征(签名)维护成一个病毒库,扫描时拿文件内容去比对。这意味着两件事。

第一,它只能查出"已知"的恶意文件。全新出现的、没有特征入库的样本,ClamAV 查不出来。这不是 ClamAV 的问题,所有基于特征的杀毒引擎都一样。所以扫描前务必先更新病毒库,否则可能用的是几天甚至几周前的特征。

第二,它是文件扫描,不是行为防护。ClamAV 主要看"这个文件是不是已知恶意文件",而不太关注"某个进程在做什么可疑行为"。所以它防不住纯内存运行的挖矿程序、防不住不需要落地文件的攻击。真正全面的防护要靠多层:主机入侵检测(HIDS)、文件完整性监控(AIDE)、auditd、以及 Web 层防护配合。

基于这个定位,ClamAV 最适合的用法是定期扫描 + 入库扫描,而不是指望它做实时拦截。下面这张表把 ClamAV 的几个组件和适用场景列清楚:

组件 命令/服务 特点 适用场景
命令行扫描器 clamscan 单次扫描,慢,逐文件加载库 应急排查、小目录
守护进程 clamd 常驻内存,扫描快 大批量/定期扫描
客户端 clamdscan 调用 clamd 扫描 配合 clamd 使用
实时监控 clamonacc 基于 fanotify 的准实时 上传目录、共享目录
邮件过滤 clamav-milter 配合 MTA 邮件网关
病毒库更新 freshclam 定时更新特征库 必需,定时运行

需要提醒的是内存占用:clamd 常驻内存通常需要 1GB 以上(加载完整病毒库,经验值,随库大小增长),小内存(如 512MB)的机器上跑 clamd 会很吃力,这时候更适合用 clamscan 按需扫描。另外 clamscan 是单线程逐文件扫描,全盘扫描几百万文件可能要几个小时,要做好心理预期。

二、安装:不同发行版的做法

ClamAV 在各发行版的官方源里基本都有,直接装最省事。

# RHEL/CentOS/Rocky 系(需要 EPEL 源)
dnf install -y epel-release
dnf install -y clamav clamav-update clamd
# 老系统用 yum
# yum install -y epel-release && yum install -y clamav clamav-update clamd

# Debian/Ubuntu 系
apt update
apt install -y clamav clamav-daemon

安装后先看版本和目录结构:

clamscan --version
# 配置文件
# /etc/clamav/  (Debian/Ubuntu)
# /etc/clamd.d/clamd.conf 及 /etc/freshclam.conf  (RHEL 系)
# 病毒库目录通常为 /var/lib/clamav/
ls -la /var/lib/clamav/

这里有个新手必踩的坑:刚装完是没有病毒库的,直接扫描会报 "Can't open file or directory" 或提示需要先更新。必须先跑 freshclam 下载特征库,而特征库有一两百 MB(经验值,随版本增长),下载需要时间。如果服务器在国内且网络受限,可能需要配置镜像源来加速 freshclam——下文会讲。

三、更新病毒库:freshclam 配置与国内镜像

freshclam 负责从官方源下载 main.cvd、daily.cvd、bytecode.cvd 等特征文件。更新失败是 ClamAV 使用中的头号问题,原因通常是网络、权限或镜像。

# 手动更新一次(-v 显示详细过程)
freshclam -v

# 如果报权限错误(普通用户无法写病毒库目录),先确认目录属主
ls -ld /var/lib/clamav/
# Debian 系通常是 clamav:clamav,RHEL 系可能是 clamav 或 root

国内服务器更新慢或失败时,可以换用国内镜像。在 /etc/freshclam.conf(RHEL)或 /etc/clamav/freshclam.conf(Debian)里配置:

# 指定数据库镜像(示例:使用公开镜像,具体地址以你实际可用的为准)
DatabaseMirror db.local.clamav.net
# 或者一次配置多个,freshclam 会自动轮询
DatabaseMirror database.clamav.net
# 每天检查更新次数
Checks 12

配置自动更新很关键——特征库每天都在变,不更新等于白装。各发行版通常已经配好了定时任务:

# RHEL 系:检查是否有 cron 或 timer
ls /etc/cron.d/ | grep clam
systemctl list-timers | grep clam

# Debian 系:freshclam 由 systemd 服务驱动
systemctl status clamav-freshclam

# 手动触发一次更新服务
systemctl restart clamav-freshclam    # Debian 系

RHEL 系的 clamav-update 包会提供 clamav-freshclam 服务,可以启用:

systemctl enable --now clamav-freshclam

如果 freshclam 与 clamd 的病毒库文件权限冲突(常见于手动跑 freshclam 之后 clamd 读不到),注意保持病毒库属主一致,或者以运行 clamd 的用户身份执行 freshclam。RHEL 系通常在 /etc/sysconfig/freshclam 里设置了 FRESHCLAM_DELAY 等参数。

四、扫描:从定向排查到全盘检查

扫描分几个层次,按需选择。扫描前务必先 freshclam 更新库,这是前提。

# 1. 扫单个文件
clamscan /path/to/suspicious.file

# 2. 扫一个目录(如 Web 上传目录),-r 递归,-i 只显示被感染的文件
clamscan -r -i /var/www/html/wp-content/uploads

# 3. 扫目录,输出日志到文件,便于事后查看
clamscan -r -i -l /var/log/clamscan_$(date +%F).log /var/www/html

# 4. 全盘扫描(-i 只输出感染项,--exclude-dir 排除虚拟文件系统)
clamscan -r -i \
  --exclude-dir="^/proc" \
  --exclude-dir="^/sys" \
  --exclude-dir="^/dev" \
  --exclude-dir="^/run" \
  / 2>/dev/null

# 5. 扫描压缩包内的文件(-a 强制扫描所有文件,含归档格式)
clamscan -r -i --archive=yes /var/www/uploads

全盘扫描耗时较长(经验值:几十万到上百万文件可能需要一至数小时),建议放到业务低峰期,并注意它会大量占 IO,可能影响线上服务。更务实的做法是定向扫描高风险目录:上传目录、临时目录、用户家目录、Web 根目录、以及 /tmp、/var/tmp、/dev/shm。攻击者植入的恶意文件基本都落在这几处。

# 推荐的高风险目录扫描组合(经验清单)
clamscan -r -i /tmp /var/tmp /dev/shm
clamscan -r -i /var/www
clamscan -r -i /home

如果服务器已经装了 clamd(守护进程),用 clamdscan 扫描会快很多,因为它不需要每次重新加载病毒库:

# 启用并启动 clamd
systemctl enable --now clamd        # RHEL 系服务名可能是 clamd@scan
systemctl enable --now clamav-daemon  # Debian 系

# 用 clamdscan 扫描(速度比 clamscan 快一个数量级)
clamdscan -r -i /var/www

clamd 相比 clamscan 的优势就在"库常驻内存",反复扫描时性能差异明显。代价是常年占用约 1GB 内存,小机器要权衡。

五、准实时防护与自动化集成

clamscan 是"手动扫",要让它更主动,可以用 clamonacc 做基于 fanotify 的准实时监控,或者把扫描接入自动化流程。

clamonacc 的配置在 /etc/clamav/clamd.conf(Debian)或 /etc/clamd.d/scan.conf(RHEL)里:

# 开启按访问扫描
OnAccessIncludePath /var/www/html/wp-content/uploads
OnAccessExcludeUname clamav
OnAccessPrevention yes
# 卸载(Debian 用 clamav;RHEL 视配置,常为 clamav 或 clamonacc 专用)

启动 on-access 服务:

systemctl enable --now clamav-clamonacc   # Debian 系
# RHEL 系对应的服务名以实际安装为准

需要注意:on-access 模式依赖内核 fanotify,某些内核或容器环境下不可用;而且 OnAccessPrevention yes 依赖内核支持阻断,配置不当可能影响性能甚至卡住文件访问。建议先在测试环境验证再上生产。

更常见也更稳妥的做法是把 ClamAV 接入运维流程:

  • 入站自动扫:用户往网盘/共享目录上传文件后,用 hook 触发 clamdscan,命中则隔离并告警。
  • 定期全盘扫:用 cron 或 systemd timer 每周低峰期跑一次定向扫描,把结果写入日志并做趋势对比。
  • 告警联动:扫描命令返回码有意义——0 表示无感染,1 表示发现感染,2 表示出错。脚本里据此触发不同动作。
# 一个定期扫描脚本示例,配合 cron 使用
#!/bin/bash
LOG=/var/log/clamav/scan_$(date +%F).log
/usr/bin/clamdscan -r -i --log="$LOG" /var/www /home /tmp
RC=$?
if [ "$RC" -eq 1 ]; then
    # 发现感染,触发告警(替换为你的告警方式)
    mail -s "ClamAV 发现恶意文件 $(hostname)" admin@example.com < "$LOG"
    # 注意:不要直接自动删除!先隔离,人工确认后再处置
fi

这里要特别强调一个安全纪律:不要写脚本自动 --remove 删除检出文件。反病毒引擎有误报,自动删除可能删掉正常业务文件(比如某些打包过的二进制、脚本模板)。稳妥流程是"检出 → 隔离/移动 → 人工确认 → 处置"。ClamAV 支持把检出文件移动到隔离区(--move),而不是直接删。

mkdir -p /var/quarantine
# 把检出文件移动到隔离目录(保留现场,不直接删)
clamscan -r -i --move=/var/quarantine /var/www/uploads

常见问题

Q:ClamAV 和商业杀毒软件比,够用吗?
对服务器场景,ClamAV 的特征库覆盖主流恶意软件,完全够用。它的短板是缺少行为防护和一些高级检测,但这本来就是"服务器 HIDS"该干的活。合理的组合是 ClamAV 做文件特征扫描 + AIDE 做完整性校验 + auditd 做行为审计。

Q:为什么扫描速度这么慢,能不能加快?
两个方向:一是改用 clamd + clamdscan(库常驻内存,明显更快);二是缩小扫描范围,只扫高风险目录,别动不动全盘。--exclude-dir 排除 /proc、/sys、/dev、/run 也能省很多时间。全盘扫描本来就慢,这是特征匹配的固有开销。

Q:freshclam 一直失败怎么办?
先看错误信息。如果是 "Connection failed",检查网络和 DNS,或换国内镜像;如果是权限错误,确认病毒库目录属主和运行用户一致;如果是 "The ClamAV database is out of date / update failed",可能需要先手动下载库文件放到 /var/lib/clamav/。国内服务器网络受限时,配置可用镜像通常是关键。

Q:扫描发现有文件被感染,是不是直接删掉就好?
先别删。查看被感染文件的路径和时间,判断它是"真正的恶意文件"还是"误报",并回溯它是怎么进来的(往往意味着系统已经被入侵)。把它移动到隔离区留证,然后结合日志排查入侵入口。直接删掉会破坏现场。

Q:ClamAV 能防挖矿吗?
能防"落地成文件的挖矿程序"(比如检出常见的挖矿木马样本),但防不住纯内存执行、或者特征未入库的新型挖矿程序。防挖矿更依赖 CPU 异常的监控、进程审计和及时的系统补丁。

总结

  • ClamAV 是基于特征码的文件扫描引擎,查已知恶意文件、适合定期扫描和入库扫描;不要指望它做实时行为防护,要和其他手段配合。
  • 安装后必须先 freshclam 更新病毒库再扫描,国内服务器注意配置可用镜像;一定把自动更新(cron/timer)配好。
  • 扫描优先用"定向高风险目录"(上传目录、/tmp、/dev/shm、Web 根目录、家目录),全盘扫描放低峰期并排除虚拟文件系统;装了 clamd 后用 clamdscan 提速。
  • 不要写脚本自动删除检出文件,要用 --move 隔离留证 + 人工确认,因为存在误报。
  • 排查已感染文件时要回溯入侵入口,结合日志和文件时间线,而不是只处理"物证"。
  • 小内存机器慎用常驻 clamd(约 1GB 内存,经验值);对性能敏感的服务器优先按需扫描 + 自动化集成,而不是实时防护。