
核心要点(TL;DR)
- SSH 被爆破先看日志确认来源与频率,再上 fail2ban 自动封禁。
- 密钥登录可用后再禁用密码认证,避免把自己锁在门外。
- sshd 加固核心是禁 root 直登、降尝试次数、限用户与来源。
- 加固后必须新开终端验证登录,再关闭旧会话。
先别急着改配置:确认爆破的真实规模
SSH 端口被暴力破解几乎是所有公网服务器的日常。真正要做的不是慌,而是先量化:谁在打、打多频繁、有没有已经成功的痕迹。先看失败记录:
sudo grep "Failed password" /var/log/auth.log | tail -n 20
# CentOS/RHEL 系为 /var/log/secure
sudo grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head再确认是否存在成功登录的异常来源:
sudo grep "Accepted" /var/log/auth.log | tail -n 20
lastb | head -n 20如果失败量每天上万、来源 IP 分散,说明已被自动化字典扫描;若出现陌生 IP 的 Accepted 记录,要按入侵事件处理,先隔离再加固。
第一步:用 fail2ban 自动封禁爆破源
fail2ban 读取认证日志,按规则触发防火墙封禁,是止血最快的手段。安装并启用 sshd jail:
sudo apt install fail2ban -y # Debian/Ubuntu
sudo yum install fail2ban -y # CentOS/RHEL
sudo systemctl enable --now fail2ban不要直接改 jail.conf,新建覆盖文件 /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 你的办公IP
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
backend = auto重载并验证:
sudo fail2ban-client reload
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd banip 1.2.3.4 # 手动封禁测试如果 status 显示日志文件读取失败,多半是 logpath 与系统实际路径不符,或 sshd 走了 journald,此时把 backend 改为 systemd 并确认日志源。
第二步:改造为 SSH 密钥登录
fail2ban 只是拦截,密钥认证才是根治。本地生成密钥并上传:
ssh-keygen -t ed25519 -C "ops@example"
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server服务器端确认权限,权限过松会导致密钥被拒:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh关键顺序:先新开一个终端用密钥登录成功,再改 sshd 配置。编辑 /etc/ssh/sshd_config:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 30
AllowUsers deploy ops
ClientAliveInterval 300校验并重载,切勿直接 restart 掉线:
sudo sshd -t
sudo systemctl reload sshd保留当前会话不关,另开终端验证密钥登录与密码登录均符合预期后再退出。
第三步:收紧暴露面与来源限制
在云安全组或本机防火墙上只放行必要来源,能直接砍掉大部分扫描流量。以 ufw 为例:
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp
sudo ufw enable若使用非标准端口,记得同步 fail2ban 的 port 与防火墙规则。对必须保留密码登录的过渡期,可叠加 AllowUsers 与来源白名单,把攻击面压到最小。需要集中管理多台机器时,可考虑 AegisX 的主机安全基线核查与登录审计能力,把配置漂移和异常登录统一纳入监控。
上线检查清单与验证方法
| 检查项 | 期望结果 |
|---|---|
| fail2ban 状态 | sshd jail 为 enabled,封禁计数增长 |
| 密钥登录 | 新终端可免密登录 |
| 密码登录 | 被拒绝,提示 publickey |
| root 直登 | 被拒绝 |
| 日志异常 | 无陌生 Accepted 记录 |
验证命令:ssh -o PreferredAuthentications=password user@server 应失败;sudo fail2ban-client status sshd 应看到 Banned IP list。最后把 fail2ban 与 sshd 配置纳入版本管理,定期复查 lastb 与封禁趋势。
行动建议
今天就做三件事:先用日志确认爆破规模与是否有成功入侵;再上 fail2ban 止血并调大 bantime;最后完成密钥登录改造并禁用密码认证。加固不是一次性动作,建议每月复查一次 sshd 配置与登录审计,把最小权限和来源限制固化为基线。
常见问题(FAQ)
fail2ban 装了但 IP 还是被爆破,怎么回事?
多数是日志路径或后端不匹配导致 fail2ban 没读到记录。先执行 fail2ban-client status sshd 看当前封禁数与日志文件,确认 jail 里 logpath 与系统实际日志一致(如 /var/log/auth.log 或 /var/log/secure),再检查 sshd 是否用了非标准端口或 systemd 日志。改完执行 fail2ban-client reload 并观察封禁计数是否增长。
禁用密码登录后会不会把自己锁死?
只要先验证密钥能登录再禁用就不会。正确顺序是:上传公钥到 ~/.ssh/authorized_keys、设 600 权限、新开一个终端用密钥登录成功,然后才在 sshd_config 设 PasswordAuthentication no 并 reload。保留当前已登录会话不要关,验证失败可立即改回配置恢复。
SSH 换成非标准端口有用吗?
有用但只是降噪,不是安全边界。改端口能过滤大部分自动化扫描,显著减少日志噪音和爆破量,但针对性扫描仍能找到。建议与密钥登录、fail2ban 一起用,且改端口后记得同步防火墙规则与 fail2ban 的 port 配置,否则封禁规则可能不生效。
fail2ban 封禁的 IP 多久解封,能永久封吗?
默认 bantime 为 10 分钟,可按需调大。在 jail.local 中设 bantime = 1d 或 -1(永久),配合 findtime 与 maxretry 控制触发条件。永久封禁需注意误封风险,建议先设较长时限并开启 ignoreip 白名单,把自己的办公 IP 加入,避免运维入口被误封。
云服务器安全组和 fail2ban 需要都配吗?
建议都配,职责不同。安全组是网络层第一道门,可只放行必要来源与端口;fail2ban 在主机层根据日志动态封禁,能应对已放行端口上的爆破。两者叠加可减少主机负载与日志噪音,但安全组规则变更频繁时注意别把管理入口关掉。