先说结论:发现服务器被入侵,第一件事不是删文件,也不是急着重装。先隔离、留证据、找入口,再决定清理还是重装。顺序反了,你会丢掉判断依据,重装后照样被同一入口打进来。
下面这套顺序适用于常见的挖矿、webshell、SSH 爆破和面板入侵。命令以只读检查为主,执行前先给机器打快照;如果业务还在跑,先评估隔离对用户的影响。
先确认是不是真的被入侵
下面这些信号,单独出现不一定有事,同时出现两三个就要高度警惕:
- CPU 或内存长期打满,但业务量没变,负载里有一个陌生进程
- 出站连接异常:连着陌生 IP、矿池端口、大量 22/445/3389 扫描
- 出现陌生账号、陌生 SSH 公钥、没写过的定时任务
- 首页被改、被跳转、出现大量 SEO 垃圾页,或者目录里多了没见过的 PHP 文件
- SSH 登录失败暴增,或者有陌生 IP 登录成功
- 云厂商、CDN 或监管发来告警,说你的 IP 在对外攻击或发垃圾邮件
先别急着下结论。备份任务、监控 agent、CI 部署、定时爬虫也会制造高 CPU 和陌生连接。判断的关键是“这个东西是不是我装的、有没有记录、能不能解释”。
第一步:隔离,但不要关机
确认异常后,先控制影响面,同时保住现场:
- 打快照:在云控制台给系统盘和数据盘各打一个快照,命名带时间和“疑似入侵”。
- 断公网,留管理通道:安全组只放行你的管理 IP,或者把机器切到隔离网络。不要直接关机,内存里的进程、连接和临时文件会丢。
- 保留现场:进程列表、网络连接、登录记录、Web 日志、定时任务、账号列表、最近修改的文件,各存一份。
- 复制到机器外:把日志和检查结果打包传到另一台机器或对象存储,别留在被入侵的机器上。
- 记时间线:什么时候发现、做了什么操作、谁在处理。后面复盘和对外沟通都要用。
如果业务不能断,至少先把攻击来源 IP 封掉、把异常进程的网络权限断掉,再按下面的顺序查。不要一边查一边让机器继续对外提供服务。

第二步:看进程和网络
ps aux --sort=-%cpu | head -20
ss -lntup
lsof -i -P -n
ls -l /proc/<pid>/exe
tr '\0' ' ' < /proc/<pid>/cmdline; echo
重点看几类特征:进程路径在 /tmp、/dev/shm、/var/tmp;可执行文件显示 (deleted);进程名伪装成 kworker、sshd、mysql 但路径不对;监听端口是你没开过的;出站连接指向陌生国家的 IP。
挖矿进程通常会改 CPU 占用、连矿池、带看门狗。你杀掉一个,另一个会把它拉起来。所以看到挖矿,不要只 kill,先找它的父进程、定时任务和启动脚本。

第三步:查持久化
攻击者要长期待着,通常会留下开机启动或定时执行的东西。逐个查:
crontab -l
for u in $(cut -d: -f1 /etc/passwd); do echo "== $u"; crontab -l -u "$u" 2>/dev/null; done
ls -la /etc/cron.* /etc/crontab
systemctl list-unit-files --state=enabled
cat /etc/ld.so.preload
cat /etc/rc.local 2>/dev/null
还要看这些位置:/etc/profile.d/、~/.bashrc、~/.config/systemd/user/、/etc/init.d/、各用户的 authorized_keys。SSH 公钥是最容易被忽略的后门,尤其是 root 和 Web 用户的。
find / -name authorized_keys -type f 2>/dev/null -exec ls -l {} \;
/etc/ld.so.preload 里如果有一行陌生路径,说明有人在用动态链接库劫持系统命令,这种通常要重装。
第四步:查 Web 入口
大多数服务器被入侵,入口在 Web。先看访问日志里有没有异常请求,再找 webshell:
tail -n 5000 /var/log/nginx/access.log | awk '{print $1, $7, $9}' | sort | uniq -c | sort -rn | head -30
grep -rIl --include=*.php -E 'eval\(|base64_decode\(|assert\(|system\(|shell_exec\(|passthru\(' /var/www 2>/dev/null
find /var/www -type f -mtime -7 -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort
第一条看谁在打什么路径、返回什么状态码;第二条找可疑函数,误报会很多,要结合文件时间和业务代码判断;第三条找最近被改动的文件,重点看上传目录、缓存目录、主题插件目录和根目录下多出来的 PHP 文件。
同时核对应用版本:CMS、框架、插件、主题是不是有已知漏洞,最近有没有发过安全更新。如果入口是某个漏洞,光删 webshell 没用,补丁不打,下次还会被上传。
第五步:查账号和权限
awk -F: '$3==0 {print}' /etc/passwd
grep -rE 'NOPASSWD|ALL' /etc/sudoers /etc/sudoers.d/ 2>/dev/null
last -a | head -20
lastb | head -20
grep -i 'Accepted' /var/log/auth.log 2>/dev/null | tail -20
看有没有多余的 UID 0 账号、陌生 sudo 规则、异常登录记录。攻击者常把后门账号伪装成系统账号,或者直接往 authorized_keys 里塞公钥,后者比新建账号更隐蔽。
如果确认有陌生账号或公钥,先禁用而不是立刻删除,保留证据。等取证完成再清理。
第六步:查文件完整性和 rootkit
debsums -c 2>/dev/null | head -30 # Debian / Ubuntu
rpm -Va 2>/dev/null | head -30 # RHEL / CentOS
rkhunter --check --sk 2>/dev/null
chkrootkit 2>/dev/null | grep -i infected
这些工具能给线索,但不能证明机器干净。高级 rootkit 可以隐藏进程、文件和连接,扫描结果全部正常也不代表没被入侵。判断要看“入口是否明确、持久化是否清干净、有没有数据外泄迹象”,而不是只看扫描输出。
清理还是重装
| 情况 | 建议 |
|---|---|
| 确认拿到 root、发现后门或数据外泄 | 重装,不要清理 |
| 入口不明,持久化机制没查清 | 重装 |
| 测试机、低价值边缘节点 | 重装更快 |
| 入口明确、无提权和持久化、隔离观察通过 | 可清理,但必须持续监控 |
生产环境的原则很简单:只要攻击者拿到过 root,或者你无法证明他没拿到,就重装。清理看起来快,实际上你很难证明“已经清干净”,后面每次告警都会怀疑自己。

重装和恢复怎么做
- 保留快照和取证包,别急着释放旧机器。
- 用可信镜像重装,装完先打补丁、配防火墙、禁用密码登录,再暴露到公网。
- 数据从“已知干净”的备份恢复,恢复前扫描;不要把旧机器的二进制、面板插件、主题包直接拷回来。
- 轮换所有凭据:SSH 密钥、数据库密码、API Key、面板密码、云厂商 AccessKey、CDN 和 DNS 的 Token。
- 检查 DNS、CDN、对象存储、邮件配置有没有被改,攻击者常在这些地方留后手。
- 恢复后盯两周:登录失败、出站连接、CPU、文件变更、Web 访问异常。
加固清单
- 系统和应用补丁固定窗口,能开自动安全更新就开
- SSH 只允许密钥登录,禁用 root 密码登录,按需限制来源 IP
- 防火墙默认拒绝,只开放必要端口;面板、数据库、Redis 不对公网
- Web 层加 WAF 或 CDN 防护,上传目录禁止执行脚本
- 每个站点独立系统用户和 PHP-FPM pool,别用 root 跑应用
- 面板和 SSH 开 2FA,禁用不必要的危险函数和调试接口
- 日志集中收集,保留时间足够长;关键目录开文件完整性监控
- 备份离线保存,定期做恢复演练;备份账号和 production 权限分离
- 准备应急联系人:云厂商、DNS、CDN、支付、法务,出事时不用现找
常见问题 FAQ
Q1:把挖矿进程杀掉就行了吗?
不行。挖矿通常有守护进程、定时任务或启动脚本,杀一个会被拉起来。先找父进程和持久化,再决定清理还是重装。
Q2:一定要重装吗?
拿到 root、发现后门、入口不明、有数据外泄迹象,建议重装。清理只适合入口明确、没有提权、隔离观察通过的低风险场景,而且要继续监控。
Q3:旧备份还能用吗?
只用确认干净的备份。和被入侵机器同源、同账号、同挂载的备份,默认按不可信处理;恢复前扫描,恢复后继续观察。
Q4:怎么找到入侵入口?
从 Web 访问日志、应用版本、文件修改时间、账号登录记录四条线交叉比对。找到入口后先补漏洞,再谈清理,否则重装也会再中一次。
Q5:宝塔面板被入侵怎么办?
面板通常以 root 运行,面板被入侵等同于服务器被提权。按 root 失守处理,建议重装,并检查面板版本、弱密码、开放端口和插件来源。
Q6:要不要报警或通知客户?
如果涉及个人信息、支付数据或业务中断,按当地法规和合同处理,保留证据并咨询法务。不要为了“先恢复”把日志和快照删掉。
参考来源
- NIST SP 800-61r3:Incident Response Recommendations and Considerations
- CISA:StopRansomware Guide
- Ubuntu Security:漏洞与安全公告
总结
被入侵后的正确顺序是:隔离取证、看进程和网络、查持久化、查 Web 入口、查账号、评估是否重装。清理不是不能做,但你要能证明清干净了;证明不了,重装是成本最低的选择。平时把补丁、SSH、防火墙、备份和监控做好,比出事后的任何应急都便宜。
需要一台干净的机器做取证分析或重建验证,可以按小时开一台萤光云香港 CN2 VPS,和分析环境隔离,验证完再释放。







