给公网服务器看一眼 SSH 日志:24 小时 6000 多次爆破尝试,我是这样排查和加固的
服务器开在公网上,我一直知道会有人扫,但从没认真看过日志。这次顺手统计了一下,数字比想象中夸张,记录一下排查方法和加固思路。
一、先看有多少人在敲门
Ubuntu 24.04 上 sshd 的日志在 journal 里,服务名是 ssh:
sudo journalctl -u ssh --since “24 hours ago” --no-pager | grep -c “Invalid user”
我这台 2 核 2G 的机器,过去 24 小时返回 6195。再统计被试得最多的用户名:
sudo journalctl -u ssh --since “24 hours ago” --no-pager
| grep “Invalid user”
| sed -E ‘s/.Invalid user ([^ ]) from.*/\1/’
| sort | uniq -c | sort -rn | head
结果前几名是 ubuntu(759)、user(553)、admin(512)、dell(382)、debian(200)。另外针对 root 的密码失败有 4424 次。也就是说,扫描器基本是拿常见用户名加弱口令字典在撞,不挑目标。
二、看看自己的配置有没有被撞开的可能
不要只看 /etc/ssh/sshd_config,因为还有 sshd_config.d 里的片段,直接看生效值:
sudo sshd -T | grep -E “^(passwordauthentication|permitrootlogin|pubkeyauthentication|maxauthtries)”
我这台的输出是:密码登录 yes、root 登录 yes、公钥 yes、最大尝试 6。说明默认配置下,只要密码够弱,4424 次 root 尝试里就有可能中。我自己的密码不弱,但"靠密码够强"不是个好的防线。
三、加固步骤
- 先确认公钥登录能用。新开一个终端测试,不要关掉现有会话:
ssh -i ~/.ssh/your_key appuser@your-server
- 关闭密码登录和 root 直登。在 /etc/ssh/sshd_config.d/ 下新建一个文件,比如 01-hardening.conf:
PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
注意 sshd 对同一个选项是"先读到的生效",片段按文件名排序读取,所以名字要排在云厂商默认片段(如 50-cloud-init.conf)之前,改完用 sshd -T 验证。
- 改完先检查语法再重载,而不是重启:
sudo sshd -t && sudo systemctl reload ssh
- 装 fail2ban,对反复失败的来源临时封禁:
sudo apt install fail2ban
sudo tee /etc/fail2ban/jail.d/sshd.local <<‘EOF’
[sshd]
enabled = true
maxretry = 4
findtime = 10m
bantime = 1h
EOF
sudo systemctl restart fail2ban
Ubuntu 24.04 默认走 systemd journal,fail2ban 的 backend 设成 systemd 更稳。
四、踩坑提醒
- 改 sshd 配置前一定留一个已登录的会话,改错了还能救。云厂商控制台的 VNC 也是后路,但要提前确认你能登。
- 关了密码登录后,云控制台"重置密码"就不再能帮你进 SSH 了,私钥要备份好。
- 改 SSH 端口只能减少日志噪音,不算真正的防护;真正有用的是关密码、限来源。
- 如果安全组能只放行自己常用的出口地址,那是最省事的一层,但家里和其他网络的出口会变,要权衡。
五、小结
一台没做任何宣传的小服务器,一天也有六千多次登录尝试,说明"没人知道我的机器"这个想法不成立。排查只需要两条命令:journalctl 统计失败次数,sshd -T 看生效配置。加固三件事:公钥登录、关闭密码和 root 直登、fail2ban 兜底。顺序别反,先验证公钥,再关密码。
- 点赞
- 收藏
- 关注作者
评论(0)