早上打开服务器,发现 CPU 占用 100%,风扇狂转;SSH 一登录就卡成幻灯片;查账单发现流量跑掉几十 G——大概率是被挖矿病毒入侵了。挖矿病毒是目前 VPS 最常遭遇的攻击:入侵后植入挖矿程序,偷偷占用你的 CPU 挖门罗币。这篇文章讲清从发现、定位、清理到加固的完整流程,照着做就能把病毒清干净。
一、怎么判断服务器中了挖矿病毒
出现以下任意几条就要高度警惕:
- CPU 长期 100%,特别是空闲时也满负载;
- 出现可疑进程:名字像系统进程但路径不对(如
/tmp/xmrig、/var/tmp/kworkerds、kswapd0伪装进程); - CPU 占用前几名是
xmrig、minergate、cpuminer、kdevtmpfsi等挖矿程序常见名称; - 网络连接异常:不断连接境外 4444、3333、5555、14444 等矿池端口;
- SSH 登录日志里出现大量陌生 IP 爆破成功记录;
- 莫名其妙多了 root 后门:如
~/.ssh/authorized_keys被写入未知公钥。
二、第一步:先断网止损(重要)
发现被入侵后,不要急着杀进程。很多挖矿病毒有守护进程,杀掉矿程序会被自动拉起,还会自动清除日志。正确顺序是:
1. 立即检查并清除 SSH 后门(最优先)
# 检查是否有陌生公钥
cat ~/.ssh/authorized_keys
发现不是自己添加的公钥,立刻删掉或清空文件。
2. 切断出网(可选但有效)
如果确定在清理,可以先临时封禁矿池端口,防止守护进程重新下载矿程序:
iptables -A OUTPUT -p tcp --dport 4444 -j DROP
iptables -A OUTPUT -p tcp --dport 3333 -j DROP
iptables -A OUTPUT -p tcp --dport 5555 -j DROP
iptables -A OUTPUT -p tcp --dport 14444 -j DROP
三、第二步:定位可疑进程
用 top 按 CPU 排序,找到占用最高的进程:
top -c
按 P 键按 CPU 排序,记下高占用进程的 PID 和完整命令。再用以下命令核实进程详情:
# 查看进程可执行文件真实路径(注意 /proc/PID/exe 指向)
ls -l /proc/PID/exe
# 查看进程启动命令
cat /proc/PID/cmdline | tr '\0' ' '
# 查看进程关联的网络连接(矿池 IP 就在这里)
ss -tnp | grep PID
重点检查这些常见隐藏位置:
ls -la /tmp
ls -la /var/tmp
ls -la /dev/shm
ls -la /root/.cache
crontab -l # 当前用户定时任务
cat /etc/crontab # 系统定时任务
ls -la /etc/cron.d/
ls -la /etc/cron.hourly/
挖矿病毒最常见的套路就是写一个定时任务,每几分钟检查一次矿程序在不在,不在就重新下载拉起。
四、第三步:杀进程、删文件、清定时任务
1. 强制结束挖矿进程
kill -9 PID1 PID2 PID3
2. 删除矿程序文件
先找到文件再删,别只看进程名:
# 找出所有可能是矿程序的文件
find / -name "xmrig*" -o -name "*minergate*" -o -name "*kdevtmpfsi*" 2>/dev/null
find /tmp /var/tmp /dev/shm -type f -size +1M 2>/dev/null
确认后删除:
rm -rf /tmp/xmrig /var/tmp/kworkerds /dev/shm/xxx
3. 清除恶意定时任务
crontab -e # 删除可疑行
crontab -r # 情况严重时直接清空当前用户定时任务
检查并清理系统级定时任务:
vim /etc/crontab
ls /etc/cron.d/ && rm -f /etc/cron.d/恶意文件名
4. 检查开机自启和后门
systemctl list-unit-files | grep -iE "miner|kdev|tmp"
ls -la /etc/init.d/
cat /etc/rc.local
发现可疑的 systemd 服务直接禁用删除:
systemctl disable --now 恶意服务名
rm -f /etc/systemd/system/恶意服务名.service
五、第四步:检查并封堵入侵入口
杀完病毒必须搞清楚是怎么进来的,否则很快会再次被入侵。最常见的入口按概率排序:
1. SSH 弱密码爆破
查看 SSH 登录记录:
grep "Accepted" /var/log/auth.log | tail -50
grep "Failed" /var/log/auth.log | wc -l
如果爆破失败记录非常多,说明你的密码不够强或已被扫到。处理方案:
# 禁用密码登录,只留密钥
vim /etc/ssh/sshd_config
# 修改为:
PasswordAuthentication no
PermitRootLogin prohibit-password
# 重启生效
systemctl restart sshd
2. Redis 未授权访问
如果服务器装了 Redis,检查是否未设密码:
redis-cli -h 127.0.0.1 ping
能直接返回 PONG 就危险了。设置密码并禁止公网监听:
redis-cli config set requirepass 强密码
# 配置文件里设置
bind 127.0.0.1
requirepass 强密码
3. Docker 暴露的管理端口
装了 Portainer、Kibana、Elasticsearch 等面板但没设强密码或没加防火墙,也是高危入口。检查开放端口:
ss -tlnp
把不必要的端口全部用防火墙封掉,只留 22、80、443。
4. Web 服务漏洞
网站程序(WordPress、ThinkPHP 等)有漏洞被 getshell。检查网站目录里有没有可疑文件:
find /www/wwwroot -name "*.php" -mtime -7 -newer /etc/passwd 2>/dev/null
grep -r "eval(\|base64_decode(" /www/wwwroot 2>/dev/null | head
发现可疑文件及时删除并升级程序补丁。
六、第五步:全盘排查,确保清干净
清理后建议再做一次全面扫描:
# 检查是否还有异常进程
top -c
# 检查是否有异常出网连接
ss -tnp | grep -vE "127.0.0.1|ESTAB"
# 检查所有用户的定时任务
for u in $(cut -f1 -d: /etc/passwd); do crontab -l -u $u 2>/dev/null; done
# 检查 SSH 公钥
find / -name "authorized_keys" 2>/dev/null -exec sh -c 'echo "== {} =="; cat {}' \;
# 检查可疑服务
systemctl list-units --type=service --state=running
确认干净后,最好再执行:
# 清理系统日志中的可疑痕迹不影响安全,但可以看看入侵者做了什么
grep -iE "wget|curl|chmod|/tmp" /var/log/auth.log | tail -30
七、第六步:加固,防止二次入侵
清完病毒一定要加固,否则等于白忙:
- SSH 改为密钥登录,禁用 root 密码登录;
- 修改默认 SSH 端口(可选,减少扫描骚扰);
- 安装 fail2ban,自动封禁爆破 IP:
apt install fail2ban # Ubuntu/Debian
yum install fail2ban # CentOS
systemctl enable --now fail2ban
- 防火墙默认拒绝,只放行需要的端口;
- 所有服务用强密码,Redis/MySQL/数据库禁止公网裸奔;
- 及时打补丁,Web 程序、面板、系统定期更新;
- 定期备份,万一再出问题可以直接恢复。
八、终极方案:重装系统
如果服务器里没有重要数据,或者病毒清理不彻底,重装系统是最省心的方案。VPS 控制台里一般都有"重装系统"按钮,几分钟搞定。重装后立刻做加固(密钥登录、防火墙、改密码),再恢复数据,比跟病毒斗智斗勇安全得多。
总结
挖矿病毒查杀流程记住六步:断网止损 → 定位进程 → 杀进程删文件 → 封堵入口 → 全盘排查 → 安全加固。核心是别只杀进程——挖矿病毒都有守护机制,必须同时清掉文件、定时任务和入侵入口,否则杀了还会再起。平时做好 SSH 密钥登录和防火墙,就能挡住 90% 的入侵。
