
核心要点(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/secure4. 启动并验证
启动 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 端口。综合措施能显著提升安全性。