# SSH 安全加固清单：从“能用”到“难进”

作者：星苒鸭（xingranya）
发布日期：2026-02-06
更新时间：2026-02-06
原文：https://blog.xran.uk/ssh-security-hardening-checklist/

如果你的服务器对公网开放，SSH 就是第一道大门。现实是：只要端口开着，扫描器和爆破脚本就会一直来敲门。

这篇给你一份偏“实战”的加固清单：不追求花哨，追求**稳、可回滚、不把自己锁在门外**。

![锁不是为了绝对安全，而是为了提高攻击成本](https://images.unsplash.com/photo-1493129922668-fcb1a8514643?auto=format&fit=crop&w=1600&q=80&ixlib=rb-4.1.0)

### 动手前的硬规则（必看）

- **保持一条已登录的 SSH 会话不退出**，另一条会话里改配置并测试
- 修改 `sshd_config` 后，先验证配置无误，再 reload
- 如果你不确定防火墙规则，先把“允许当前 IP”加进去

### 1) 只用密钥登录，关掉密码登录

在服务器侧 `/etc/ssh/sshd_config` 里（示意）：

```conf
PasswordAuthentication no
PubkeyAuthentication yes
```

如果你必须短期保留密码（比如有运维同事还没配好），建议至少：

- 给密码设置强度与轮换策略
- 配合 fail2ban 限制爆破

### 2) 禁止 root 直接登录（最常见高收益项）

```conf
PermitRootLogin no
```

然后用普通用户登录，通过 `sudo` 提权。

### 3) 限制允许登录的用户（白名单）

```conf
AllowUsers alice bob
```

或者按组：

```conf
AllowGroups ssh-users
```

### 4) 端口要不要改？可以，但别当“安全核心”

改端口的意义是减少无脑扫描噪音，不是根本安全手段。

```conf
Port 2222
```

如果改了端口：

- 防火墙记得放行新端口
- 旧端口可以保留一段时间做过渡，避免把自己锁死

### 5) fail2ban：对付暴力破解非常实用

思路是：看到某 IP 短时间内多次失败，就临时封禁。

常见配置目标：

- 失败 5 次封 10 分钟
- 长期恶意 IP 可以更久

> 具体配置因发行版而异，你的核心目标是：SSH 登录失败不再“无限试错”。

### 6) 防火墙：默认拒绝，只开需要的

建议策略：

- 只开放 SSH（以及你必要的服务端口）
- 如果你有固定办公 IP，可以只允许该 IP 段访问 SSH

### 7) 额外加固项（按需）

- **禁用空密码**：
  ```conf
  PermitEmptyPasswords no
  ```
- **减少认证次数/缩短超时**（降低爆破效率）：
  ```conf
  MaxAuthTries 3
  LoginGraceTime 20
  ```
- **开启 2FA**（如果你能接受额外复杂度）：更安全，但要做好备份码与恢复方案
- **审计与告警**：把 SSH 登录事件接到你的告警渠道（最少做到“有人登录我知道”）

### 8) 修改后如何验证（别靠“感觉”）

```bash
# 验证 sshd 配置（不同系统命令可能略有差异）
sshd -t

# 重载配置（不中断现有连接更安全）
systemctl reload ssh
```

然后用“新会话”测试：

- 是否能用密钥登录
- root 是否被禁止
- 非白名单用户是否无法登录

### 总结

SSH 加固的核心不是“改一个端口”，而是三件事：

- **身份**：密钥 +（可选）2FA
- **权限**：root 禁止直登、用户白名单
- **对抗**：fail2ban + 防火墙减少爆破窗口

做完这些，你的 SSH 大门会从“谁都能敲”变成“敲了也进不来”。

> 封面与配图来自 Unsplash（免费使用授权）。
