使用密码登录VPS在当今已越来越危险。全球的自动化机器人持续扫描监听22端口的服务器,并不间断地进行暴力破解攻击。最有效的解决方案是切换至SSH Key认证——没有密码可猜,暴力破解攻击便完全失效。
SSH Key认证是一种使用加密密钥对验证身份的方法,由以下两部分组成:
~/.ssh/authorized_keys 文件中。连接时,服务器向客户端发送随机挑战(Challenge),您的计算机用私钥对其签名,服务器用已存储的公钥验证签名——整个过程不传输任何密码。
RSA 4096位和Ed25519。2026年推荐使用Ed25519,因其密钥更短但安全性相当,且速度更快。
| 对比项目 | 密码登录 | SSH Key登录 |
|---|---|---|
| 暴力破解防护 | ❌ 高风险 | ✅ 无法暴力破解 |
| 使用便利性 | 每次需输入密码 | ✅ 无需输入(使用SSH Agent) |
| 钓鱼攻击风险 | ❌ 密码可能被窃取 | ✅ 密钥从不经网络传输 |
| 多服务器管理 | 记忆多个密码 | ✅ 一个密钥管理多台服务器 |
| 审计与访问控制 | 难以追溯登录来源 | ✅ 可按密钥识别用户 |
| 中间人攻击防护 | ❌ TOFU机制失效时有风险 | ✅ 主机密钥固定有效防护 |
Shodan数据显示,开放SSH密码认证的服务器每天平均遭受数千次暴力破解尝试。切换至SSH Key认证并禁用密码登录,可立即关闭这一攻击入口。
SSH Key认证采用非对称加密(Asymmetric Cryptography):
authorized_keys中存储的公钥验证签名。生成Ed25519密钥(2026年推荐):
ssh-keygen -t ed25519 -C "[email protected]"
或使用RSA 4096位:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
Enter file in which to save the key (/home/user/.ssh/id_ed25519): [按Enter使用默认路径]
Enter passphrase (empty for no passphrase): [输入密码短语或按Enter跳过]
Enter same passphrase again: [确认密码短语]
强烈建议设置密码短语(Passphrase)。即使私钥文件被盗,对方仍需知道密码短语才能使用。
~/.ssh/id_ed25519 # 私钥 — 仅保存在您的计算机上
~/.ssh/id_ed25519.pub # 公钥 — 上传至服务器
查看您的公钥:
cat ~/.ssh/id_ed25519.pub
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@your-vps-ip
此命令最后一次使用密码登录,自动将公钥复制到服务器的~/.ssh/authorized_keys文件中。
# 1. 查看公钥内容
cat ~/.ssh/id_ed25519.pub
# 2. 登录服务器
ssh username@your-vps-ip
# 3. 创建目录和文件(如不存在)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 4. 粘贴公钥
echo "ssh-ed25519 AAAA...xxx [email protected]" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 打开新终端测试
ssh -i ~/.ssh/id_ed25519 username@your-vps-ip
如果无需输入密码(或仅需密码短语)即可登录,说明配置成功,可以继续下一步。
编辑服务器上的/etc/ssh/sshd_config文件:
sudo nano /etc/ssh/sshd_config
检查并设置以下选项:
# 确认公钥认证已启用
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 禁止直接以Root登录
PermitRootLogin no
# 限制认证尝试次数
MaxAuthTries 3
# 更改SSH端口(可选,减少机器人扫描噪音)
# Port 2222
# 禁用X11转发(如不需要)
X11Forwarding no
此步骤必须在确认SSH Key登录成功后才能执行,切勿先关闭现有会话!
# 在 /etc/ssh/sshd_config 中设置
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
保存文件后重启SSH服务:
# Ubuntu/Debian
sudo systemctl restart ssh
# CentOS/Rocky Linux
sudo systemctl restart sshd
打开新终端验证仍可登录,并确认密码登录已被拒绝:
ssh -o PasswordAuthentication=yes username@your-vps-ip
# 预期输出:Permission denied (publickey)
# 打开PowerShell运行
ssh-keygen -t ed25519
# 查看公钥
type $env:USERPROFILE\.ssh\id_ed25519.pub
# 上传至服务器
ssh-copy-id -i $env:USERPROFILE\.ssh\id_ed25519.pub username@your-vps-ip
authorized_keys中。.ppk文件。.ppk文件。管理多台服务器时,使用~/.ssh/config配置文件:
# ~/.ssh/config
Host my-vps-th
HostName 203.0.113.10
User ubuntu
IdentityFile ~/.ssh/id_ed25519_vps_th
Host my-vps-sg
HostName 198.51.100.20
User root
IdentityFile ~/.ssh/id_ed25519_vps_sg
Port 2222
使用别名连接:
ssh my-vps-th
ssh my-vps-sg
# 启动SSH Agent
eval "$(ssh-agent -s)"
# 将密钥加入Agent
ssh-add ~/.ssh/id_ed25519
# 查看已加载的密钥
ssh-add -l
| 问题 | 原因 | 解决方法 |
|---|---|---|
| Permission denied (publickey) | 找不到密钥或权限设置错误 | chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys |
| .ssh目录权限警告 | 目录权限过于宽松 | chmod 700 ~/.ssh |
| 主机密钥验证失败 | 服务器主机密钥已更改(重装系统) | ssh-keygen -R your-vps-ip |
| 连接被拒绝 | SSH服务未运行或防火墙阻止 | 检查sudo systemctl status ssh和防火墙规则 |
| 私钥权限警告 | 私钥文件权限过于宽松 | chmod 600 ~/.ssh/id_ed25519 |
# 添加 -v 参数查看详细日志
ssh -v username@your-vps-ip
# -vvv 全面调试模式
ssh -vvv username@your-vps-ip
配置SSH Key认证是获得VPS后应立即执行的基本安全步骤。主要优势包括: