
核心要点(TL;DR)
- 仅改SSH端口不能阻止爆破,必须禁用密码登录改用密钥。
- fail2ban按失败次数自动封禁IP,是低成本高收益的第一道防线。
- 加固前先确认无人在线会话,避免改配置把自己锁在服务器外。
- 允许root直接登录是最常见失守原因,应改为普通用户加sudo。
早上打开监控,发现 /var/log/auth.log 里一夜之间多了几万条 Failed password for root,登录IP来自十几个国家——这是几乎所有暴露在公网的云服务器都会遇到的场景。SSH 22 端口被暴力破解本身不可怕,可怕的是你还在用弱密码和 root 直登。本文按「先确认是否已失守,再逐层加固」的顺序,给出可直接复制的命令与检查清单,目标是半小时内把爆破面收窄到接近零。
一、先判断:是噪音,还是已经被攻破
不要急着改配置,先花五分钟确认现状。爆破失败只是噪音,一旦出现「失败很多次后成功一次」,性质就完全不同。
# 查看失败登录来源统计(Top 20)
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 查看失败记录
sudo lastb | head -20
# 查看成功登录记录,重点看陌生IP
last -a | head -20
sudo grep "Accepted" /var/log/auth.log | tail -20同时检查持久化后门,这是判断是否失守的关键:
crontab -l与ls /etc/cron.*是否有陌生定时任务;cat ~/.ssh/authorized_keys是否出现你不认识的公钥;awk -F: '==0' /etc/passwd是否有异常 UID 为 0 的账户。
若发现陌生成功登录或后门,先做快照取证、再重置全部密钥与密码,不要直接删日志。若只是失败记录,进入下一步加固。
二、加固第一步:备份配置并保留在线会话
SSH 加固最常见的翻车方式是改错配置后重启 sshd,把自己锁在门外。务必遵守两条铁律:改前备份,改时不要关闭当前会话。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
# 另开一个终端保持连接,验证新配置可用后再退出
sudo sshd -t # 语法检查,无输出即通过同时确认云控制台的 VNC / 救援模式可用,这是最后的兜底通道。
三、核心动作:禁用密码登录,改用密钥
这是防爆破收益最高的一步。密码登录一旦关闭,爆破脚本再多的尝试也全部无效。
1. 本地生成密钥并上传
ssh-keygen -t ed25519 -C "ops@example"
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@your-server-ip2. 修改 sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
ChallengeResponseAuthentication no
MaxAuthTries 3
LoginGraceTime 20
AllowUsers deploy其中 PermitRootLogin no 配合普通用户加 sudo,是阻断 root 直登爆破的关键;MaxAuthTries 3 压缩单连接尝试次数,显著降低爆破效率。
sudo sshd -t && sudo systemctl restart sshd
# 新开窗口用密钥登录验证,成功后再关闭旧会话四、第二道防线:fail2ban 自动封禁
密钥登录已经挡住大部分爆破,但日志噪音和连接资源消耗仍在,用 fail2ban 按行为动态封禁来源IP。
sudo apt install fail2ban -y # Debian/Ubuntu
sudo yum install epel-release fail2ban -y # CentOS/RHEL新建 /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
ignoreip = 127.0.0.1/8 你的办公出口IP
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
# CentOS/RHEL 改为 /var/log/securesudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd日志路径写错是 fail2ban 不生效的头号原因,务必按发行版确认。
五、第三层收口:来源IP与端口收敛
| 措施 | 作用层 | 效果 | 注意事项 |
|---|---|---|---|
| 安全组仅放行固定IP | 网络层 | 最强,直接不可达 | 出口IP变动需及时更新 |
| 修改默认端口 | 主机层 | 减少扫描噪音 | 不能替代密钥认证 |
| fail2ban 动态封禁 | 主机层 | 抑制持续爆破 | 需正确配置日志路径 |
| 禁用密码+禁root | 认证层 | 爆破基本失效 | 必须保留兜底通道 |
在云安全组中把 22 端口来源限制为办公出口IP或跳板机IP,是最省事的一层。若需要公网可达,可考虑在主机侧叠加连接频率限制,或使用具备登录防护与异常行为告警能力的安全产品统一收敛入口,例如 AegisX 提供的服务器登录安全能力,可在不改动业务的前提下补充爆破检测与阻断。
六、加固后检查清单
- 新窗口用密钥登录成功,密码登录被拒绝;
sshd -T | grep -E "passwordauth|permitrootlogin"输出符合预期;fail2ban-client status sshd显示已封禁IP数量在增长;lastb中失败记录不再暴涨,或来源已被封禁;- 云控制台 VNC 可正常登录,兜底通道有效;
- 配置备份文件已留存,变更记录写入运维文档。
行动建议:今天就完成「禁用密码登录 + 禁 root 直登 + fail2ban」三件事,再把安全组来源收紧到你常用的几个IP。爆破不会停止,但只要认证层守住,22 端口的告警就只是背景噪音,而不是事故前兆。
常见问题(FAQ)
把SSH端口从22改成其他端口,能彻底防住暴力破解吗?
不能。改端口只能减少扫描器命中率,属于降低噪音而非安全加固。攻击者做全端口扫描后仍能找到新端口,且一旦你继续使用密码登录,爆破照样成功。正确顺序是先禁用密码登录、改用密钥认证,再考虑改端口和限制来源IP,三者叠加才有意义。
禁用密码登录后,万一密钥丢失怎么办?
提前准备兜底通道:在云厂商控制台保留VNC或救援模式登录能力,加固时不要关闭当前已连接的SSH会话,另开一个窗口验证新配置。同时把公钥备份到密码管理器和本地离线介质。若已彻底锁死,可通过控制台的救援模式挂载系统盘,改回sshd_config中的PasswordAuthentication。
fail2ban会不会把我也封了,导致无法登录?
有可能,尤其是你自己输错密码多次时。部署时务必把公司出口IP、跳板机IP加入ignoreip白名单,并先用bantime较小的值观察几天。日志路径要按发行版确认,Ubuntu多为/var/log/auth.log,CentOS/RHEL为/var/log/secure,路径写错会导致规则完全不生效。
怎么判断服务器已经被爆破成功了?
查三个地方:lastb与journalctl中的失败记录是否有随后成功的登录,/var/log/auth.log里是否有陌生IP的Accepted publickey或password,以及crontab、authorized_keys、/etc/passwd是否出现陌生条目。发现异常应先隔离快照取证,再重置所有密钥与密码,不要直接删日志。
云安全组限制22端口只允许我的IP,还需要fail2ban吗?
建议保留。安全组是网络层白名单,效果最好,但你的出口IP变化(家庭宽带、移动办公)时容易把自己挡在外面;fail2ban则在主机层按行为动态封禁,两者互补。若IP固定,优先用安全组收紧,再用fail2ban兜住意外暴露的窗口。