对于暴露在公网的 VPS,最稳妥的做法是先生成并测试 SSH 密钥登录,确认无误后再在配置文件里关闭密码验证,同时务必保留厂商提供的控制台作为应急入口。
先说结论:密钥登录能有效防止暴力破解,但操作顺序错了会导致把自己锁在门外。
- 先判断:确认你有 VPS 厂商提供的网页控制台(VNC/Console)权限,以防配置失误无法连接。
- 优先做:在本地生成密钥对并将公钥上传至服务器,确保新会话能免密登录。
- 再验证:保持一个当前会话不断开,新开终端测试密钥登录成功后,再修改配置禁用密码。
命令速用版
# 1. 本地生成密钥(一路回车即可)
ssh-keygen -t ed25519
# 2. 上传公钥到服务器(需输入一次密码)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_vps_ip
# 3. 测试连接
ssh -i ~/.ssh/id_ed25519 user@your_vps_ip
为什么会这样
密码登录依赖用户记忆的字符串,容易被字典攻击或暴力破解尝试;而 SSH 密钥基于非对称加密,私钥保存在本地且通常有 passphrase 保护,服务端只存储公钥。关闭密码验证后,攻击者即使猜解出用户名也无法通过密码字段尝试登录,能大幅减少日志中的暴力破解噪音。
分步处理
第一步:生成密钥对
在本地电脑终端运行 ssh-keygen -t ed25519,建议直接回车使用默认路径。如果使用 rsa,建议长度至少 4096 位。
第二步:部署公钥
使用 ssh-copy-id 命令自动写入,或手动将本地 ~/.ssh/id_ed25519.pub 内容追加到服务器 ~/.ssh/authorized_keys 文件中。注意服务器端 ~/.ssh 目录权限应为 700,authorized_keys 应为 600。
第三步:修改配置
编辑服务器 /etc/ssh/sshd_config 文件,找到或添加以下行:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
建议将 PermitRootLogin 设为 prohibit-password 或 no,避免 root 直接登录。
第四步:重启服务
运行 sudo systemctl restart sshd 或 sudo service ssh restart 使配置生效。
怎么验证是否生效
不要关闭当前已连接的 SSH 会话。新开一个终端窗口,尝试使用密钥登录:ssh -i ~/.ssh/id_ed25519 user@ip,应当无需密码直接进入。
接着尝试强制使用密码登录(临时修改本地命令或配置测试),应当被拒绝。查看服务器日志 /var/log/auth.log 或 /var/log/secure,确认没有密码登录成功的记录。
常见坑
- 权限错误:服务器端
~/.ssh或authorized_keys权限过开放会导致 SSH 服务端忽略密钥,务必检查 chmod 设置。 - SELinux 限制:部分开启 SELinux 的系统(如 CentOS)可能因上下文错误拒绝读取密钥文件,需检查审计日志。
- 丢失访问权限:修改配置前务必确认网页控制台可用,一旦配置错误导致 SSH 服务无法启动或拒绝所有连接,只能通过控制台修复。
- 多用户环境:如果服务器上有其他用户,确保他们的公钥也已部署,否则禁用密码后他们也无法登录。