你的服务器是不是突然变“慢”了?
风扇狂转、CPU飙到100%、账单莫名多出一大截——可你点开监控,业务请求量纹丝不动。别猜了,八成是被盯上了:有人正用你的服务器偷偷挖矿。
如何第一时间发现挖矿木马?
看CPU,但别只看“高不高”,要看“为什么高”。
业务空闲时CPU还在满载?打开 top 或 htop,扫一眼进程列表——有没有叫 kthreadd 却占着30% CPU的?有没有名字像 java、node、python 但根本不是你启动的?这些就是第一波嫌疑犯。
再敲一行 uptime。如果三个负载值(1/5/15分钟)全飘在 5 以上,而 ss -tn | wc -l 数出来的连接数才几十个,那基本可以确定:后台有东西在硬刚CPU。
接着跑 netstat -antp | grep -v 'ESTABLISHED'。重点盯那些连向境外IP、域名带 pool、miner、xmr 字样的连接。我上次帮一个做跨境电商的客户排查,就发现一个伪装成 systemd-journald 的进程,每天凌晨2点准时连上荷兰一个矿池地址——它甚至会等你下班后才开工。
挖矿进程为什么总是杀不死?
kill -9 之后三分钟,它又回来了。这不是你手速问题,是它早给自己铺好了退路。
它可能藏在 crontab 里,每5分钟拉一次;也可能注册成了 systemd 服务,名字起得像 nginx-helper;更狠的,直接往 /etc/rc.local 里塞了一行 nohup /tmp/.a &。有些还会替换掉 ps 命令本身,让你 ps aux 根本看不到它——你看到的只是它想让你看到的。
所以别急着 kill。先查复活开关:
crontab -l看当前用户ls /etc/cron.d/ /etc/cron.hourly/翻系统级定时任务systemctl list-unit-files --state=enabled扫启用的服务ls /etc/systemd/system/ | grep -E '\.(service|timer)$'看有没有名字像update-checker、log-cleaner这种“合理但可疑”的服务
只要名字不熟、路径不对劲、描述含糊,先记下来。
系统关键位置应该怎么查?
挖矿程序不爱住客厅,专挑犄角旮旯安家:
- 启动脚本:翻
~/.bashrc、~/.profile,还有/etc/profile.d/下所有.sh文件。找curl http://... | sh、wget -qO- ... | bash这类一键下载执行的命令。 - 临时目录:
/tmp和/var/tmp是重灾区。ls -la /tmp | grep '^-'看有没有时间戳很新、权限为755的二进制文件。顺手file /tmp/.X11-unix确认下是不是真Unix套接字——还是某个挖矿程序的马甲。 - 内存文件系统:
/dev/shm不走磁盘,杀软扫不到。ls -la /dev/shm/,如果看见miner、xmrig或一串随机字母命名的文件,基本没跑了。
上个月帮一家做SaaS的公司处理过,他们在 /opt 下发现一个叫 .mysql_backup 的隐藏目录,里面放着 xmrig 配置和一个伪装成 MySQL 日志的 shell 脚本。攻击者就是从一个没关掉的测试 Redis 实例溜进来的。
清除木马的具体操作步骤是什么?
按这个顺序来,少走回头路:
- 先拔网线(或关防火墙出口规则):不让它继续连矿池,也防它反向拉新马。
- 拆掉所有“复活按钮”:删 crontab 里的恶意行、
systemctl disable xxx.service && rm /etc/systemd/system/xxx.service、清空/etc/rc.local里异常内容。动手前cp备份。 - 再动手杀进程:
ps aux | grep -E '(xmrig|kthreadd|sysupdate)'找PID,kill -9 <PID>;然后ls -l /proc/<PID>/exe看真实路径,rm -f彻底删除;顺手rm -f它的配置、日志、.so插件。 - 查人查钥匙:
cat /etc/passwd | tail -10看有没有最近加的陌生用户;cat ~/.ssh/authorized_keys和/root/.ssh/authorized_keys里有没有你不认识的公钥。 - 打补丁:
apt update && apt upgrade -y或yum update -y,尤其盯紧 Redis、Nginx、Tomcat 这些常被利用的组件。
记住:先断后路,再砍脑袋。不然你杀十次,它活十一回。
如何防止服务器再次被入侵?
挖矿只是结果,漏洞才是入口。加固不是加戏,是救命。
密码马上改:系统 root、普通用户、MySQL、Redis、网站后台——所有密码今天就换。别用 admin123,也别用“密码+1”这种懒办法。
Redis 必须设密码:如果你还开着 bind 0.0.0.0 且没密码,等于在门口贴了张“请进,WIFI密码是123456”的纸。
端口只开该开的:firewall-cmd --list-ports(CentOS)或 ufw status(Ubuntu)看看,22、80、443 之外的端口,能关就关。
装个基础监控:不用 fancy 工具,就用 sar -u 1 5(看CPU趋势)、iftop -P tcp(看谁在狂发包),每天下班前花1分钟扫一眼,比啥都管用。
今天下班前就能做的紧急自查
现在,立刻,打开终端,SSH 连上你最担心的那台服务器,粘贴执行这四行:
echo "=== 高CPU进程 ===" && ps aux --sort=-%cpu | head -15
echo "=== 非常规外连 ===" && ss -tunp | grep -E ':80|:443' | grep -v 'ESTAB'
echo "=== 定时任务全貌 ===" && crontab -l 2>/dev/null; ls -la /etc/cron*/* 2>/dev/null | grep -E '\.sh|\.py|\.service'
echo "=== 最近创建的可执行文件 ===" && find /tmp /var/tmp /dev/shm -type f -perm /111 2>/dev/null | xargs ls -la 2>/dev/null | head -20
重点看三样:
ps结果里不认识的进程名ss输出中连向奇怪域名/IP的连接find列出来的/tmp下那些“昨天刚出生”的二进制文件
做完这四步,喝口水,你已经比90%的同行多踩了一道雷。