太长不看版
能力有限,实在无法确定黑客是通过什么途径入侵的,所以只能亡羊补牢了,见服务器被入侵之后。
经过这件事,收获很多:
- 对于比较重要的服务,还是推荐买云服务器而不是轻量应用服务器,因为后者只能手动备份,真出事了估计很难有可用的备份
- 我也意识到,轻量应用服务器似乎面向的是个人项目,对安全或者稳定性要求都不太高的那种。
- 日志很有用,在自己写后端应用时,一定要输出日志。
- 每次 Docker 容器重新 build 之后,旧容器会被删除,容器内的日志也就没了,这导致我无法确认黑客是否是通过 API 容器入侵的(我在 12 月 6 号凌晨 1 点,也就是黑客入侵之后,重新生成过一次 API 容器)。应该将日志输出到容器外部保存
- 重视项目里的漏洞:NPM、Docker 镜像、APT 包
- Claude Code 很强大,它可以直接连接服务器,这样能做的事就很多了。
- 我用它对我的新服务器进行了安全审查,它确实提供了很多有用的建议,比如虽然我关闭了 SSH 的密码登录,但它查到服务器里有个自带的 cloud-init 会开启密码登录,于是我在 Claude Code 的帮助下关掉了 cloud-init 的 SSH 配置。
- 每当新服务器监控曲线出现异常时,我就让它上服务器去检查(属实是一朝被蛇咬十年怕井绳了),还真的可以检查出来原因。比如有一次凌晨 2 点,监控突发曲线异常,但 10 秒不到就全恢复了。我让 Claude Code 上去检查,它很快就分析出是 APT 在自动检查更新导致的。
- 现在是真的离不开 Claude Code 了,极大的提高了我的效率并弥补了我的短板。
愿大家的服务器都平平安安。🙏
12 月 7 号上午 11 点醒来,习惯性地打开手机查看消息,看到我的服务器厂商在凌晨 4 点给我发了条短信:检测到挖矿病毒,已删除。
当时心里一紧,但想着既然已经删了应该没事了吧?结果试了一下,我的服务崩了,SSH 连不上,云厂商的网页控制台也登不进去。看了一眼监控面板,凌晨 6 点的时候 CPU 从 2% 飙到 100%,内存从 84% 干到 97%,然后 6 点半开始就失联了。
我立刻意识到:这事儿没那么简单。
紧急应对
先重启了服务器,一切恢复正常。松了口气的同时,更多的疑问涌上心头:
- 黑客是怎么进来的?
- 我的数据有没有泄露?
- 还有没有留后门?
我首先联系了售后,得到的答复是 12 月 5 日下午 4 点半的时候有人执行了一条远程拉取病毒的命令,而我的备份是在这之前的,所以看来这台服务器是不能用了。
迁移数据到新服务器
被入侵的服务器是一台轻量数据服务器,不支持自动定时备份数据,而手动备份太麻烦,所以这一次我买了云服务器,然后把数据和服务迁移了过去。完事后测试了下,一切正常。
数据有没有泄漏?
分析了一下监控,可以看到这些异常波峰:
- 12 月 6 号凌晨 1 点,CPU 利用率和公网入带宽都有一个小波峰,猜测是在下载挖矿病毒
- 12 月 7 号凌晨 4 点,CPU 利用率、内存利用率、硬盘 IO 繁忙比率到顶,半小时后,CPU 利用率、内存利用率等数据缺失,猜测是挖矿病毒发力了,一下子把资源全部占满导致 SSH 连不上(我曾经也遇到过机 CPU 满载导致 SSH 连不上的情况)、我的服务被中断、云厂商的监控程序失联等,或者是黑客主动关闭了。
- 12 月 7 号上午 11 点,我重启了服务器,一切数据恢复正常。
在近 7 天的监控数据中,公网出流量始终保持在正常水平。在 12 月 7 号凌晨 4 点资源占用量飙升的那一刻起到 7 点时,公网出流量还跟往常差不多,但 8 点开始,下降到只有每小时 1 MB 流出,直到 11 点我重启了服务器之后再次恢复正常水平。猜测我的服务是在 8 点中断的,然后出去的那几 MB 数据估计是病毒在往外发挖矿数据。
但好消息是,能看出来黑客并没有转移服务器内的数据(比如拖库),好像真的就只是进来挖了个矿。
艰难的排查之路
虽然黑客很有可能会清除自己的痕迹,但我还是检查了一下看看有没有可疑的记录。
第一个怀疑:SSH 密钥泄露了?
虽然我出售前做了还原,但会不会是旧电脑上的 SSH 私钥泄露了?
查看 SSH 登录记录:
last -f /var/log/wtmp | head -50
所有登录记录都是我自己的 IP,没有陌生地址。再看失败的登录尝试:
lastb -f /var/log/btmp | head -50
确实有大量的暴力破解尝试,但都失败了。
检查 authorized_keys,只有一个密钥,最后修改时间是 2024 年 10 月 3 日,一直没被动过。
第二个怀疑:数据库暴露在公网?
我的数据库没有设置密码(因为觉得在 Docker 内网里应该安全),会不会是端口不小心映射出去了?
docker port my_db # 没有输出
netstat -tulnp | grep 10932 # 也没有
数据库的端口确实没有暴露到公网,只在 Docker 内网可访问。
第三个怀疑:有人创建了后门账户?
cat /etc/passwd | grep -E "/bin/bash$|/bin/sh$"
只有两个账户:root 和 lighthouse(应该是轻量应用服务器的监控用户),都是正常的。再看 sudo 权限配置,也没有异常。
第四个怀疑:定时任务被植入后门?
crontab -l
只有云厂商自己的定时任务:
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
检查了系统的各种定时任务目录,也没发现异常。
第五个怀疑:API 接口漏洞?
黑客似乎不是通过 SSH 或者后门进来的,但售后说 12 月 5 号下午 4 点半有人执行了恶意命令,而那段时间并没有人登录过 SSH,确认一下。
查看当天的 SSH 认证日志:
grep "Dec 5 16:" /var/log/secure | grep -E "Accepted|Failed"
16:30 前后确实没有任何 SSH 登录记录。难道黑客是通过我的 API 漏洞进来的?
排查过程中有个有意思的发现。我看到 12 月 5 日 16:02 有 SSH 登录和 Docker 容器操作的记录,心想:难道是黑客用我的密钥登录了?
仔细一看Docker镜像列表:
my-api latest 2025-12-06 01:36:17 +0800 CST ← 我 12 月 6 日部署的 <none> <none> 2024-12-05 16:02:40 +0800 CST ← 这是去年的!虚惊一场,原来那是去年(2024年)12 月 5 日的记录,不是今年的。当时还以为自己记错了时间,差点把自己吓一跳。
前面都是在 Cherry Studio 跟 AI 对话的方式来一步步排查的,但是既然涉及到代码,我就转为使用 Claude Code 了。
Claude Code 先是检查了一遍我的代码,发现 npm audit 显示有几个 NPM 包有比较严重的漏洞,可能会导致这个问题发生,但是我让它生成一段代码来重现,却始终不能成功入侵我的服务器。
在这个过程中,我寻思是不是可以让 Claude Code 自己连上我的服务器做检查,试了一下还真可以。我就看着它一步步检查我之前在服务器内检查过的地方:SSH 日志、SSH 密钥、各个地方的定时任务、/temp 目录、Docker 日志等,context 都跑满了,但结论还是没有找到可疑的地方。
同时,我也抛出了自己的疑问:就算黑客是通过 API 接口入侵的,但是 API 服务运行在 Docker 当中,黑客是怎么跳出 Docker 在我的服务器上运行命令的?得到的回答是 Docker 本身也会有漏洞,导致黑客可以逃逸出来。