CentOS服务器一旦出现CPU异常占满、陌生进程杀不掉、crontab被写入奇怪任务或者SSH登录变慢,基本可以判断服务器已经感染恶意程序。很多人第一反应是重装系统,但生产环境往往不允许直接重装,而且如果不定位入侵路径,重装后很快会再次中招。病毒查杀和安全清理必须按照“阻断传播—定位恶意程序—清除持久化—修复漏洞—加固防线”的顺序来操作,跳过任何一步都可能清理不干净。

先做第一件事:切断服务器对外的异常连接,但不要直接拔网线。直接断网会导致无法下载杀毒工具和补丁,而且部分勒索病毒检测到断网后会立即加密文件。正确做法是用iptables临时限制出站流量,只放行SSH管理端口和必要的软件源地址。执行以下命令可以快速丢弃所有非SSH的出站连接,同时保留DNS解析:

iptables -P OUTPUT DROP
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

这样操作后,恶意程序无法回连控制端,但服务器仍然可以访问HTTP和HTTPS下载杀毒工具。接下来立即检查当前登录用户和异常会话,使用w命令查看谁在线,用last命令查看历史登录记录。如果发现来自陌生IP的登录记录,尤其是凌晨时段的登录,说明SSH凭证可能已经泄露。此时不要只改密码,还要检查/root/.ssh/authorized_keys文件里是否被写入了攻击者的公钥,这是最常见的内网横向渗透和后门手段。

定位恶意进程是清理的核心。很多Linux病毒会伪装成系统进程名,比如叫kthreadd、sshd、nginx或者一串看似正常的名字。单纯用ps aux看进程名很容易被骗,必须结合进程的启动路径和父进程ID来判断。执行以下命令可以列出所有进程的完整路径:

ls -l /proc/*/exe | grep -v "Permission denied"

重点查看那些路径指向/tmp、/var/tmp、/dev/shm、/run/user或者隐藏目录的进程。正常系统进程的二进制文件几乎都在/usr/bin、/usr/sbin、/bin、/sbin下面,如果某个进程的可执行文件在/tmp目录下,基本可以确定是恶意程序。再用lsof -p 进程号查看该进程打开了哪些文件和网络连接,如果发现它连接到一个陌生的境外IP或者监听了一个奇怪端口,立即记录下这些信息作为溯源证据。

杀进程时不要用kill -9直接强杀,因为很多挖矿木马有守护进程,强杀后几秒钟内就会重新拉起。正确做法是先找到守护进程和主进程的关联,用systemctl status或者查看crontab来定位启动来源。对于有守护进程的恶意程序,要先停掉守护进程,再杀掉主进程,最后删除相关文件。如果进程反复出现,可以先用chattr +i命令给恶意文件加锁防止其被重新写入,然后再杀进程:

chattr +i /tmp/.malware
kill -9 恶意进程PID

crontab是Linux病毒最常用的持久化手段。攻击者会在crontab里写入定时任务,每隔几分钟就从远程服务器下载恶意脚本并执行。检查crontab时不能只看crontab -l,还要检查/etc/crontab、/etc/cron.d/目录、/var/spool/cron/目录以及/etc/cron.hourly、/etc/cron.daily等周期性任务目录。很多挖矿木马会把恶意脚本放在/etc/cron.d/root或者/etc/cron.d/system下面,文件名伪装成系统任务。执行以下命令可以一次性查看所有定时任务:

cat /etc/crontab
ls -la /etc/cron.d/
ls -la /var/spool/cron/
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/

发现可疑任务后,不要只删除crontab条目,还要找到对应的脚本文件一并删除。有些病毒会把恶意脚本写入/etc/init.d/目录并注册为系统服务,用systemctl list-units --type=service --state=running查看所有运行中的服务,重点排查那些没有描述信息、启动命令指向/tmp或/var/tmp的服务。对于systemd服务,检查/etc/systemd/system/目录下是否有可疑的.service文件,这些文件往往是病毒用来实现开机自启的。

清理完进程和定时任务后,必须检查系统关键文件是否被替换。很多rootkit会替换ls、ps、netstat、top等系统命令,让你看不到恶意进程和文件。使用rpm -Va命令可以验证所有已安装软件包的完整性,输出中如果出现5或者M标记,说明文件被修改过。对于被替换的系统命令,用yum reinstall coreutils procps net-tools重新安装即可恢复。如果服务器上安装了ClamAV,可以用clamscan对/bin、/sbin、/usr/bin、/usr/sbin、/tmp、/var/tmp进行全盘扫描,但ClamAV对Linux后门和挖矿木马的检出率有限,更推荐使用chkrootkit和rkhunter做专项检测:

yum install -y chkrootkit rkhunter
chkrootkit
rkhunter --check --skip-keypress

漏洞修复是防止再次入侵的关键。CentOS 7已经在2024年6月停止维护,如果服务器仍然运行CentOS 7,必须尽快迁移到CentOS Stream、Rocky Linux或者AlmaLinux。对于还在维护周期内的CentOS版本,立即执行yum update -y更新所有软件包,重点修复SSH、内核和Web服务的漏洞。很多服务器被入侵是因为运行了旧版本的Redis、Docker API或者Weblogic,这些服务暴露在公网且没有设置认证,攻击者可以直接利用已知漏洞获取root权限。检查对外开放的端口,用ss -tlnp查看所有监听地址为0.0.0.0的服务,对于不需要对外提供的服务,将监听地址改为127.0.0.1或者用防火墙限制访问来源。

SSH安全加固是清理后的必要动作。如果之前允许密码登录,立即修改为仅允许密钥登录,并禁用root直接登录。编辑/etc/ssh/sshd_config文件,设置以下参数:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Protocol 2
MaxAuthTries 3

修改后重启sshd服务。同时检查所有系统用户的密码强度,用chage -l 用户名查看密码过期策略,对长期不使用的账户执行usermod -L锁定。如果服务器上有多个管理员,建议为每个人创建独立账户并配置sudo权限,避免共用root密码。

日志分析能帮助你确认入侵路径和攻击时间。检查/var/log/secure文件,搜索Failed password和Accepted关键字,统计暴力破解的来源IP和成功登录的时间点。如果发现某个IP尝试了成百上千次密码,说明服务器长期暴露在暴力破解之下。对于这些IP,可以用iptables或者firewalld将其加入黑名单。同时检查/var/log/messages和/var/log/cron,看是否有异常的服务启动记录和定时任务执行记录。日志文件如果被删除或清空,说明攻击者具备一定的反取证能力,这种情况下需要结合文件系统的mtime和ctime来推断恶意文件的创建时间。

最后一步是建立日常监控机制。在服务器上安装并配置auditd审计系统,对关键目录和文件进行变更监控:

yum install -y audit
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/crontab -p wa -k crontab_changes
auditctl -w /var/spool/cron/ -p wa -k cron_changes
auditctl -w /tmp -p wa -k tmp_changes

这样一旦有人修改这些关键文件,系统会立即记录下操作者、时间和具体变更内容。同时配置logwatch或者自写脚本定期发送服务器状态报告,包括CPU使用率、内存占用、磁盘空间、异常进程和失败登录次数。对于生产环境,建议部署开源的HIDS工具如Ossec或者Wazuh,实现实时入侵检测和告警。

CentOS服务器病毒查杀不是一次性的动作,而是一套完整的运维流程。清理完恶意程序后,必须持续观察至少一周,确认没有异常进程复活、没有新的定时任务出现、没有陌生IP尝试连接。只有把阻断、清理、修复、加固和监控全部落实到位,才能避免服务器再次沦为攻击者的肉鸡。