1. 异常告警:CPU飙升至100%的紧急信号
那天早上我刚打开电脑,阿里云的告警短信就跳了出来:"您的ECS实例存在挖矿活动"。登录控制台一看,CPU使用率曲线直接顶到了100%红线,风扇狂转的声音仿佛在耳边响起。这种情况我太熟悉了——服务器十有八九中了挖矿病毒。
快速诊断三板斧我立即用SSH连上服务器,执行了三个救命命令:
top -c # 查看实时进程(按CPU排序) ps -eo pid,ppid,cmd,%cpu --sort=-%cpu | head -n 10 # 静态进程快照 netstat -antp | grep ESTABLISHED # 检查异常网络连接在top命令的输出里,一个叫xmrig的进程格外扎眼,它吃掉了98.7%的CPU资源。百度一查,这正是臭名昭著的Monero门罗币挖矿程序。更可疑的是,netstat显示它正在与某个境外IP保持长连接——典型的矿池通信特征。
2. 病毒溯源:Docker容器竟成突破口
2.1 定位病毒文件路径
通过进程PID找到执行文件位置:
ls -l /proc/22220/exe # 显示符号链接指向的真实路径输出显示/root/.cfg/xmrig,但直接用cd命令却进不去这个目录。这里有个坑:病毒文件其实藏在Docker容器内部。通过全局搜索才找到真实路径:
find / -name xmrig 2>/dev/null最终定位到/var/lib/docker/overlay2/xxx/merged/root/.cfg/xmrig——典型的容器内路径结构。
2.2 漏洞回溯:SSH弱密码惹的祸
检查最近的操作记录时,我发现三天前为了调试方便,做了个危险操作:
- 在Docker容器内安装了openssh-server
- 把容器的22端口映射到宿主机的2222端口
- 设置了弱密码"123456"
用历史命令一看就破案了:
docker run -p 2222:22 -e ROOT_PASSWORD=123456 some_image黑客通过暴力破解轻松入侵容器,然后利用容器逃逸漏洞感染了宿主机。更可气的是,病毒还修改了容器内的root密码,典型的"鸠占鹊巢"手法。
3. 彻底清除:斩草除根的操作指南
3.1 立即止损措施
首先紧急隔离问题容器:
docker stop suspicious_container # 停止容器 iptables -A INPUT -p tcp --dport 2222 -j DROP # 封禁漏洞端口3.2 病毒清理四步走
终止进程:
kill -9 22220 # 强制结束挖矿进程 pkill -f xmrig # 补刀所有相关进程删除病毒文件:
rm -rf /var/lib/docker/overlay2/xxx/merged/root/.cfg find / -name "*xmrig*" -exec rm -rf {} \; 2>/dev/null检查定时任务:
crontab -l # 查看当前用户任务 ls /etc/cron.* # 检查系统级任务清理SSH后门:
rm -f /root/.ssh/authorized_keys # 删除非法公钥 chmod 600 /root/.ssh/authorized_keys # 重置权限
3.3 深度检测技巧
用strace追踪可疑进程:
strace -p 22220 -o /tmp/xmrig_trace.log发现病毒还尝试连接了这些敏感路径:
/etc/ld.so.preload(动态链接库劫持)/etc/passwd(添加后门账户)/var/spool/cron/root(持久化任务)
4. 安全加固:从血泪史中总结的经验
4.1 Docker安全四原则
最小化暴露:永远不要映射SSH端口到公网。必须远程调试时,可以用:
docker exec -it container_name bash密码策略:容器内必须设置强密码,建议使用:
openssl rand -base64 12 # 生成随机密码资源限制:运行容器时添加限制:
docker run --cpus 2 --memory 2g ...镜像扫描:定期检查镜像漏洞:
docker scan your_image
4.2 宿主机的防护组合拳
关键文件监控:
auditctl -w /etc/passwd -p wa -k user_change auditctl -w /root/.ssh -p wa -k ssh_change入侵检测系统:
# 安装aide aideinit && mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db网络层防护:
# 封禁常见矿池端口 iptables -A OUTPUT -p tcp --dport 3333 -j DROP
5. 事后复盘:监控体系的升级方案
这次事件让我重构了监控策略,现在分享几个实用脚本:
异常进程检测脚本:
#!/bin/bash # 监控CPU异常进程 threshold=80 while true; do pid=$(top -bn1 | awk '/xmrig/ && $9>threshold {print $1}') [ -n "$pid" ] && alert "挖矿进程 $pid detected!" sleep 60 doneDocker安全巡检脚本:
docker ps --format '{{.ID}}' | while read id; do # 检查特权模式 docker inspect $id | grep -q Privileged.*true && echo "警告: 容器 $id 运行在特权模式!" # 检查敏感目录挂载 docker inspect $id | grep -q '/etc' && echo "警告: 容器 $id 挂载了/etc目录" done这次事件给我最深的教训是:安全没有捷径。那些为了省事留下的后门,最终都会变成黑客的康庄大道。现在我的每台服务器上都运行着这个监控看门狗,它已经帮我拦截了三次入侵尝试——安全防护,永远不嫌多。