我的阿里云ECS服务器开了有三四年了,最近还是第一次中毒。从发现到解决花了三四天时间,就用流水账的方式记录一下这次的经历。
为什么会发现中毒了呢?其实是个巧合。最近发现ECS上的IPSec不工作了,于是乎找到配置教程准备卸载重装一遍。就在执行rm -f
的时候,系统提示-bash : rm: command not found
。WTF???
然后想方设法用yum reinstall coreutils
找回来了rm
,心想可能是系统太久没升级了(naive!)就顺手跑了个yum update
,400多个更新装了老半天,其中还失败了好多次,都是跑到一半失败退出了transaction还恢复不了。自我安慰:可能是更新包太多了所以卡住吧!
没想到这才是个开始。更新完后reboot,结果再也ssh不进去ECS了。ECS控制台看不到监控数据,基本可以判断系统在boot时就挂掉了。没办法,阿里云上提交工单,他们的24小时售后工程师还是很给力的,北京时间深夜到清晨都还在线,平均不到一刻钟就会处理和回复。又经过一顿折腾(改root密码登陆,挂载旧内核重启,通过GRUB
修改内核启动顺序)终于能进系统了,并且升级到了最新内核。
在我尝试继续解决IPSec卸载问题之前,不经意间看到阿里云的监控台上显示我的服务器CPU占用率100%。我终于意识到了事情有点不对劲,于是乎用top
看了下是哪个妖魔在吃CPU:[kthrotlds]
。看到这篇文章后我知道自己是中毒被别人当作矿机了。幸好这个病毒没有用动态库劫持top
不然我可能永远都不明白发生了什么。之前内核更新失败估计也是这个搞的鬼。
于是乎,杀毒!如果用他们的脚本就干掉了病毒那未免也太简单了。那个文章发布于三月份,现在已经快入冬,病毒早就完成了自我进化。这进程是剪不断理还乱,无论杀多少次都会再回来。这里省略无数的trial and error,后来找到了一篇很好的文章来帮助我排查问题,最后发现是因为这个病毒在系统多个位置写入cron
定时任务,包括但不限于/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.monthly
,/usr/local/bin/nptd
,具体内容我发在了GitHub上以供研究。虽然看不得全懂,病毒的大致思路是下载挖矿程序并允许,劫持动态库,写入cron定时任务以自我唤醒,更改SSH配置允许通过自己的公钥登陆,删除所有临时文件和隐藏log。
再次省略无数的trial and error,我最后拼凑了一个杀毒脚本,干掉了病毒(目前为止还没有复发)并且尽量把被它f**k up的文件(比如SSH配置)复原。
干掉病毒后该考虑如何防御了。网上的说法大多是病毒通过Redis配置漏洞攻击,但是我的服务器上没有Redis,所以病毒最初是怎么进来的仍然是个谜,也希望读者们能提供一点排查思路。不过我的ECS安全组配置的确很危险,内/公网所有进/出端口都是放行。(不要喷我。。。)连忙配置了规则,内网进方向全部拒绝,公网进方向只保留用得上的端口,具体可以参考下图:
又配置了一些资源的监控报警(安装阿里云的监控模块时还发现wget
被病毒干掉了。。。),因为之前还有过一次服务器被当作spam email的中转站所以特意加上了带宽的监控。具体参考下图:
如此一来,这次中毒事件就算告一段落,但愿我的报警规则永远不会被触发。。。
后记:其实发现IPSec不工作是因为升级到了iOS 13和macOS Catalina后,苹果改了一个认证规则,参考GitHub讨论。最后推荐一下这个repo,太好用了:hwdsl2/setup-ipsec-vpn。