![数字锁与盾牌](https://blog.kbmp.club/upload/ssh.jpg) 一台新服务器拿到公网 IP 之后,快则几分钟,`/var/log/auth.log` 里就会开始出现来自各地的密码爆破记录。默认的 SSH 配置(root 可登录 + 密码认证)在这种环境下撑不住。 这篇记录我给服务器做 SSH 加固的完整步骤,重点是**操作顺序**——顺序错了会把自己锁在门外。 ## 第一步:建一个能 sudo 的普通用户 别拿 root 当日常登录账号。 ```bash adduser deploy usermod -aG sudo deploy ``` ## 第二步:配好密钥,再动配置 **这一步必须在禁用密码之前做完**,否则就是经典的自我锁死。 本地生成 Ed25519 密钥(比 RSA 更短更快,也没有那么多历史包袱): ```bash ssh-keygen -t ed25519 -a 100 -C "deploy@workstation" ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@服务器IP ``` 服务器上确认权限: ```bash chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ``` **验证**:另开一个终端,用 `deploy` 加密钥登录一次,确认能进、能 sudo。**确认之前不要关掉当前会话。** ## 第三步:改 sshd_config 确认密钥登录没问题之后,再动配置: ``` PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes PermitEmptyPasswords no MaxAuthTries 3 LoginGraceTime 30 AllowUsers deploy ``` 逐项说明: - `PermitRootLogin no`:禁止 root 直接登录,所有操作走 sudo,留审计痕迹。 - `PasswordAuthentication no`:直接干掉密码爆破的可能。 - `AllowUsers`:白名单,只有列出的账号能登,缩小爆破面。 - `MaxAuthTries` / `LoginGraceTime`:限制每次连接的尝试次数和未认证连接的存活时间。 改端口(`Port 2222`)能消掉 99% 的日志噪音,但那是**隐匿不是安全**,别把它当防御手段。 还有个坑:很多发行版现在用 `/etc/ssh/sshd_config.d/*.conf` 做配置覆盖,你改主文件可能被后面的 drop-in 盖掉。建议直接写成 drop-in 文件。 ## 第四步:改之前先做语法检查 **永远不要盲目重启 sshd。** ```bash sudo sshd -t # 无输出即语法正确 sudo systemctl reload sshd # reload 保留现有会话,比 restart 安全 ``` 操作流程: 1. 保持**当前会话不要关**(这是你的逃生通道) 2. `sshd -t` 检查语法 3. reload 4. **另开终端测试新登录** 5. 确认能进之后,再关旧会话 ## 第五步:fail2ban 兜底 即使只允许密钥登录,fail2ban 也能挡掉大量噪音;万一哪天临时开了密码认证,它就是最后一道防线。 ```bash sudo apt install fail2ban ``` ```ini # /etc/fail2ban/jail.d/sshd.local [sshd] enabled = true port = ssh maxretry = 3 bantime = 1h findtime = 10m ``` ```bash sudo systemctl enable --now fail2ban ``` 如果改了 SSH 端口,这里的 `port` 要跟着改。 ## 第六步:防火墙只放行需要的来源 ```bash sudo ufw allow from 你的IP to any port 22 sudo ufw enable ``` 有固定出口 IP 的话,只放行自己的网段是最省事的做法。 ## 怎么验证真的生效了 别靠感觉,用 `sshd -T` 看实际生效的配置: ```bash sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication' ``` 预期输出: ``` permitrootlogin no passwordauthentication no ``` 想进一步检查算法套件,可以用 `ssh-audit` 扫一下自己的服务,它会直接告诉你哪些算法该淘汰。 ## 三个别踩的坑 1. **先禁密码后配密钥**——锁死自己,只能去服务商控制台救。 2. **改了端口忘了改防火墙**——一样锁死。 3. **以为改端口就是安全**——它只减少日志噪音。 ## 小结 SSH 加固本质就是五件事:禁用 root 直登、只允许密钥、限制可登录账号、网络层收敛、保留日志和监控。二十分钟能做完,收益覆盖这台服务器的整个生命周期。