SSH 密码会被猜出来,密钥则不会。把 VPS 改成基于密钥的登录,是你能做的最大的单项安全升级,而且只需大约五分钟。
SSH 密钥如何工作
你会创建一对文件。私钥留在你的电脑上,绝不共享;公钥放到服务器上。连接时,服务器会要求你的电脑证明它持有匹配的私钥,而私钥本身从不经过网络传输。
1. 创建密钥对
ssh-keygen -t ed25519 -C "me@laptop"
Ed25519 密钥短小、快速且现代。提示时请设置一个口令短语,这样笔记本电脑被盗也不会导致服务器被盗。在 Windows 10 和 11 上,同样的命令可以在 PowerShell 中使用。
2. 将公钥复制到服务器
ssh-copy-id user@your.server.ip
如果没有 ssh-copy-id,请把 ~/.ssh/id_ed25519.pub 的内容追加到服务器上的 ~/.ssh/authorized_keys,然后运行 chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys。
3. 关闭密码前先测试
打开第二个终端并用密钥登录。在这一步成功之前,请保持第一个会话打开,这样即使出错也不会把你锁在外面。
4. 禁用密码登录
sudo nano /etc/ssh/sshd_config.d/99-hardening.conf
PasswordAuthentication no
PermitRootLogin prohibit-password
PubkeyAuthentication yes
sudo sshd -t && sudo systemctl reload ssh
sshd -t 检查能在笔误破坏你的访问之前将其发现。在某些系统上,该服务叫作 sshd 而不是 ssh。
5. 整洁的客户端配置
# ~/.ssh/config
Host myvps
HostName your.server.ip
User deploy
IdentityFile ~/.ssh/id_ed25519
现在只需输入 ssh myvps 即可。
良好实践
- 每台设备使用单独的密钥,这样你可以吊销其中一个而不影响其他设备。
- 使用
ssh-agent,这样每个会话只需输入一次口令短语。 - 当设备丢失或员工离职时,从
authorized_keys中删除对应的密钥。 - 添加 fail2ban 以减少日志噪音,参见我们的 15 分钟加固清单。