SSH 一直被暴力破解怎么办:fail2ban 与密钥登录加固实操 核心要点图解,SSH 暴力破解可通过 fail2ban 自动封禁恶意 IP 有效缓解。;密钥登录比密码认证更安全,应禁用密码登录。;配置 fail2ban 需调整 jail.local 并启用 sshd 规则。;加固后使用 ssh -i 私钥登录并检查日志确认生效。
SSH 一直被暴力破解怎么办:fail2ban 与密钥登录加固实操 · 核心要点一图读懂(AegisX)

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

CentOS/RHEL(需 EPEL):

sudo yum install epel-release -y && sudo yum install fail2ban -y

2.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 fail2banactive (running)
SSH 封禁规则生效fail2ban-client status sshd显示封禁 IP 列表
密码登录已禁用ssh -o PreferredAuthentications=password user@ipPermission 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 版本以修复漏洞。