生成 SSH 密钥对并配置服务器禁用密码登录,能有效防止暴力破解,适用于所有 Linux 海外 VPS,操作前必须确保拥有云厂商控制台(VNC)访问权限以防密钥丢失导致无法登录。
先说结论:使用 Ed25519 算法生成密钥对并禁用密码认证是提升 SSH 安全性的最佳实践,能从根本上杜绝密码暴力破解风险。
- 先判断:确认云服务商提供网页控制台或 VNC 救援入口,避免密钥丢失后无法恢复。
- 优先做:在本地生成密钥并将公钥部署到服务器,测试密钥登录成功后再修改配置。
- 再验证:修改 sshd_config 禁用密码登录后,务必新开终端测试密钥登录是否生效。
命令速用版
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-copy-id user@your_vps_ip
sudo systemctl restart sshd为什么会这样
密码登录容易被自动化脚本暴力破解,而 SSH 密钥基于非对称加密,私钥不传输且长度远超普通密码。
公开资料中没有看到可靠的量化数据表明密钥比密码具体安全多少倍,但行业共识是密钥能抵御字典攻击和暴力猜测。
分步处理
步骤 1:本地生成密钥对
在本地终端运行生成命令,建议直接回车使用默认路径,方便 SSH 客户端自动识别。
ssh-keygen -t ed25519 -C "comment"步骤 2:上传公钥到服务器
使用 ssh-copy-id 命令自动写入 authorized_keys 文件,避免权限错误。
ssh-copy-id user@your_vps_ip步骤 3:修改服务器配置
编辑/etc/ssh/sshd_config,找到 PasswordAuthentication 改为 no,确保 PubkeyAuthentication 为 yes。
sudo nano /etc/ssh/sshd_config步骤 4:重启 SSH 服务
配置修改后必须重启服务才能生效,注意不要关闭当前连接直到新连接测试成功。
sudo systemctl restart sshd怎么验证是否生效
新开一个终端窗口尝试登录,成功进入且无需输入密码表示密钥生效。
查看服务器日志/var/log/auth.log,确认登录记录显示 Accepted publickey 而非 Accepted password。
ssh -v user@your_vps_ip
grep "Accepted" /var/log/auth.log常见坑
- 权限错误:~/.ssh 目录权限必须是 700,authorized_keys 文件权限必须是 600,否则 SSH 服务端会拒绝读取。
- Root 登录限制:部分系统默认禁止 root 直接登录,需先创建普通用户并配置 sudo 权限。
- 防火墙拦截:修改 SSH 端口后,需在云服务商安全组放行新端口,否则无法连接。
常见问题
密钥丢失了怎么办?
通过云服务商提供的网页控制台(VNC)登录服务器,重新写入公钥或恢复密码登录。
Windows 如何生成密钥?
Windows 10/11 自带 OpenSSH 客户端,可在 PowerShell 直接使用 ssh-keygen 命令生成。
可以禁用 Root 登录吗?
建议禁用 Root 直接登录,在 sshd_config 中设置 PermitRootLogin no,使用普通用户登录后 sudo 提权。
参考来源
- Ubuntu Server Guide - SSH openssh, https://ubuntu.com/server/docs/ssh-openssh
- OpenSSH Manual - sshd_config, https://man.openbsd.org/sshd_config