
核心要点(TL;DR)
- 禁用密码登录并启用密钥认证是防御SSH暴力破解的根本措施。
- fail2ban能自动封禁多次尝试失败的IP,显著降低攻击面。
- 配置SSH仅允许密钥登录,并修改默认端口可减少自动化扫描。
- 定期检查日志并更新fail2ban规则,确保防护持续有效。
痛点:SSH 暴力破解为何防不胜防
服务器暴露在公网,SSH 端口每天都会收到成千上万次登录尝试。默认配置下,攻击者利用字典暴力破解弱密码,一旦得手,服务器即被入侵。你是否也在日志中看到大量 `Failed password`?本文将手把手教你用 fail2ban 和密钥登录加固 SSH,彻底解决暴力破解问题。
原理:暴力破解如何发生与 fail2ban 如何工作
SSH 暴力破解通常由自动化工具发起,它们不断尝试常见用户名和密码组合。fail2ban 通过监控日志文件(如 /var/log/auth.log),匹配失败登录模式,当某个 IP 在指定时间内失败次数超过阈值,便自动调用防火墙规则封禁该 IP。密钥登录则从根本上杜绝密码猜测,因为私钥几乎无法被暴力破解。
排查:确认是否正在被攻击
首先检查日志中的失败记录:
grep 'Failed password' /var/log/auth.log | tail -20
# 或 CentOS/RHEL
grep 'Failed password' /var/log/secure | tail -20如果输出大量来自不同 IP 的失败记录,说明正在被暴力破解。还可以用 `lastb` 查看失败登录列表,或统计攻击 IP 数量:
grep 'Failed password' /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head分步解决:fail2ban 安装与配置
安装 fail2ban
Debian/Ubuntu:`sudo apt install fail2ban`;CentOS/RHEL:`sudo yum install epel-release && sudo yum install fail2ban`。
配置 jail.local
创建 `/etc/fail2ban/jail.local` 文件,内容如下:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8参数说明:maxretry 为最大失败次数,bantime 为封禁秒数,findtime 为时间窗口。重启服务:`sudo systemctl restart fail2ban`。
验证状态
使用 `sudo fail2ban-client status sshd` 查看当前封禁的 IP 和统计信息。
分步解决:密钥登录加固
生成密钥对
在本地终端执行:`ssh-keygen -t ed25519 -C "your_email@example.com"`,按提示保存密钥。
上传公钥
使用 `ssh-copy-id user@server` 自动上传,或手动将公钥内容追加到服务器 `~/.ssh/authorized_keys`。
修改 SSH 配置
编辑 `/etc/ssh/sshd_config`,确保以下设置:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes重启 SSH:`sudo systemctl restart sshd`。注意:在禁用密码前,务必确认密钥登录成功,并保留一个已登录会话以防万一。
检查清单与对比
| 措施 | 作用 | 实施难度 |
|---|---|---|
| fail2ban | 自动封禁暴力破解 IP | 低 |
| 密钥登录 | 杜绝密码猜测 | 中 |
| 修改默认端口 | 减少自动化扫描 | 低 |
| 限制用户登录 | 缩小攻击面 | 低 |
完成上述步骤后,使用 `ssh -p 端口 user@host` 测试登录。建议定期检查 fail2ban 日志:`tail -f /var/log/fail2ban.log`。
行动建议
立即行动:1. 安装并配置 fail2ban;2. 启用密钥登录并禁用密码认证;3. 修改 SSH 默认端口;4. 定期审计日志。对于更高阶防护,可考虑 AegisX 的 SSH 安全加固方案,提供集中管理和实时威胁情报。
常见问题(FAQ)
如何检查SSH是否正在被暴力破解?
检查系统日志中的失败登录记录。使用命令 `grep 'Failed password' /var/log/auth.log`(Debian/Ubuntu)或 `grep 'Failed password' /var/log/secure`(CentOS/RHEL)。如果出现大量来自不同IP的失败记录,说明正在被暴力破解。也可使用 `lastb` 命令查看失败登录列表。
fail2ban如何配置以防护SSH?
安装fail2ban后,创建配置文件 `/etc/fail2ban/jail.local`,启用sshd监狱并设置参数:`[sshd] enabled = true`,`maxretry = 3`,`bantime = 3600`,`findtime = 600`。然后重启服务 `systemctl restart fail2ban`。这样10分钟内失败3次即封禁1小时。
如何设置SSH密钥登录并禁用密码认证?
首先生成密钥对:`ssh-keygen -t ed25519`,将公钥上传至服务器 `~/.ssh/authorized_keys`。然后编辑 `/etc/ssh/sshd_config`,设置 `PubkeyAuthentication yes`,`PasswordAuthentication no`,`ChallengeResponseAuthentication no`。重启SSH服务 `systemctl restart sshd`。确保密钥登录成功后再禁用密码,避免锁死。
修改SSH默认端口有什么好处?
修改默认端口(如从22改为2222)可以减少自动化扫描和暴力破解尝试,因为大多数攻击脚本只针对默认端口。编辑 `/etc/ssh/sshd_config` 中的 `Port` 行,重启服务。但需注意防火墙规则同步更新,且不能替代密钥认证等核心措施。
fail2ban误封了怎么办?
如果fail2ban误封了可信IP,可以使用 `fail2ban-client set sshd unbanip ` 解封。为避免误封,可将可信IP加入白名单:在jail.local的 `[sshd]` 段中添加 `ignoreip = 127.0.0.1/8 `。调整 `maxretry` 和 `findtime` 也可降低误封概率。