
核心要点(TL;DR)
- 立即用Fail2ban自动封禁暴力破解IP,降低风险。
- 禁用密码登录并强制密钥认证,彻底阻断爆破。
- 修改默认SSH端口并限制访问来源,减少攻击面。
- 定期审计日志与更新补丁,维持防护有效性。
痛点引入:SSH 22端口为何总被盯上?
如果你管理过公网Linux服务器,大概率在/var/log/auth.log里见过成片的Failed password for root。SSH 22端口是互联网上被扫描最频繁的端口之一,自动化爆破工具每秒可尝试数十个密码。一旦弱口令被攻破,服务器将沦为挖矿肉鸡或数据泄露源头。本文提供一套从紧急封禁IP到彻底启用密钥登录的完整加固清单,每步附带可执行命令,帮你快速止血并建立长效防护。
第一步:紧急封禁恶意IP,阻断持续爆破
发现爆破后,先封禁高频攻击IP,缓解日志膨胀和资源消耗。
1. 统计攻击IP并手动封禁
使用以下命令提取失败次数最多的IP(Debian/Ubuntu):
grep 'Failed password' /var/log/auth.log | awk '{print }' | sort | uniq -c | sort -nr | head -20CentOS/RHEL系统日志路径为/var/log/secure。得到IP列表后,用iptables或firewalld封禁:
iptables -I INPUT -s 1.2.3.4 -j DROP # 或 firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=1.2.3.4 reject'
注意:手动封禁仅治标,攻击IP会不断变化。
2. 部署Fail2ban自动封禁
安装Fail2ban并配置SSH规则:
apt install fail2ban -y # Debian/Ubuntu yum install fail2ban -y # CentOS
创建/etc/fail2ban/jail.local:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 86400 findtime = 600
重启服务并查看状态:
systemctl restart fail2ban fail2ban-client status sshd
Fail2ban会自动监控日志,多次失败的IP将被封禁24小时。这是阻断SSH暴力破解的第一道自动化防线。
第二步:修改默认端口与限制访问来源
降低攻击面,减少被扫描概率。
1. 更改SSH监听端口
编辑/etc/ssh/sshd_config,找到#Port 22改为Port 2222(选1024以上非知名端口)。同时更新防火墙规则:
firewall-cmd --permanent --add-port=2222/tcp firewall-cmd --reload
重启SSH前,保持当前会话活跃,用新端口测试连接:
ssh -p 2222 user@host
确认成功后再关闭22端口。
2. 限制来源IP访问
如果服务器仅对特定IP开放,可在sshd_config中添加:
AllowUsers user@192.168.1.* # 或使用防火墙 iptables -A INPUT -p tcp --dport 2222 -s 203.0.113.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -j DROP
此步骤能大幅减少暴露面,但需确保管理IP固定。
第三步:彻底禁用密码登录,强制密钥认证
密钥登录是抵御暴力破解的根本手段。
1. 生成并部署密钥对
本地生成密钥(推荐ed25519):
ssh-keygen -t ed25519 -C "admin@server"
将公钥上传至服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@host
测试密钥登录成功后再继续。
2. 修改SSH配置禁用密码
编辑/etc/ssh/sshd_config:
PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no PubkeyAuthentication yes AuthenticationMethods publickey
重启SSH服务:
systemctl restart sshd
关键:重启前保留一个活跃会话,另开终端测试密钥登录,防止被锁。
3. 可选:启用双因素认证
安装libpam-google-authenticator,配置PAM和SSH,实现密钥+动态码双因素,进一步提升安全性。
第四步:加固SSH服务配置与权限
细节配置减少潜在风险。
1. 禁用root直接登录
在sshd_config中设置:
PermitRootLogin no
使用普通用户登录后sudo提权。
2. 设置登录失败延迟与次数限制
MaxAuthTries 3 LoginGraceTime 30
减少每次连接的尝试机会。
3. 文件权限检查
确保~/.ssh权限为700,authorized_keys为600:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
避免权限过宽导致密钥失效或泄露。
第五步:持续监控与审计
加固后需建立监控机制,及时发现异常。
1. 日志实时监控
使用journalctl -u ssh -f或tail -f /var/log/auth.log观察登录事件。配置日志告警,如通过logwatch或fail2ban的邮件通知。
2. 定期检查失败登录
每周运行一次统计脚本:
grep 'Failed password' /var/log/auth.log | awk '{print }' | sort | uniq -c | sort -nr | head关注新增高频IP,及时加入黑名单。
3. 更新与补丁
保持SSH服务端和系统更新:
apt update && apt upgrade openssh-server -y # Debian/Ubuntu yum update openssh-server -y # CentOS
及时修复已知漏洞。
行动建议:立即执行加固清单
按照以下优先级行动:1)部署Fail2ban自动封禁;2)更改SSH端口并限制来源IP;3)配置密钥登录并禁用密码认证;4)调整SSH配置与权限;5)建立监控与更新机制。每完成一步,测试连接确保未被锁。对于需要更高级防护的场景,可考虑集成AegisX的实时入侵检测与自动响应能力,实现 SSH 暴力破解的秒级封禁与告警。安全是持续过程,定期复查配置与日志,让服务器远离爆破威胁。
常见问题(FAQ)
如何快速查看SSH暴力破解尝试?
使用命令 `grep 'Failed password' /var/log/auth.log | awk '{print }' | sort | uniq -c | sort -nr` 可统计失败登录的IP及次数。对于CentOS等系统,日志路径可能为/var/log/secure。定期分析日志有助于识别攻击模式。
Fail2ban如何配置自动封禁SSH爆破IP?
安装Fail2ban后,创建/etc/fail2ban/jail.local文件,启用[sshd]并设置maxretry=3、bantime=86400。重启服务后,Fail2ban会自动监控日志并封禁多次失败的IP。可通过`fail2ban-client status sshd`查看状态。
禁用密码登录后如何避免自己被锁?
在禁用密码登录前,务必先配置好SSH密钥登录并测试成功。修改sshd_config时保留一个活跃会话,用新终端测试密钥登录。确认无误后再重启sshd服务,并保留root权限的备用访问方式(如控制台)。
除了改端口和密钥登录,还有哪些加固措施?
可限制SSH访问来源IP(通过防火墙或sshd_config的AllowUsers),启用双因素认证,定期更新SSH服务端软件,使用Port Knocking技术隐藏SSH端口,以及部署入侵检测系统监控异常行为。
如何验证SSH加固是否生效?
使用`ssh -o PreferredAuthentications=password user@host`尝试密码登录,应被拒绝。检查Fail2ban日志确认封禁动作,使用`ss -tlnp | grep sshd`查看监听端口是否更改,并审查auth.log确认无暴力破解成功记录。