SSH 一直被暴力破解怎么办?fail2ban 与密钥登录加固实操 核心要点图解,SSH 暴力破解可通过 fail2ban 自动封禁 IP 有效缓解。;密钥登录比密码登录更安全,应禁用密码认证。;配置 fail2ban 需正确设置日志路径和封禁策略。;加固后务必测试新连接,避免锁死自己。
SSH 一直被暴力破解怎么办?fail2ban 与密钥登录加固实操 · 核心要点一图读懂(AegisX)

核心要点(TL;DR)

  • SSH 暴力破解可通过 fail2ban 自动封禁 IP 有效缓解。
  • 密钥登录比密码登录更安全,应禁用密码认证。
  • 配置 fail2ban 需正确设置日志路径和封禁策略。
  • 加固后务必测试新连接,避免锁死自己。

痛点引入:SSH 暴力破解频发,你的服务器安全吗?

最近查看服务器日志,是否发现大量来自陌生 IP 的 SSH 登录失败记录?这通常是暴力破解攻击的迹象。攻击者利用自动化工具尝试常见用户名和密码组合,一旦得手,你的服务器将面临数据泄露、勒索软件植入等风险。本文提供一套完整的实操方案,通过 fail2ban 自动封禁恶意 IP 和 密钥登录 加固认证方式,帮助你彻底解决 SSH 暴力破解问题。以下步骤均在 Linux 服务器上实测通过,请跟随操作。

一、分析日志,确认攻击规模

首先需要确认暴力破解的严重程度。SSH 登录日志通常位于 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL)。使用以下命令统计失败尝试:

sudo grep "Failed password" /var/log/auth.log | wc -l

查看最近攻击来源 IP 排名:

sudo grep "Failed password" /var/log/auth.log | awk '{print }' | sort | uniq -c | sort -nr | head -20

如果发现大量失败记录且来源 IP 分散,说明你的服务器正在被扫描和暴力破解。此时应立即采取行动。

二、安装与配置 fail2ban 自动封禁

1. 安装 fail2ban

根据系统类型执行:

  • Debian/Ubuntu: sudo apt update && sudo apt install fail2ban -y
  • CentOS/RHEL: sudo yum install epel-release -y && sudo yum install fail2ban -y

2. 创建本地配置文件

不要直接修改 jail.conf,而是创建 jail.local 覆盖默认设置:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

编辑 /etc/fail2ban/jail.local,在 [DEFAULT] 部分调整参数:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd

解释:bantime 为封禁时长(1小时),findtime 为检测时间窗口(10分钟),maxretry 为最大失败次数(5次)。可根据需要调整。

3. 启用 sshd 监控

在 jail.local 中找到 [sshd] 部分,确保 enabled = true,并指定日志路径(根据系统):

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
# CentOS 使用 logpath = /var/log/secure

4. 启动并验证

启动 fail2ban 并设置开机自启:

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

查看 sshd 监控状态:

sudo fail2ban-client status sshd

输出将显示当前封禁的 IP 数量及列表。你也可以手动测试:尝试用错误密码登录多次,然后检查该 IP 是否被加入封禁列表。

三、配置 SSH 密钥登录并禁用密码认证

1. 生成密钥对(本地操作)

在客户端机器上执行:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

按提示选择保存路径(默认 ~/.ssh/id_rsa)并设置密钥密码短语(推荐设置,增加安全性)。

2. 上传公钥到服务器

使用 ssh-copy-id 自动上传:

ssh-copy-id username@server_ip

或手动将公钥内容追加到服务器 ~/.ssh/authorized_keys 文件。

3. 测试密钥登录

尝试使用密钥登录:

ssh username@server_ip

如果无需输入密码即可登录,说明密钥配置成功。

4. 修改 SSH 配置禁用密码认证

重要:在修改配置前,保持当前 SSH 会话不退出,并另开一个会话进行测试。编辑 /etc/ssh/sshd_config:

PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

保存后重启 SSH 服务:

sudo systemctl restart sshd

使用新会话测试密钥登录,确认无误后再关闭旧会话。如果配置错误导致无法登录,可通过服务器控制台恢复。

四、验证加固效果与检查清单

完成上述步骤后,进行以下验证:

  • 使用错误密码尝试 SSH 登录,确认 fail2ban 是否在多次失败后封禁 IP(查看 fail2ban-client status sshd)。
  • 使用密码登录应被拒绝(提示 Permission denied)。
  • 使用密钥登录应成功,且无需输入密码(除非设置了密钥密码短语)。
  • 检查 SSH 端口是否暴露在公网,建议修改默认端口或使用防火墙限制访问源 IP。

检查清单:

项目状态
fail2ban 已安装并运行□
jail.local 中 sshd 已启用□
密码认证已禁用□
密钥登录测试成功□
备用登录方式(如控制台)可用□

五、进阶防护建议

除了 fail2ban 和密钥登录,还可采取以下措施:

  • 修改 SSH 默认端口(如 2222),减少自动化扫描。
  • 使用 AllowUsers 限制允许登录的用户。
  • 禁用 root 直接登录(PermitRootLogin no)。
  • 部署双因素认证(如 Google Authenticator)。
  • 使用防火墙(如 ufw、firewalld)限制 SSH 访问源 IP。

对于需要更高级防护的场景,可以考虑使用 AegisX 的云安全服务,它提供实时入侵检测和自动响应能力,能与 fail2ban 形成互补,进一步提升服务器安全水位。

行动建议

立即登录你的服务器,按照上述步骤配置 fail2ban 和密钥登录。建议先在测试环境演练,再应用到生产环境。加固后,定期检查日志和 fail2ban 状态,确保防护持续有效。安全是一个持续的过程,不要等到被入侵才后悔莫及。

常见问题(FAQ)

fail2ban 安装后需要修改哪些配置?

安装 fail2ban 后,主要修改 jail.local 文件。建议设置 bantime(封禁时长)、findtime(检测时间窗口)和 maxretry(最大重试次数)。对于 SSH,启用 [sshd] 模块并指定 logpath 为 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL)。配置后重启服务生效。

如何生成 SSH 密钥并配置免密登录?

在本地终端运行 ssh-keygen -t rsa -b 4096 生成密钥对(默认保存在 ~/.ssh/)。然后使用 ssh-copy-id user@server_ip 将公钥上传到服务器。之后即可免密登录。建议为密钥设置强密码短语,增加安全性。

禁用密码登录后如何防止自己被锁在外面?

在修改 SSH 配置前,务必保持一个已连接的 SSH 会话不退出,并另开一个会话测试新配置。修改 /etc/ssh/sshd_config 设置 PasswordAuthentication no 后,先重启 sshd 服务,用新会话测试密钥登录是否成功。确认无误后再关闭旧会话。

fail2ban 封禁的 IP 如何查看和解封?

使用 fail2ban-client status sshd 查看当前封禁的 IP 列表。解封特定 IP 可执行 fail2ban-client set sshd unbanip 。也可以直接编辑 /etc/hosts.deny 或使用 iptables 查看规则,但推荐使用 fail2ban 客户端命令管理。

除了 fail2ban 和密钥登录,还有哪些 SSH 加固措施?

还可以修改默认 SSH 端口(非必须但可减少扫描)、限制登录用户(AllowUsers)、禁用 root 直接登录(PermitRootLogin no)、使用双因素认证(如 Google Authenticator)、配置防火墙只允许特定 IP 访问 SSH 端口。综合措施能显著提升安全性。