
一台新服务器拿到公网 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 直登、只允许密钥、限制可登录账号、网络层收敛、保留日志和监控。二十分钟能做完,收益覆盖这台服务器的整个生命周期。
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法