SSH 22端口被暴力破解怎么办:云服务器登录加固实操 核心要点图解,仅改SSH端口不能阻止爆破,必须禁用密码登录改用密钥。;fail2ban按失败次数自动封禁IP,是低成本高收益的第一道防线。;加固前先确认无人在线会话,避免改配置把自己锁在服务器外。;允许root直接登录是最常见失守原因,应改为普通用户加sudo。
SSH 22端口被暴力破解怎么办:云服务器登录加固实操 · 核心要点一图读懂(AegisX)

核心要点(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-ip

2. 修改 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/secure
sudo 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兜住意外暴露的窗口。