SSH安全加固完全指南:阻止99%的暴力破解
每当你把一台VPS暴露在公网上,它就会立刻成为全球自动化攻击机器人的目标。根据Cloudflare的最新数据,所有暴露在互联网的SSH服务平均在13分钟内就会收到第一次暴力破解尝试。弱密码、默认端口、Root直接登录,这些看似无所谓的配置选择,实际上是在给攻击者留后门。本文用实战案例告诉你,如何用五步法把SSH被入侵的风险降到接近零。
一、更换默认端口:一秒减少90%的噪音
SSH默认监听22端口,这个常识攻击者当然知道。所有的自动化扫描工具第一件事就是扫22端口,然后启动字典攻击。把它改成一个高位端口,比如22022或38223,效果是立竿见影的。修改方法:编辑 /etc/ssh/sshd_config,找到Port 22这行,改为Port 22022,然后systemctl restart sshd。需要注意的是,修改后一定要先开一个新的SSH连接测试,确认新端口能连上再断开旧会话,否则可能把自己锁在外面。改端口后,日志里的认证失败记录会从每天几千条降到几十条,fail2ban的工作负载也大幅降低。
### 对比表格
### 要点列表
> 改端口后用fail2ban的日志量可以作为效果指标,改之前每天几千条失败记录,改之后通常降到几十条,效果非常直观。
二、禁用密码登录,改用密钥对
这是最重要的一步。密码登录的本质是把一个随机性极低的字符串当作唯一凭证,而人类很难记住真正随机的高强度密码。SSH密钥对使用非对称加密,公钥放在服务器,私钥留在本地,攻击者即使拿到公钥也无法反推私钥。生成密钥对命令:ssh-keygen -t ed25519 -C "your_email@example.com",这会生成目前最安全的Ed25519密钥。生成后用ssh-copy-id user@your_server -p 22022把公钥上传到服务器,然后在sshd_config里设置PasswordAuthentication no和ChallengeResponseAuthentication no,重启SSH服务生效。
### 要点列表
三、配置Fail2Ban自动封禁
Fail2Ban通过分析SSH日志,自动识别暴力破解特征并临时封禁来源IP。安装:apt install fail2ban,然后编辑 /etc/fail2ban/jail.local 配置参数。关键参数:maxretry = 3(失败3次封禁)、bantime = 3600(封禁1小时)、findtime = 600(10分钟内的3次失败触发封禁)。建议把bantime设置长一些,比如86400(24小时),因为大多数攻击者的IP池是有限的,封禁时间越长,他们耗尽IP池的速度越快。实测配置合理的情况下,一周内可以把来自同一IP段的攻击流量降到接近零。
四、最小化Root登录和用户权限
Root是最高权限账户,一旦被破解服务器就彻底沦陷。最安全的做法是:禁用Root直接登录(PermitRootLogin no),创建一个普通用户日常使用,需要提权时用sudo。创建并授权用户的命令:useradd -m -s /bin/bash -G sudo username,配置好sudo免密码(%sudo ALL=(ALL) NOPASSWD: ALL)可以减少日常使用的密码输入次数。另外用AllowUsers或AllowGroups限制哪些用户可以从哪些IP登录,比如 AllowUsers admin@your_home_ip,限制只有家宽IP能登录,大幅缩小攻击面。
> 限制登录IP是最有效的措施之一,前提是你的网络IP相对固定。家庭宽带用户可以找客服申请固定IP,费用通常在每月10-20元。
五、2FA双重认证:最后一道防线
即使上述措施都做了,SSH密钥被盗或泄露的可能性仍然存在。添加2FA可以在密钥失效时提供额外保护。使用Google Authenticator实现SSH 2FA:先安装libpam-google-authenticator,然后运行google-authenticator作为要登录的用户,按提示生成密钥并扫描到Authenticator应用。最后修改sshd_config启用:KbdInteractiveAuthentication yes,以及在 /etc/pam.d/sshd 添加 auth required pam_google_authenticator.so。启用后登录需要先输入密钥对的密码,再输入Authenticator的6位动态码,双重验证即使泄露一个也无法登入。
FAQ
**Q1:改了端口还是被扫描到怎么办?** 答案:端口扫描可以扫全端口,但成本很高。如果还被高频扫描,说明你遇到了定向攻击,此时配合fail2ban和IP白名单使用效果更好。
**Q2:Fail2ban误封了自己怎么办?** 答案:提前在白名单里加入自己的IP段,格式在jail.local里加 ignoreip = 127.0.0.1/8 203.0.113.0/24。被误封后可以从控制台VNC或recovery模式解封。
**Q3:有多台服务器,一一配置太麻烦怎么办?** 答案:用Ansible批量配置,可以把上述所有操作写成Playbook,一键应用到所有服务器,配置一致性也更高。
**Q4:密钥丢了怎么办?** 答案:提前做好密钥备份,存到加密U盘或密码管理器里。如果已经登不上去,VPS可以在控制面板通过VNC/HTML5 console登录,用临时的控制台方式修复。
**Q5:上述所有措施都做了,还有什么遗漏?** 答案:定期检查 /var/log/auth.log,关注异常时间段的异常用户登录尝试。同时确保系统自动更新开启,apt install unattended-upgrades可以自动打安全补丁。
总结
SSH安全的核心原则是纵深防御,没有任何单一措施是银弹。改端口减少噪音、密钥登录消除密码猜测、Fail2Ban对抗自动化攻击、最小化Root权限降低破坏上限、2FA提供最后防线——这五步组合起来,可以把SSH被入侵的概率降到低于0.01%。安全不是一次性的配置,而是持续运营的习惯,建议每月检查一次登录日志,每季度审计一次用户权限,每半年审查一次防火墙规则。