
核心要点(TL;DR)
- 启用SSH密钥登录并禁用密码认证可从根本上防止暴力破解。
- fail2ban能自动封禁频繁尝试登录的IP,大幅减少攻击面。
- 配置fail2ban时需正确设置日志路径和封禁策略。
- 定期检查SSH日志和fail2ban状态是维持防护效果的关键。
痛点引入:SSH 22端口为何总被盯上
SSH 22端口是Linux服务器的默认管理入口,也是攻击者暴力破解的重灾区。每天都有大量自动化脚本尝试用常见用户名和弱密码登录你的服务器,一旦得手,数据泄露、勒索软件植入等风险接踵而至。本文提供一套经过实战验证的防护方案:通过fail2ban自动封禁攻击IP,并强制使用密钥登录,从根本上杜绝密码暴力破解。以下步骤均附带具体命令和检查清单,助你快速加固服务器。
原理与危害:暴力破解如何发生
攻击者利用字典和自动化工具,对SSH服务发起高频次的用户名/密码组合尝试。一旦猜中弱口令,即可获得服务器控制权。常见危害包括:植入挖矿木马、窃取敏感数据、作为跳板攻击内网。默认配置下,SSH允许密码认证且无失败次数限制,使得暴力破解成本极低。因此,必须从认证方式和访问控制两方面入手。
具体排查:确认是否正在被攻击
首先检查SSH日志中的失败登录记录。在Debian/Ubuntu上执行:
sudo grep 'Failed password' /var/log/auth.log | tail -20在CentOS/RHEL上执行:
sudo journalctl -u sshd -g 'Failed password' --since "1 hour ago" | tail -20如果输出中频繁出现不同IP的失败尝试,说明正在被暴力破解。此外,可使用lastb命令查看失败登录列表。统计攻击源IP数量:
sudo grep 'Failed password' /var/log/auth.log | awk '{print }' | sort | uniq -c | sort -nr | head根据结果决定是否立即启用fail2ban。
分步解决:fail2ban配置实战
1. 安装fail2ban
Ubuntu/Debian:sudo apt update && sudo apt install fail2ban -y;CentOS/RHEL:sudo yum install epel-release -y && sudo yum install fail2ban -y。
2. 创建本地配置文件
复制默认配置文件:sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local,然后编辑jail.local,在[sshd]段落下添加或修改:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3
bantime = 3600
findtime = 600参数说明:maxretry为最大失败次数,bantime为封禁时长(秒),findtime为检测时间窗口。建议根据业务调整。
3. 启动并设置开机自启
sudo systemctl enable fail2ban && sudo systemctl start fail2ban。检查状态:sudo fail2ban-client status sshd,应显示当前封禁IP列表。
4. 验证封禁效果
模拟失败登录(如使用错误密码),然后查看fail2ban日志:sudo tail -f /var/log/fail2ban.log,应出现Ban记录。
密钥登录配置:彻底告别密码
1. 生成密钥对
在本地终端运行:ssh-keygen -t ed25519 -C "your_email@example.com",按提示保存密钥(默认~/.ssh/id_ed25519)。
2. 上传公钥到服务器
使用ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip,或手动将公钥内容追加到服务器~/.ssh/authorized_keys。
3. 测试密钥登录
新开终端尝试ssh user@server_ip,应无需密码直接登录。保持当前会话不退出,以防配置错误。
4. 禁用密码认证
编辑/etc/ssh/sshd_config,设置:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no重启SSH服务:sudo systemctl restart sshd。再次测试密钥登录,确认无误。
检查清单与优化建议
- 确认fail2ban已启用并监控SSH日志。
- 使用
fail2ban-client status sshd定期查看封禁情况。 - 密钥登录测试通过后再禁用密码认证。
- 考虑修改SSH默认端口(非必须,但可减少扫描)。
- 启用防火墙,仅允许可信IP访问SSH端口。
- 定期更新系统和fail2ban版本。
对于需要更高级防护的场景,可考虑使用AegisX的入侵防御能力,实时阻断暴力破解行为,并提供可视化分析。
行动建议
立即执行以下步骤:1) 安装并配置fail2ban,设置合理的封禁策略;2) 生成并部署SSH密钥,禁用密码登录;3) 将上述检查清单纳入日常运维。完成这些后,你的SSH 22端口将具备基础免疫能力,暴力破解尝试将被自动拦截。
常见问题(FAQ)
如何查看SSH是否被暴力破解?
可以通过查看系统日志来确认。使用命令 `sudo grep 'Failed password' /var/log/auth.log`(Debian/Ubuntu)或 `sudo journalctl -u sshd -g 'Failed password'`(CentOS/RHEL)来筛选失败登录记录。如果出现大量来自不同IP的失败尝试,说明正在被暴力破解。
fail2ban安装后需要哪些基本配置?
安装后需创建jail.local文件覆盖默认配置,设置日志路径、封禁阈值和时长。例如:`[sshd] enabled = true port = ssh logpath = /var/log/auth.log maxretry = 3 bantime = 3600`。然后重启fail2ban服务使配置生效。
如何生成并部署SSH密钥对?
在本地终端运行 `ssh-keygen -t ed25519 -C "your_email@example.com"` 生成密钥对。然后使用 `ssh-copy-id user@server_ip` 将公钥上传到服务器。之后便可使用密钥登录,建议在服务器上禁用密码认证。
禁用密码登录后如何避免被锁在外面?
在修改SSH配置前,务必保持一个已连接的SSH会话不退出,并另开一个会话测试密钥登录。确认密钥登录成功后再禁用密码认证。同时建议在配置文件中设置 `PasswordAuthentication no` 并重启sshd服务。
fail2ban封禁IP后如何解封?
使用命令 `sudo fail2ban-client set sshd unbanip ` 可解封指定IP。若要查看当前封禁列表,可运行 `sudo fail2ban-client status sshd`。解封后建议检查该IP是否仍存在恶意行为。