大家好,我是老 J。
前几期讲的都是代码层面的性能问题,这一期聊点不一样的——服务器安全。
某天早上到公司,发现服务器 CPU 一直 100%。用 top 一看,一个陌生进程占满了 CPU。进程名叫 kworkerds——伪装成内核线程,但实际是挖矿程序。
这篇文章复盘了整个排查和清理过程。
一、发现异常
周一早上,钉钉群有消息:
“测试环境好像挂了,SSH 连不上。”
运维看了一眼监控:CPU 一直 100%,持续了一整晚。
我登录服务器(幸好还能连上),执行 top:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND29812 root 20 0 2569496 1.2g 1234 S 99.2 12.5 01:04 kworkerds29813 root 20 0 2569496 1.2g 1234 S 95.3 12.5 00:44 kworkerds
两个 kworkerds 进程,CPU 占了 100% 多。
这个名字伪装成内核线程 kworker(内核工作线程),多了个 ds 后缀,不仔细看很容易忽略。
二、排查过程
第一步:确认是挖矿程序
检查进程详情:
ls -al /proc/29812/exe
输出:
lrwxrwxrwx 1 root root 0 Jul 15 09:00 /proc/29812/exe -> /usr/local/bin/.systemd-core
文件藏在 /usr/local/bin/.systemd-core——一个隐藏目录下的隐藏文件,非常可疑。
把文件下载下来,用 strings 看内容:
strings /usr/local/bin/.systemd-core | grep -i "stratum"
输出中出现:
stratum+tcp://xmr.pool.minergate.com
确认是 XMR 挖矿程序(门罗币)。
第二步:找到入侵入口
查看了 /var/log/auth.log,发现大量失败 SSH 登录记录:
cat /var/log/auth.log | grep "Failed password"
发现 同一 IP 持续尝试弱密码,在某个时间点成功了:
Jul 14 03:15:23 server sshd[12345]: Accepted password for root from 192.168.1.100 port 54321 ssh2
被攻击者通过 SSH 弱密码入侵,植入了挖矿程序。
第三步:查看定时任务
检查 crontab:
crontab -l
输出:
*/5 * * * * /usr/local/bin/.systemd-core > /dev/null 2>&1
每 5 分钟执行一次恶意程序,即使手动 kill 了,5 分钟后又会重启。
还查了系统定时任务:
cat /etc/crontab
里面有:
@reboot root /usr/local/bin/.systemd-core
开机自启动!
三、清理过程
3.1 终止进程
# 杀掉所有恶意进程kill -9 29812 29813
3.2 删除恶意文件
# 删除恶意程序rm -f /usr/local/bin/.systemd-core# 检查其他可疑文件find / -name "*systemd*" -type f -mtime -7
3.3 清理定时任务
# 清理用户的 crontabcrontab -r# 清理系统 crontabsed -i '/systemd-core/d' /etc/crontabrm -f /etc/cron.d/systemd-corerm -f /etc/cron.hourly/systemd-core
3.4 检查启动项
# 检查 init.dls -la /etc/init.d/ | grep -i systemd# 检查 systemd 服务ls -la /etc/systemd/system/ | grep -i suspicious# 检查 rc.localcat /etc/rc.local
3.5 清理 SSH 后门
# 检查 authorized_keyscat ~/.ssh/authorized_keys# 检查是否有新用户被创建cat /etc/passwd | grep -E ":/bin/bash"
3.6 修改密码
# 修改 root 密码passwd root# 禁用 root SSH 登录# 编辑 /etc/ssh/sshd_configPermitRootLogin no# 重启 SSH 服务systemctl restart sshd
3.7 安装 fail2ban(防爆破)
# 安装 fail2banapt-get install fail2ban# 配置 SSH 防护cat > /etc/fail2ban/jail.local << EOF[sshd]enabled = trueport = sshfilter = sshdlogpath = /var/log/auth.logmaxretry = 3bantime = 3600EOFsystemctl restart fail2ban
四、服务器加固清单
服务器安全加固清单:1.禁用root远程登录2.使用密钥登录(禁用密码登录)3.修改SSH默认端口(22→其他端口)4.安装fail2ban(防暴力破解)5.定期更新系统和软件6.不要用弱密码7.限制su权限8.启用防火墙(只开放必要端口)9.监控CPU异常(挖矿程序的特征是CPU100%)
五、写在最后
这次入侵的根源,是一个简单的弱密码:
运维为了方便,把测试服务器的 root 密码设成了 123456。
这个密码只存在了 3 天,就被扫到了。
安全没有小事,弱密码 ≈ 开门揖盗。
# 排查命令速查# 1. 查看高 CPU 进程top -c# 2. 查看进程文件路径ls -al /proc/<PID>/exe# 3. 查看登录日志cat /var/log/auth.log | grep "Accepted"# 4. 查看定时任务crontab -lcat /etc/crontab# 5. 检查开机启动ls -la /etc/init.d/ls -la /etc/systemd/system/# 6. 查找恶意文件find / -name "*.core" -type f -mtime -7