你的服务器是不是突然变“慢”了?

风扇狂转、CPU飙到100%、账单莫名多出一大截——可你点开监控,业务请求量纹丝不动。别猜了,八成是被盯上了:有人正用你的服务器偷偷挖矿。

如何第一时间发现挖矿木马?

看CPU,但别只看“高不高”,要看“为什么高”。
业务空闲时CPU还在满载?打开 tophtop,扫一眼进程列表——有没有叫 kthreadd 却占着30% CPU的?有没有名字像 javanodepython 但根本不是你启动的?这些就是第一波嫌疑犯。

再敲一行 uptime。如果三个负载值(1/5/15分钟)全飘在 5 以上,而 ss -tn | wc -l 数出来的连接数才几十个,那基本可以确定:后台有东西在硬刚CPU。

接着跑 netstat -antp | grep -v 'ESTABLISHED'。重点盯那些连向境外IP、域名带 poolminerxmr 字样的连接。我上次帮一个做跨境电商的客户排查,就发现一个伪装成 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-checkerlog-cleaner 这种“合理但可疑”的服务

只要名字不熟、路径不对劲、描述含糊,先记下来。

系统关键位置应该怎么查?

挖矿程序不爱住客厅,专挑犄角旮旯安家:

  1. 启动脚本:翻 ~/.bashrc~/.profile,还有 /etc/profile.d/ 下所有 .sh 文件。找 curl http://... | shwget -qO- ... | bash 这类一键下载执行的命令。
  2. 临时目录/tmp/var/tmp 是重灾区。ls -la /tmp | grep '^-' 看有没有时间戳很新、权限为755的二进制文件。顺手 file /tmp/.X11-unix 确认下是不是真Unix套接字——还是某个挖矿程序的马甲。
  3. 内存文件系统/dev/shm 不走磁盘,杀软扫不到。ls -la /dev/shm/,如果看见 minerxmrig 或一串随机字母命名的文件,基本没跑了。

上个月帮一家做SaaS的公司处理过,他们在 /opt 下发现一个叫 .mysql_backup 的隐藏目录,里面放着 xmrig 配置和一个伪装成 MySQL 日志的 shell 脚本。攻击者就是从一个没关掉的测试 Redis 实例溜进来的。

清除木马的具体操作步骤是什么?

按这个顺序来,少走回头路:

  1. 先拔网线(或关防火墙出口规则):不让它继续连矿池,也防它反向拉新马。
  2. 拆掉所有“复活按钮”:删 crontab 里的恶意行、systemctl disable xxx.service && rm /etc/systemd/system/xxx.service、清空 /etc/rc.local 里异常内容。动手前 cp 备份。
  3. 再动手杀进程ps aux | grep -E '(xmrig|kthreadd|sysupdate)' 找PID,kill -9 <PID>;然后 ls -l /proc/<PID>/exe 看真实路径,rm -f 彻底删除;顺手 rm -f 它的配置、日志、.so 插件。
  4. 查人查钥匙cat /etc/passwd | tail -10 看有没有最近加的陌生用户;cat ~/.ssh/authorized_keys/root/.ssh/authorized_keys 里有没有你不认识的公钥。
  5. 打补丁apt update && apt upgrade -yyum 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%的同行多踩了一道雷。