一台 22 端口对公网的 CentOS 7,last -i 里出现 45.148 段的成功登录,随后 crontab 里多了挖矿脚本,secure 日志里是几千条 Failed password 之后跟一条 Accepted password for root。

排查方向其实有限,先把可能性排一排。root 允许密码登录且口令很弱,被字典跑开。另一种情况是fail2ban 只统计 invalid user,root 的失败次数不算在内,永远触发不了封禁。

不容易想到的是,登录后的会话里改了 authorized_keys,留了长期后门。

第一件事是把登录与后续动作理清

last -i | head -20; grep -i accepted /var/log/secure | tail

立刻关掉密码登录

sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config && sshd -t && systemctl reload sshd

再往下清掉后门与异常任务

crontab -l; cat /etc/cron.d/*; ls -l ~/.ssh/authorized_keys

末了按网段封禁来源

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=45.148.0.0/16 reject' && firewall-cmd --reload

当时还开着另一个排查窗口,两边日志对照着看才定位到。

别只看报错消失,验证要多做一步。last 里不再出现新 IP 的成功登录,authorized_keys 只剩自己的公钥,crontab 里只有已知任务,secure 日志里 Accepted 记录仅来自内网。

容易忽略的是,看到 Accepted 就要假设机器已经失守,光改密码不够;排查顺序是先断来源、再清后门、最后复盘,别先重启把现场洗掉。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189