
核心要点(TL;DR)
- 立即安装fail2ban并配置SSH监狱,自动封禁频繁失败的IP。
- 禁用密码登录,强制使用SSH密钥认证,从根本上杜绝暴力破解。
- 修改默认SSH端口并限制访问来源,可显著降低攻击面。
- 定期检查/var/log/auth.log和fail2ban日志,确保防护生效。
痛点引入:SSH 22端口被暴力破解的紧急应对
清晨收到监控告警:服务器CPU飙升,登录卡顿。登录后执行lastb | head -20,发现大量来自全球各地的失败登录记录,目标直指SSH 22端口。这是典型的SSH暴力破解攻击。如果不及时处理,不仅消耗资源,还可能被撞库成功导致数据泄露。本文将手把手带你用fail2ban自动封禁攻击IP,并强制密钥登录彻底加固SSH,让服务器恢复安宁。
第一步:确认攻击并分析日志
首先需要确认是否真的遭受了暴力破解。通过查看系统认证日志,可以快速定位攻击行为。
- Debian/Ubuntu:
sudo grep 'Failed password' /var/log/auth.log | tail -20 - CentOS/RHEL:
sudo grep 'Failed password' /var/log/secure | tail -20 - 实时监控:
sudo tail -f /var/log/auth.log(或secure文件)
如果输出中频繁出现类似Failed password for root from 192.168.1.100 port 12345 ssh2的记录,且IP分散,说明正在被暴力破解。同时,使用lastb命令可以查看所有失败的登录尝试列表。
第二步:安装配置fail2ban自动封禁
fail2ban能监控日志,自动封禁多次认证失败的IP,是应对暴力破解的利器。
安装fail2ban
- Debian/Ubuntu:
sudo apt update && sudo apt install fail2ban -y - CentOS/RHEL:
sudo yum install epel-release -y && sudo yum install fail2ban -y
配置SSH监狱
复制默认配置文件并修改:sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local,然后编辑/etc/fail2ban/jail.local,在[sshd]部分确保以下设置:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h
findtime = 10m对于CentOS,logpath改为/var/log/secure。保存后重启服务:sudo systemctl restart fail2ban。
验证状态
运行sudo fail2ban-client status sshd,查看当前封禁的IP数量和列表。也可以使用sudo fail2ban-client set sshd unbanip 1.2.3.4手动解封误判IP。
第三步:强制密钥登录,禁用密码认证
密钥登录比密码更安全,能从根本上防止暴力破解。以下步骤在本地和服务器上操作。
生成密钥对(本地)
在本地终端运行:ssh-keygen -t ed25519 -C "your_email@example.com",按提示保存密钥(默认~/.ssh/id_ed25519),可设置密码短语增加安全性。
上传公钥到服务器
使用ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip,输入密码后公钥会自动添加到服务器的~/.ssh/authorized_keys。也可以手动复制公钥内容到该文件。
测试密钥登录
运行ssh -i ~/.ssh/id_ed25519 user@server_ip,确认无需密码即可登录。务必在禁用密码前测试成功,避免锁死。
修改SSH配置禁用密码
编辑/etc/ssh/sshd_config,确保以下行:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes保存后重启SSH服务:sudo systemctl restart sshd。再次测试新会话,确认密码登录已被拒绝。
第四步:额外加固措施与检查清单
除了fail2ban和密钥登录,以下措施能进一步提升SSH安全性:
- 修改默认端口:编辑
/etc/ssh/sshd_config,将Port 22改为非标准端口(如2222),重启sshd,并更新防火墙规则。 - 禁用root直接登录:设置
PermitRootLogin no,使用普通用户登录后sudo提权。 - 限制访问来源:通过防火墙(如ufw或firewalld)只允许可信IP访问SSH端口。
- 启用双因素认证:安装Google Authenticator PAM模块,为SSH添加动态码验证。
- 定期更新:保持SSH服务端和系统补丁最新。
检查清单:
- fail2ban服务运行中,sshd监狱已启用。
- SSH密钥登录测试成功,密码认证已禁用。
- SSH端口已修改(可选),防火墙规则已更新。
- root登录已禁用,使用普通用户+sudo。
- 日志监控正常,无异常登录尝试。
在防护建议方面,可以考虑使用AegisX的入侵检测与自动阻断能力,实时监控SSH登录行为,对暴力破解源IP进行智能封禁,与fail2ban形成互补,构建多层防御体系。
行动建议:立即加固你的SSH
不要等到被入侵才行动。按照以上步骤,今天就去检查你的服务器:确认fail2ban是否安装并配置正确,强制使用密钥登录,并落实检查清单中的每一项。安全是一个持续的过程,定期审查日志和更新策略,才能让服务器在互联网中稳如磐石。
常见问题(FAQ)
如何确认SSH是否正在被暴力破解?
检查系统认证日志。在Debian/Ubuntu上运行`sudo grep 'Failed password' /var/log/auth.log | tail -20`,在CentOS/RHEL上运行`sudo grep 'Failed password' /var/log/secure | tail -20`。如果看到大量来自不同IP的失败登录记录,说明正在遭受暴力破解。也可以使用`lastb`命令查看失败的登录尝试。
fail2ban安装后需要哪些基本配置?
安装fail2ban后,主要配置`/etc/fail2ban/jail.local`文件。启用sshd监狱,设置`enabled = true`,并调整`maxretry`(最大重试次数,建议3-5)、`bantime`(封禁时间,建议1h或更长)、`findtime`(时间窗口,建议10m)。配置完成后重启fail2ban服务,并用`sudo fail2ban-client status sshd`检查状态。
如何生成SSH密钥并禁用密码登录?
在本地机器运行`ssh-keygen -t ed25519`生成密钥对,然后使用`ssh-copy-id user@server`将公钥上传到服务器。确认可以密钥登录后,编辑服务器上的`/etc/ssh/sshd_config`,设置`PasswordAuthentication no`和`PubkeyAuthentication yes`,然后重启sshd服务。务必在禁用密码前测试密钥登录,避免锁死自己。
修改SSH端口有什么注意事项?
修改SSH端口可以降低被扫描的风险,但并非绝对安全。编辑`/etc/ssh/sshd_config`中的`Port`指令,改为非标准端口(如2222),然后重启sshd。同时需要更新防火墙规则允许新端口,并确保SELinux(如果启用)允许新端口。修改后使用新端口连接测试,避免断开后无法重连。
除了fail2ban和密钥登录,还有哪些SSH加固措施?
可以限制SSH访问来源IP(通过防火墙或`/etc/hosts.allow`),禁用root直接登录(设置`PermitRootLogin no`),使用非特权用户登录后再su/sudo,启用双因素认证(如Google Authenticator),以及定期更新SSH服务端软件。此外,考虑使用证书认证或跳板机架构来集中管理访问。