首页 / 资讯中心 / 文章详情

Ubuntu系统感染木马怀疑排查:ClamAV使用指南与清理流程

Ubuntu系统感染木马怀疑排查:ClamAV使用指南与清理流程 ★ FEATURED ARTICLE
1. 先想清楚一件事你的 Ubuntu 到底有没有被“感染”1.1 别一上来就装杀毒软件先冷静三分钟很多人遇到“怀疑 Ubuntu 中木马”的第一反应是赶紧装个杀毒软件全盘扫一遍。这个方向没错但顺序错了。服务器也好、桌面机也好如果真有恶意程序在跑你直接装软件、更新病毒库、再全盘扫描这中间的一两个小时里恶意程序一直在正常工作。它可能会继续偷数据、继续扫描内网、继续挖矿甚至在你装杀毒软件的过程中抢先一步把你的敏感文件打包传走。所以文章标题里提到的“排除系统已经感染木马或病毒”这不是一句废话它其实是整个操作的核心思路先做轻量级人工排查确认有没有明显的异常迹象再上杀毒工具做深度扫描。ClamAV 确实是 Ubuntu 上最主流的开源杀毒方案但它不是防火墙也不是行为检测工具它本质上是基于特征库的扫描器。你要先搞清楚自己在防什么、查什么才能用好它。1.2 Linux 上说的“被感染”到底指什么Linux 不是不会感染恶意软件而是感染的方式、场景和 Windows 不太一样。常见情况大概有这几类你从第三方仓库下载了被投毒的 .deb 包或压缩包里面藏着脚本或二进制后门。系统暴露在公网某个服务比如 Redis、Nginx、SSH存在未授权访问或已知漏洞被入侵后植入了挖矿程序或 Rootkit。你的机器不是最终受害者而是“跳板”。它可能是个文件服务器或邮件网关中转传播 Windows 恶意软件。针对 Linux 的木马确实相对少但挖矿木马、僵尸网络客户端、勒索软件这些都真实存在。ClamAV 能扫描前三种场景中的大部分已知样本但它对第四种Rootkit 行为、内核模块级别的后门基本无能为力。你可以在 Ubuntu 上用 ClamAV 做病毒木马扫描但别指望它是万能药。1.3 上工具之前先做一次三分钟手工排查安装 ClamAV 之前我建议你先在终端里用几句命令看看系统当前的状态。这三分钟花得很值因为信息能帮你判断问题有多严重也能在后续扫描出现海量告警时快速定位真正可疑的两三个文件。先用 top 或 htop 看 CPU 占用。如果是服务器正常情况下一台闲置机器的 CPU 应该在个位数徘徊。如果你看到某个进程占了 100% 甚至更多而且进程名看起来很不正常这就是第一个危险信号。很多挖矿木马为了让进程看起来像系统服务会把自己改名成 java、kworker、dbus-daemon 之类的名字注意区分真正的 kworker 是内核工作线程用 ps 看它的 PPID 和路径能判断真伪。再用 ss 或 netstat 检查网络连接。重点看有没有大量非 80/443 端口的外连尤其是连接目标 IP 不像正常云服务商的连接。有个小技巧用ss -tunap把状态为 ESTABLISHED 的连接列出来留意进程名和连接数量。正常服务器不会同时和几十个陌生 IP 保持连接。然后检查计划任务crontab -l看当前用户的sudo ls /etc/cron.d/、/etc/cron.hourly/看系统级的。攻击者通常会加一条定时任务每隔几分钟从远端拉取一个脚本执行。很多清理案例里用户把病毒文件删了但忘了删 crontab结果过十分钟又复活了。最后看一眼登录记录last和lastb特别留意有没有陌生 IP 的 SSH 登录。如果发现有可疑来源的 Successful Login后面做清理时你还要改密码、检查 authorized_keys。这几步查完你对系统的状态就有谱了。如果发现明显的异常进程或连接接下来装 ClamAV、跑扫描、做隔离清理就是一条完整的应对链。2. 装 ClamAV 的正确姿势先把软件源和依赖搞清楚2.1 安装前的一步准备更新软件源安装命令本身很简单但很多人忽略了一个前置动作先更新一下软件源。Ubuntu 的官方源和镜像站同步有一定延迟你直接apt install clamav可能装到一个版本较旧的包。杀毒软件的病毒库和程序版本都有时效性装旧版本等于给自己挖坑。执行sudo apt update让它把软件包列表刷新一下。这一步还会顺手检查源里有没有损坏的条目如果输出里出现很多类似404 Not Found的提示那你装的可能是个非官方源或已停止维护的版本比如某些老教程里让你添加的第三方 PPA。对于安全工具我强烈建议只用 Ubuntu 官方源或你所在机构维护的镜像源。ClamAV 在官方源里一直都有实在没必要为了“新版”去折腾 PPA。2.2 安装命令和它到底装了些什么命令行两条sudo apt update sudo apt install clamav clamav-daemon有的教程只写clamav装完发现只有命令和病毒库更新工具没有后台守护进程。这里我建议加上clamav-daemon原因后面讲扫描效率时会细说。装完后你用下面几条命令验证一下clamscan --version freshclam --version systemctl status clamav-daemon第一条会输出 ClamAV 版本号和病毒库签名日期第二条确认 freshclam 工具正常第三条看守护进程有没有跑起来。一个关键点clamav-daemon在安装完成后会自动启动但病毒库可能还没下载因为 freshclam 的首次下载是异步的。你可能会在系统日志里看到 clamav-freshclam 相关的报错这是正常的等它把病毒库拉下来就好了。2.3 装完先别急看一下病毒库版本ClamAV 的特点在于程序本身只是骨架真正干活的是病毒库。你安装时病毒库一个都没有需要 freshclam 去下载。Ubuntu 的镜像里通常带了一个初始病毒库的压缩包freshclam 会做增量更新第一次运行可能要下载几十 MB 到上百 MB 的数据具体取决于当前库的规模。检查病毒库版本的命令是sudo freshclam --version输出里会有类似FreshClam version和Last checked的信息。如果你看到病毒库日期是好多天以前的说明更新流程有问题需要排查网络、代理或 DNS 配置。这一步很关键拿一个过期好几天的病毒库去扫描系统等于拿着去年的通缉令抓今年的逃犯查不出东西也算正常结果但你没法说服自己系统是干净的。这里有一个实操经验Ubuntu 桌面版默认配置了clamav-freshclam服务它会每小时自动检查一次更新。服务器上如果你关了它的定时器就要自己写 cron 任务定期跑 freshclam不然病毒库会慢慢过期。后面我会给一个具体的 cron 配置参考。3. 第一次全盘扫描之前先搞懂 ClamAV 的两种工作模式3.1 clamscan 与 clamdscan 有什么区别装完 ClamAV你会发现至少有两条扫描命令可用clamscan和clamdscan。第一次用的人很容易困惑这两者的区别其实很关键。clamscan是独立的命令行扫描工具每次运行都会自己加载病毒库扫描结束后释放资源。优点是简单、可靠、不需要额外配置缺点是每次打开病毒库都有一段延迟如果扫描大目录会非常慢而且吃内存。clamdscan是把扫描请求发给后台守护进程clamd由后者完成扫描并返回结果。前提是clamd已经在运行而clamav-daemon这个包的作用就是提供这个服务。优点在于守护进程常驻内存、病毒库已经加载好多次扫描不用反复初始化所以速度快、效率高缺点是需要先保证服务正常运行而且clamd的配置对内存要求更高一些。我的建议日常临时扫描用clamscan因为简单直接、不用排查服务状态如果你的服务器需要定期扫描大量文件比如每周全盘扫一次那就用clamdscan配合定时任务效率提升明显。有个容易踩的坑clamdscan的权限模型和clamscan不一样。clamd 通常以clamav用户运行如果你用clamdscan扫描/root目录或者某些权限受限的文件可能会报权限不足的错误。这种情况下要么手动给 clamav 用户加读权限不建议要么临时用clamscan来扫这些目录。3.2 更新病毒库freshclam 的配置项你必须知道先跑一次手动更新确认机制正常sudo freshclam正常情况下你会看到类似 “Downloading daily.cvd” 之类的进度然后提示病毒库已是最新版本。如果你的网络环境比较特殊需要走代理可以在/etc/clamav/freshclam.conf里加配置但先说明白配置文件里像UpdateLogFile、DatabaseDirectory这种参数默认已经设置好了一般不需要动。我需要特别提醒的是DatabaseMirror配置项。默认情况下 freshclam 会从一组官方镜像下载病毒库国内网络的访问速度时快时慢如果你发现更新经常超时可以考虑把DatabaseMirror改成比较稳定的镜像地址。但注意改之前确认一下镜像来源是否可靠。杀毒软件的病毒库本身就是安全敏感的东西你从不可信渠道拿病毒库等于把安全后门拱手让人这违背了整个事情的初衷。对多数 Ubuntu 用户来说官方镜像偶尔慢一点但最终能更新成功也就够用了。与其折腾镜像不如检查一下你机器上的clamav-freshclam服务是否正常运行systemctl status clamav-freshclam sudo journalctl -u clamav-freshclam --no-pager -n 30日志里能看到每次自动更新的时间戳和结果。如果你发现服务处于 active 状态但日志里全是警告多半是病毒库没写到默认目录或者目录权限不对。检查一下/var/lib/clamav是否存在、属主是否为clamav:clamav不对就修正sudo ls -ld /var/lib/clamav sudo chown -R clamav:clamav /var/lib/clamav3.3 第一次全盘扫描别指望一条命令跑到底现在病毒库就绪、程序确认正常可以开始第一次扫描。先给一个最基础的命令sudo clamscan -r / --exclude-dir/proc --exclude-dir/sys --exclude-dir/dev --exclude-dir/run --exclude-dir/snap解释一下这里为什么手动排除几个目录。/proc、/sys、/dev是内核虚拟文件系统和设备文件扫描它们不仅毫无意义还可能因为特殊的文件类型导致 ClamAV 卡住或报大量奇怪的错误。/run是运行时的临时目录进程的 pid 文件和一些 socket 文件都在里面扫它对发现恶意软件没有任何帮助。/snap目录可以视情况排除snap 镜像里的文件是只读挂载的被篡改的可能性几乎为零扫描它会增加大量无效 IO拖慢整体速度。一个更现实的方案是第一次别全盘扫先扫最容易藏毒的目录sudo clamscan -r /home /tmp /var/tmp /var/www /etc这几个目录覆盖了用户文件、临时文件、Web 站点配置和系统配置文件是恶意软件最常出现的位置。全盘扫描可以放在这一步之后等确认核心目录干净了再执行。扫描开始后你可能会看到大量输出。别慌ClamAV 默认情况下每个文件都会输出一条记录扫描一个几万文件的家目录终端会刷刷刷滚很久。建议加上参数sudo clamscan -r --bell --verbose /home--bell是发现病毒时响铃这样你可以在跑扫描的同时做其他事听到蜂鸣声再回来看。--verbose会显示扫描的进度和文件信息但对海量文件会浪费 IO如果你只想安静地扫描可以在命令末尾用--quiet只在发现问题时输出。实际扫描完成后输出会有一份汇总统计扫描了多少文件、发现了多少病毒。看到 “Infected files: 0” 也别高兴太早因为 ClamAV 查的是特征库已知样本对新型变种和没有签名文件的能力有限。4. 面对已经怀疑感染的场景重点检查这五个地方4.1 可疑进程和异常 CPU 占用很多人问这个问题ClamAV 扫描出来的都是已知病毒文件如果木马是新型变种扫描不出来怎么办所以 ClamAV 扫描不等于排查的全部。如果你的系统已经表现出异常CPU 飙高、网络流量奇怪、莫名出现新用户先解决异常现象扫描是辅助确认的手段。挖矿木马是最典型的症状。它在运行时会把 CPU 占满即使你的机器闲置top里也能看到它。检查时用top -c ps aux --sort-%cpu | head -20发现可疑进程后用ls -l /proc/PID/exe看这个进程对应的可执行文件路径。如果路径指向/tmp、/var/tmp、/dev/shm这类非标准目录几乎可以直接判定为恶意。/dev/shm尤其可疑攻击者喜欢在这里放文件因为它默认是内存文件系统重启就消失传统文件扫描很容易漏掉。处理这种进程的标准操作是先记录进程 PID 和父进程 PID再用kill -9终止随即清理对应的文件最后翻一下 cron 和 systemd 服务的配置把它的持久化机制断掉。只杀进程不删文件等于没处理。4.2 网络连接和监听端口挖矿木马除了吃 CPU一般还要和远端的矿池建立连接。如果它只占用 CPU 而没有外连你还能看到算力提升但网络连接检查依然值得做。用ss -tnp看 ESTABLISHED 状态的连接。正常服务器外连通常是HTTP/HTTPS 用的 80、443SSH 用的 22NTP 时间同步用的 123DNS 查询用的 53。如果你看到大量连接到 8443、4444、6666、3333 这类端口或者连接目标是陌生的境外 IP就要提高警惕。对照检查每个外部连接对应的本地进程再用ps和lsof深挖。比如sudo lsof -i -P -n这个命令列出所有网络连接和监听端口可以判断哪些端口是系统服务正常开放的哪些是可疑进程开放的。如果你的机器是服务器并且有防火墙正常只应该对外开放少量端口比如 22、80、443其他端口要么不监听要么只监听内网或本机发现异常监听端口基本可以确定系统被入侵过。4.3 定时任务和启动项里藏着的“复活机制”我前面已经提了一次 cron这里再展开讲。恶意软件要在重启后继续存活常见的持久化手段有三种cron、systemd service、自启动脚本。Ring 上有些攻击脚本会在被清理后 10 分钟内重新下载自身原因就是清理时漏了 cron。检查完上面几个地方再用下面几条命令确保没有漏网之鱼crontab -l sudo crontab -l sudo ls -la /etc/cron.d/ sudo ls -la /etc/cron.daily/ sudo systemctl list-unit-files --stateenabled重点关注/lib/systemd/system和/etc/systemd/system下面有没有最近新增的 service 或 timer 文件。用ls -lt按时间排序新出现的文件一目了然。4.4 敏感目录里的特殊文件攻击者拿到一个服务器的权限后通常不会把恶意程序放在/usr/bin这种容易被发现的地方但也不会绝对排除木马伪装成系统命令的情况很常见。相对隐蔽的位置包括/tmp和/var/tmp经常放下载脚本和临时二进制。/dev/shm内存文件系统重启清空适合放短生命周期工具。/var/spool/cron/crontabs系统用户 crontab 的存储位置。/root/.ssh和/home/用户/.ssh检查有没有被塞入新的公钥。/etc/ld.so.preload这个文件如果存在非注释内容可能是用于 hook 系统库调用的 Rootkit。用 ClamAV 扫描时/dev/shm默认会被跳过吗实际上如果从/开始扫描/dev/shm会被算在/dev里面而/dev通常不会被完整扫描。所以手动扫一遍sudo clamscan -r /dev/shm /run /tmp /var/tmp注意/dev/shm在内存里扫描速度通常很快。4.5 SSH 后门和登录凭证排查最后检查一个非常容易被忽略的点SSH 后门。攻击者可能往authorized_keys文件里追加了一个公钥这样你改完密码、杀完木马都没用对方依然能用密钥直接登录。sudo cat /root/.ssh/authorized_keys sudo cat /home/*/.ssh/authorized_keys sudo last -20 sudo lastb -20如果 authorized_keys 里有一条你不认识的公钥立刻删除并确认文件属主和权限归位。lastb显示失败登录记录如果一直有人爆破说明系统暴露在公网上还应该考虑修改 SSH 端口、禁用密码登录、启用 fail2ban 等加固措施。5. 清理阶段别见一个删一个先隔离再处置5.1 为什么要先隔离而不是直接删ClamAV 扫描完成后如果发现了病毒文件很多人第一反应是加--remove参数直接删除。我劝你稳一手。原因在于杀毒软件经常误报尤其是针对某些破解工具、注册机、特殊编译的脚本ClamAV 可能会因为特征匹配而报警但实际上那些文件只是“长得像”病毒并非真的恶意。更稳妥的做法是把可疑文件移动到一个隔离目录比如sudo mkdir -p /var/quarantine sudo mv /path/to/suspicious_file /var/quarantine/之后再根据文件类型和来源人工判断如果是你从某个安全网站下载的正常软件ClamAV 报毒很可能是误报可以上传到在线多引擎扫描平台再确认一下。如果是/tmp下面来历不明的二进制文件同时你前面已经发现 CPU 异常那基本可以确定是恶意文件直接删除或保留样本都行但绝不能再放回去执行。如果是系统文件比如/usr/bin下面的命令杀毒软件报毒要先看哈希值和官方包做对比用dpkg -V验证文件完整性。ClamAV 的隔离动作不包含在包本身可以用上面这个 mv 方式实现。如果你选择直接在扫描时删除务必先备份一份到隔离目录再删。5.2 真正的清理流程分三步走第一步终止相关进程。找到恶意进程后sudo kill -9 PID1 PID2第二步清理持久化配置。检查并删除可疑的 cron 条目、service 文件、启动脚本顺手把/etc/ld.so.preload清空或删除。第三步处理受影响的用户账户和配置。包括但不限于修改 root 密码和所有用户的密码、删除未知 SSH 公钥、检查是否多出了未知的用户sudo cat /etc/passwd里 uid 为 0 的除了 root 还有其他用户就非常可疑、清理~/.bashrc里被追加的恶意导出或别名。这三步做完再用 ClamAV 做一次全盘扫描确认清理结果这次如果病毒数归零基本可以放心了。5.3 清理完成后别急着恢复业务清理只是第一步系统完整性的恢复才是后续重点。感染过一次的系统不敢保证没有被放行其他后门所以合规的做法是评估系统是否值得保留还是干脆重装。判断标准大致如下感染的只是/tmp下的一个挖矿脚本没有发现 root 权限被拿、没有发现额外 SSH 公钥可以清理后继续使用。发现 Rootkit 痕迹、内核模块被替换、/etc/passwd出现 uid0 的未知用户或者重要数据存在被加密或外传的迹象这种情况下继续在原有系统上打补丁的意义不大重装才是稳妥选择。重装系统虽然麻烦但比起和一个不确定干净的系统长期相处这点代价值得。6. 常见问题与实战避坑至少有一半人会在这些点上摔跤6.1 freshclam 更新失败这是 ClamAV 最头疼的问题。症状freshclam反复提示连接超时或者报权限错误、目录不可写。排查顺序sudo systemctl status clamav-freshclam sudo ls -ld /var/lib/clamav sudo tail -50 /var/log/clamav/freshclam.log权限错误的处理方式我前面说过确认目录属主是clamav如果是 root 就 chown 一下。连接超时的问题优先检查防火墙是不是挡了外面的 TCP 443 出站连接其次考虑镜像速度。如果 freshclam 服务一直失败可以先杀干净重启一把sudo systemctl stop clamav-freshclam sudo freshclam sudo systemctl start clamav-freshclam手动跑成功后服务会自动更新最后的检查时间从日志里看如果下次定时更新正常这个问题就解决了。6.2 扫描时内存和 CPU 被吃满ClamAV 全盘扫描时加载病毒库需要数百 MB 内存扫描大量文件时 CPU 也会持续较高负载。在配置较低的 VPS 上这可能导致系统卡顿甚至 OOM。解决办法扫描前把可执行的 IO 优先级调低sudo ionice -c3 clamscan -r /tmp避开业务高峰期执行扫描。如果你用clamd扫描可以调整/etc/clamav/clamd.conf里的MaxThreads和MaxConnectionQueueLength参数限制并发线程数量。部分 VPS 上 ClamAV 扫描会导致内存耗尽可以给 clamd 的 systemd 服务加入MemoryMax限制防止它把系统撑垮。扫描时排除明显不会感染的目录如前面提到的/proc、/sys、/dev、/run能大幅减少无效 IO 和 CPU 消耗。6.3 看到报警先别删确认误报再看处理方案ClamAV 的误报率不算低尤其是针对某些自行编译的程序、加壳的二进制、PHP 混淆代码。误报的常见场景是 Web 目录里的加密 PHP 文件被当成 webshell但其实有些是正常的加密授权文件。处理方式clamscan --removefalse /path/to/file先在隔离目录留一份然后用其他引擎交叉验证。确认误报后有两种选择把文件加入白名单目录或者在clamd.conf中配置ExcludePath将特定路径排除在后续扫描范围之外。加入白名单的命令行参数是clamscan --exclude/path/to/file -r /target6.4 三个新手容易犯的错第一个错误只杀进程不清理持久化配置。结果就是“僵尸复活”几天后同样的木马又出现。第二个错误用旧病毒库扫描就以为系统干净。病毒库的时效性决定了你扫描结果的可靠程度。第三个错误把 ClamAV 当实时防御来用。ClamAV 默认没有实时文件监控除非配置 OnAccessScan 或使用第三方的整合方案它更适合做定期扫描、邮件网关扫描、文件服务器扫描。指望它像 Windows 桌面杀毒软件那样实时拦阻会错失很多攻击信号。6.5 给定期维护加一个安全基线病毒库更新时间久不难维护但容易忘。你可以用 cron 做两层保障一层是系统自带的clamav-freshclam服务每小时检查一次另一层是自己加一个每周的例行扫描任务比如每周日凌晨三点跑一次全盘扫描把结果输出到日志文件0 3 * * 0 sudo clamscan -r / --exclude-dir/proc --exclude-dir/sys --exclude-dir/dev --exclude-dir/run --exclude-dir/snap --log/var/log/clamav/weekly-scan.log这样只需要定期看一下日志就行。健康运行的服务器日志里 “Infected files: 0” 是常态哪天真出现了非零值说明你的定期检查起作用了。最后把我自己实践中最大的体会分享给你ClamAV 是排查和兜底的好帮手但它替代不了基本的安全意识。一个系统是否干净更多取决于入口的控制比如 SSH 是否开了密钥登录、业务服务是否限制了访问来源、普通用户是否有不必要的 sudo 权限、软件包是否都从官方源安装。把这些基础的防线做扎实ClamAV 更多时候只是一个让人安心的“定期体检工具”。如果你这次是在“怀疑已经感染”的背景下点开这篇文章那么建议你按上面排查流程认真过一遍该清理就清理该重装就重装别再陪异常进程过日子。
阅读完成 · 觉得有帮助?
咨询建站