SSH 是管理 Linux 服务器的主要通道,也是最常被攻击的入口之一。默认配置下 SSH 监听 22 端口、允许 root 密码登录,等于在公网上挂了一个「请进」的牌子。下面这套加固方案能有效降低被爆破的风险。
SSH 安全加固清单
| 项 | 建议 | 配置位置 |
|---|---|---|
| 端口 | 改非 22 | /etc/ssh/sshd_config Port |
| 禁止 root 登录 | PermitRootLogin no | sshd_config |
| 禁止密码登录 | PasswordAuthentication no | sshd_config |
| 限制用户 | AllowUsers xxx | sshd_config |
| 密钥算法 | ed25519 | ssh-keygen -t ed25519 |
1. 创建普通用户并禁用 root 登录
不要用 root 直接登录。先创建一个普通用户并加入 sudo 组:
adduser deploy
usermod -aG sudo deploy
编辑 /etc/ssh/sshd_config:
PermitRootLogin no
2. 使用密钥登录,禁用密码
密钥比密码安全得多,而且不会被字典爆破。本地生成密钥:
ssh-keygen -t ed25519 -C "your_email@example.com"
复制公钥到服务器:
ssh-copy-id deploy@your-server-ip
然后关闭密码登录:
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
3. 修改 SSH 端口
把默认 22 改成高位端口,减少自动化扫描噪音:
Port 2222
改完后重启 SSH:
sudo systemctl restart sshd
注意:保留当前会话,另开一个终端测试新端口能登录成功再退出。
4. 限制可登录用户
AllowUsers deploy
这样即使服务器上有其他用户,也不能通过 SSH 登录。
5. 关闭不必要功能
# 禁用 X11 转发
X11Forwarding no
# 禁止空密码
PermitEmptyPasswords no
# 减少空闲连接时间
ClientAliveInterval 300
ClientAliveCountMax 2
6. 使用 Fail2ban 做动态防护
即使改了端口,定向扫描仍然可能发生。Fail2ban 能自动封禁多次失败的 IP:
[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 3600
findtime = 600
Fail2ban 的完整配置参考 Fail2ban 暴力破解防护完整配置指南。
7. 验证配置
改完配置后,先检查语法:
sudo sshd -t
没问题再重载:
sudo systemctl reload sshd
如果 reload 后连不上,sshd 会保留旧配置继续运行,你还有救。
SSH 加固清单
| 配置项 | 推荐值 |
|---|---|
| Port | 高位端口,如 2222 |
| PermitRootLogin | no |
| PasswordAuthentication | no |
| PubkeyAuthentication | yes |
| AllowUsers | 只允许的管理用户 |
| X11Forwarding | no |
| ClientAliveInterval | 300 |
更多服务器安全教程,请访问 fenij.com。
常见问题
问:改了端口被锁在外面怎么办?
答:如果是云服务器,用控制台提供的 VNC/串口登录。如果是物理机,需要本地接显示器键盘。所以改端口前务必测试新端口可用。
问:密钥登录比密码登录安全多少?
答:ED25519 密钥的熵远超任何可记忆的密码,而且不会被字典攻击。只要保管好私钥文件,安全性提升是数量级的。
问:Team 里多人管理服务器怎么办?
答:给每个人都创建独立的用户和密钥,不要共享同一个 deploy 用户。用 AllowUsers user1 user2 控制。
SSH 之外给账户设强密码,可用随机密码生成器。