Linux 服务器疑似被入侵怎么排查?挖矿进程、异常 cron、SSH 后门四步定位(2026)

服务器疑似被入侵时,正确的第一动作不是关机重装,而是「先隔离、保现场,再按进程 → 网络 → 持久化 → 账号四步定位」。 关机或直接重装会抹掉内存里的连接信息、进程树和临时落脚点,等于把取证线索烧了;而只删掉那个显眼的挖矿进程、不清持久化,攻击者下次重启就复活。四步走下来,你能定位到「怎么进来的、装了什么后门、从哪几个点再次启动」,再统一清理与轮换密钥。下面这套流程是我处理过几台被 SSH 爆破后植入矿机的机器时总结的,命令都可直接复制执行。

上面这段就是全文的结论块,可以直接拿走。下面是四步排查、清理轮换和预防。

入侵应急排查的四步定位

先保现场还是先断网?

结论:先隔离网络(保留现场),再取证排查——不要关机,也不要直接重装。

动作 该不该做 原因
立即 shutdown / 重装 不要 内存中的连接、进程、临时文件全丢
拔网线 / 云控制台断网 可以 切断 C2 通信,保留磁盘与内存现场
只 kill 掉挖矿进程 不完整 持久化没清,重启复活
改密码、清后门、轮换密钥 必做 被入侵后要假设所有凭据已泄露

如果机器还在运行,可以只封出站、留入站给你自己连(iptables/安全组只放行你的 IP 的 22 端口),这样既切断了它和 C2 的联系,你又能登录排查。

四步定位速览

入侵排查四步

第一步:看进程,找异常负载

步骤 1:查进程

# 按 CPU 排序,看谁在吃资源
$ ps aux --sort=-%cpu | head -15

# 看进程树,找被顶替的父进程
$ ps -ef --forest | head -40

# 直接翻 /proc 里那些「看不到路径」的进程
$ for p in /proc/[0-9]*; do
    exe=$(readlink "$p/exe" 2>/dev/null)
    [ -z "$exe" ] && echo "$p -> (exe 已删除或不可读) $(cat $p/comm 2>/dev/null)"
  done

挖矿木马的特征很鲜明:进程名模仿系统进程(kworker、[kthreadd],但混着小写或奇怪后缀)、CPU 长时间 100%、可执行文件路径显示 (deleted)(跑起来后把本体删掉躲检测)。/proc 那一圈是重点——readlink exe 返回空或 deleted,基本可以定性。

第二步:看网络,找外连矿池或 C2

步骤 2:查网络连接

$ ss -tunp                 # TCP+UDP,带进程
$ lsof -i -P -n | grep ESTABLISHED
$ curl -s https://ipinfo.io/1.2.3.4   # 把可疑外连 IP 查一下归属

重点看「ESTABLISHED 的外连,连向陌生公网 IP 的常见矿池端口(3333/4444/5555/7777/14444 等)」。正常的 VPS 不会主动长时间外连陌生地址。把可疑 IP 记下来,去威胁情报平台查一下是否为已知矿池——这是最直接的定性证据。

第三步:查持久化,找「重启后复活」的点

步骤 3:查持久化

这一步最容易被漏,也最关键。 逐处检查:

# 1) 定时任务(攻击者最爱的落脚点)
$ crontab -l; sudo crontab -l
$ ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/ 2>/dev/null
$ cat /etc/crontab
$ grep -r "curl\|wget\|base64" /etc/cron* 2>/dev/null   # 拉取式后门

# 2) systemd 服务(比 cron 隐蔽)
$ systemctl list-units --type=service --state=running
$ ls -la /etc/systemd/system/ /lib/systemd/system/ | grep -v '^total'

# 3) SSH 后门:塞进 authorized_keys
$ cat ~/.ssh/authorized_keys; sudo cat /root/.ssh/authorized_keys
$ ls -la /root/.ssh/

# 4) 预加载劫持(rootkit 常用,能隐藏进程和文件)
$ cat /etc/ld.so.preload

# 5) 启动项与 rc.local
$ cat /etc/rc.local 2>/dev/null
$ ls -la /etc/profile.d/

/etc/ld.so.preload 是最阴的一条:里面挂一个恶意 .so,就能把 ps、ls 看到的进程和文件藏起来——你 ps 看不到的东西,它未必不存在。看到这个文件非空,就要高度警觉。

第四步:查账号与登录痕迹

步骤 4:查账号与登录

# 有没有被偷偷加的 UID 0 账号
$ awk -F: '$3==0 {print $1}' /etc/passwd        # 期望只有 root
$ awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd   # 陌生普通账号

# 登录历史:谁从哪登过
$ last -n 30
$ sudo lastb -n 30        # 失败登录(爆破痕迹)

# 最近被改动的文件(缩小时间窗口)
$ sudo find / -mtime -2 -type f -not -path '/proc/*' -not -path '/sys/*' 2>/dev/null | head -40

# 攻击者留下的命令历史
$ cat ~/.bash_history; sudo cat /root/.bash_history

awk -F: '$3==0 {print $1}' /etc/passwd 只应该输出 root——多出任何账号,就是被加了后门账号。

清理与轮换(排查完才做)

# 1) 删除恶意进程、文件、cron、systemd 单元、authorized_keys 多余条目
# 2) 清空 /etc/ld.so.preload(若非空)
$ sudo sh -c '> /etc/ld.so.preload'

# 3) 用扫描工具复核一遍
$ sudo apt install -y rkhunter
$ sudo rkhunter --update && sudo rkhunter --check --sk

# 4) 假设全部凭据已泄露:轮换 SSH 密钥、API token、数据库密码

四个真会踩的坑

  1. 一发现就关机重装。 这是最贵的错误——现场没了,你永远不知道它是从哪个口子进来的,重装后同样的问题会再犯一次。正确做法是隔离网络、保留现场。
  2. 只删恶意文件,不查持久化。 挖矿木马通常有 cron + systemd + authorized_keys 三重保险,删一处,另外两处把进程拉起来。必须把第三步列的点全查干净。
  3. 忽略 ld.so.preload 与进程隐藏。 有些 rootkit 会让 ps/ls 撒谎。除了看 /proc,可以用静态编译的排查工具,或把可疑磁盘挂到另一台干净机器上离线分析——这比在被污染的机器上较劲靠谱。
  4. 入侵处理后不轮换密钥。 只要攻击者拿到过一次 root,就要默认所有密钥、token、数据库密码都泄露了:SSH 私钥重生成、云 API key 重置、.env 里的密码全换。只清文件不换凭据,等于留了一把复制出去的钥匙。

服务器入侵排查常见问题(2026)

Q:怎么判断是不是真的被入侵,而不是误报?
A:看三条硬信号——异常进程(路径含 (deleted)、伪装的系统进程名)、陌生公网外连(矿池端口 / 已知 C2 IP)、被新增的 UID 0 账号或 authorized_keys 条目。三条命中任意一条基本可定性;只凭「CPU 高」不够,也可能是你自己的服务在跑批。

Q:被入侵后最省事的做法是重装系统吗?
A:重装是结论,不是第一动作。 如果无法彻底确认清了所有后门,重装+从干净备份恢复确实是终局方案;但在重装前,先尽量定位入口(多半是弱密码 SSH 或未打补丁的服务),否则新系统同样会被打进来。

Q:怎么防止再次被入侵?
A:把入口堵死。绝大多数 VPS 入侵都是「22 端口弱密码被爆破」——按 SSH 加固五步关掉密码登录、上 fail2ban、限制来源 IP;再给机器配 探针监控,把 CPU 突增和异常流量设成告警,从「出事几周后才发现」变成「几分钟内就知道」。

Q:有没有一键排查工具?
A:rkhunter、chkrootkit、lynis 都能做自动化初筛,但它们基于已知特征、会漏新型后门,只能当辅助。真正的定位还是要靠上面四步人工核对——工具给的是线索,不是判决。

Q:排查时要不要保留日志?
A:要。/var/log/auth.log、~/.bash_history、进程列表、网络连接快照(ss -tunp > /tmp/net.txt)都先留存,再动手清理。清理是不可逆的,证据留存是可逆的——先存后删。

一句总结

入侵应急的核心顺序是「隔离 → 定位 → 清理 → 轮换 → 加固」,顺序错了就会毁掉现场或留下后门。四步定位(进程/网络/持久化/账号)覆盖了绝大多数挖矿与后门场景,而真正的教训往往只有一句:绝大多数 VPS 被入侵,都始于一个开着密码登录的 22 端口——事前加固十分钟,胜过事后排查一整天。

相关阅读

上一篇 Docker Compose 多服务编排实战:.env、健康检查、依赖顺序与一键迁移(2026)