
核心要点(TL;DR)
- SSH 暴力破解可通过 fail2ban 自动封禁恶意 IP 有效缓解。
- 密钥登录比密码认证更安全,应禁用密码登录。
- 配置 fail2ban 需调整 jail.local 并启用 sshd 规则。
- 加固后使用 ssh -i 私钥登录并检查日志确认生效。
痛点:SSH 暴力破解为何防不胜防
如果你管理过暴露在公网的 Linux 服务器,大概率在 /var/log/auth.log 或 /var/log/secure 里见过密密麻麻的 Failed password for root。攻击者利用自动化工具全天候尝试常见用户名和弱口令,一旦得手,服务器就可能沦为挖矿肉鸡或数据泄露的跳板。仅靠改端口或强密码治标不治本,我们需要一套组合拳:fail2ban 自动封禁 + 密钥登录彻底关闭密码入口。下面从排查到加固,一步步带你实操。
第一步:确认攻击规模与日志位置
不同发行版的 SSH 日志路径不同,先定位日志文件:
- Debian/Ubuntu:
/var/log/auth.log - CentOS/RHEL:
/var/log/secure - 通用 systemd 系统:
journalctl -u sshd
快速统计失败次数最多的 IP:
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20如果输出显示大量来自同一 IP 的尝试,说明已遭遇暴力破解。此时不要急于手动封 IP,攻击源可能成千上万,交给 fail2ban 自动化处理。
第二步:安装并配置 fail2ban 自动封禁
2.1 安装 fail2ban
Debian/Ubuntu:
sudo apt update && sudo apt install fail2ban -yCentOS/RHEL(需 EPEL):
sudo yum install epel-release -y && sudo yum install fail2ban -y2.2 创建本地配置文件
不要直接修改 jail.conf,而是新建 jail.local 覆盖默认值:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local找到 [sshd] 段落,确保启用并调整参数:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600参数说明:maxretry 为最大失败次数,bantime 为封禁秒数(3600 即 1 小时),findtime 为检测时间窗口(600 秒内失败 3 次即封)。生产环境可适当延长 bantime 至 86400(一天)。
2.3 启动并验证
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd输出应显示当前封禁的 IP 数量。若为 0,可尝试用错误密码 SSH 登录几次,再查看状态确认封禁生效。
第三步:配置 SSH 密钥登录并禁用密码认证
3.1 生成密钥对(客户端操作)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"按提示保存密钥(默认 ~/.ssh/id_rsa),可设置密钥密码增加安全性。
3.2 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_server_ip若没有 ssh-copy-id,可手动将公钥内容追加到服务器 ~/.ssh/authorized_keys 文件中,并确保权限:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys。
3.3 修改 sshd_config 禁用密码登录
警告:修改前保持一个已登录的 SSH 会话不退出,以防配置错误锁死自己。
sudo vi /etc/ssh/sshd_config修改以下参数:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
PermitRootLogin prohibit-password保存后先检查语法:
sudo sshd -t若无报错,重启 SSH 服务:
sudo systemctl restart sshd另开终端使用密钥登录测试:ssh -i ~/.ssh/id_rsa user@your_server_ip,成功后再关闭旧会话。
第四步:加固后的检查清单
| 检查项 | 操作命令/方法 | 预期结果 |
|---|---|---|
| fail2ban 运行状态 | systemctl status fail2ban | active (running) |
| SSH 封禁规则生效 | fail2ban-client status sshd | 显示封禁 IP 列表 |
| 密码登录已禁用 | ssh -o PreferredAuthentications=password user@ip | Permission denied |
| 密钥登录正常 | ssh -i ~/.ssh/id_rsa user@ip | 成功登录 |
| 日志无新失败记录 | tail -f /var/log/auth.log | 无大量 Failed password |
第五步:进阶防护与行动建议
完成上述步骤后,SSH 暴力破解风险已大幅降低。还可叠加以下措施:
- 修改默认 SSH 端口(
Port 2222),减少自动化扫描骚扰。 - 使用
AllowUsers限制可登录用户。 - 部署防火墙(如 ufw/firewalld)仅允许可信 IP 访问 SSH。
- 启用双因素认证(如 Google Authenticator)作为额外屏障。
对于需要集中管理多台服务器的场景,可考虑使用 AegisX 的入侵检测与自动化响应能力,它能联动 fail2ban 类机制,实现更细粒度的封禁策略与告警通知,减少人工巡检成本。
行动建议:立即登录服务器,按本文步骤配置 fail2ban 并切换至密钥登录。完成后用检查清单逐项验证,并定期查看 fail2ban 日志,确保防护持续有效。
常见问题(FAQ)
fail2ban 安装后需要修改哪些配置才能防护 SSH?
安装 fail2ban 后,主要修改 /etc/fail2ban/jail.local 文件,启用 [sshd] 段落并设置 enabled = true,同时可调整 maxretry(最大失败次数)、bantime(封禁时长)和 findtime(检测时间窗口)。保存后重启 fail2ban 服务即可生效。
如何生成 SSH 密钥并配置免密登录?
在客户端运行 ssh-keygen -t rsa -b 4096 生成密钥对,然后使用 ssh-copy-id user@server 将公钥上传至服务器。之后编辑服务器端 /etc/ssh/sshd_config,设置 PubkeyAuthentication yes 和 PasswordAuthentication no,重启 sshd 服务即可实现密钥登录并禁用密码。
fail2ban 封禁 IP 后如何查看或解封?
使用 fail2ban-client status sshd 查看当前封禁的 IP 列表。要解封某个 IP,执行 fail2ban-client set sshd unbanip 。封禁记录通常保存在 /var/log/fail2ban.log 中,可通过日志审计。
修改 sshd_config 后如何避免把自己锁在外面?
修改配置前,先保持一个已登录的 SSH 会话不退出,然后另开终端测试新配置。使用 sshd -t 检查语法,确认无误后重启 sshd。如果新连接失败,可在原会话中回滚配置。建议先启用密钥登录并测试成功,再禁用密码认证。
除了 fail2ban 和密钥登录,还有哪些 SSH 加固措施?
可修改默认 SSH 端口、限制登录用户(AllowUsers)、禁用 root 直接登录(PermitRootLogin no)、使用防火墙限制访问源 IP、启用双因素认证(如 Google Authenticator),并定期更新 OpenSSH 版本以修复漏洞。