上个月初,合作的那家社区团购小程序的边缘节点突然发来告警,CPU常年10%以内的三台轻量应用服务器,直接拉满到99.9%,连SSH登录都要等半分钟才能进去。我以为是业务峰值搞的,毕竟那段时间搞小龙虾预售预热,点开监控傻了眼——业务请求量波动和平时差不多,但有个叫xmr64-02的进程,占了三台机器几乎全部的8核8G里的CPU,内存还占了快2G。别不信,真的有80%的新手运维都栽过这种“低成本轻量服务器裸奔被扫挖矿”的坑,我刚入行那年,也因为忘了给腾讯云轻量改默认SSH端口、没禁用root远程登录,熬了整整一个通宵才把挖矿程序和后门彻底清干净,这次反而轻车熟路了。
现在先给你们说这次排查的流程,都是我这些年攒的最快能用的命令,不用翻官方文档一页一页找。首先登录进去(哪怕慢也要等,别直接重启,重启可能有些临时的挖矿进程没了,但定时任务和后门还在,过段时间又会跑),先用top -c看看进程详情,加上-c能看到完整的启动命令,光看top默认的进程名没用,很多挖矿程序会伪装成sshd、nginx这种常见进程。那次小龙虾预售的轻量节点,伪装的还挺像,但启动路径不对——真正的sshd在/usr/sbin/sshd,那台机器里有个/tmp/.systemd/xmr64-02,启动参数还连了个奇怪的国外矿池域名。
接下来要查这个进程的PID对应的文件路径,top -c里第一列就是PID,拿到PID比如是12345,直接用ls -l /proc/12345/exe,这个命令能直接看到进程真正的可执行文件位置,不管它怎么伪装。那次查了之后发现,除了/tmp/.systemd/里的主程序,还有/var/tmp/.cache/里的备份程序,/tmp/.ssh/里的恶意SSH密钥——估计是轻量节点原来有个弱密码的测试账号,被扫出来了,然后放了密钥留后门。
查到恶意文件之后,别着急删,先把进程杀掉,不然删了主程序它还会从备份里恢复。杀进程别只用kill 12345,很多挖矿程序有守护进程,杀了主进程守护进程会立刻重启。先用ps aux | grep 矿池域名或者矿程序伪装名把所有相关进程列出来,然后批量杀,批量杀的命令可以用ps aux | grep 'xmr64-02' | grep -v grep | awk '{print $2}' | xargs kill -9,grep -v grep是把我们自己的搜索命令过滤掉,awk '{print $2}'是只取PID列,xargs kill -9是强制杀掉所有PID对应的进程。

杀完进程之后,要把所有恶意文件彻底删掉,刚才用ls -l /proc/12345/exe、ps aux列出来的路径都要删,还要查定时任务——这是新手最容易漏掉的地方!查定时任务的命令有crontab -l(查当前用户的)、ls -l /etc/cron(查系统级的定时任务目录)、cat /var/spool/cron/(查所有用户的定时任务)。那次小龙虾的轻量节点,在/var/spool/cron/root里加了一条每分钟执行一次的脚本,路径是/var/tmp/.cache/start_miner.sh,这个脚本就是下载备份挖矿程序然后启动主程序的,还顺便把原来的SSH密钥备份里的恶意密钥删掉又加上了一遍,防止我们不小心删了主程序但忘了删定时任务。
删掉恶意文件和定时任务之后,还要检查SSH配置——禁用root远程登录,改成普通用户登录后用sudo su或者sudo -i切换;修改默认SSH端口,改成1024以上的非标准端口,比如22334;禁止密码登录,只允许SSH密钥登录,这样就算扫到了端口,没有密钥也登不进去。修改SSH配置的文件是/etc/ssh/sshd_config,打开之后找到PermitRootLogin改成no,找到Port改成22334,找到PasswordAuthentication改成no,改完之后用systemctl restart sshd重启SSH服务,重启之前一定要先开一个新的终端窗口测试一下新配置能不能登录,不然旧窗口关了就登不进去了,又要去云服务商后台重启服务器或者重置密码。
最后要说两个避坑提醒,第一个是千万别用弱密码!千万别用弱密码!千万别用弱密码! 重要的事情说三遍,哪怕是测试服务器,也别用123456、admin、root123这种弱密码,现在的扫描工具太厉害了,扫一遍1000个常用弱密码只需要几分钟。第二个是低成本轻量服务器别裸奔! 中小公司可能因为预算有限,舍不得买云服务商的安全产品,但至少要做一些基础的安全加固,比如禁用root远程登录、修改默认SSH端口、禁止密码登录、安装fail2ban这种工具防止暴力破解SSH端口。
你们在运维工作中有没有遇到过类似的坑?欢迎在评论区分享你的排查经验。

评论列表 (0条):
加载更多评论 Loading...