配置 SSH 密钥登录并禁用密码认证是加固 Linux 服务器(如 Droplet)的标准操作,能有效防止暴力破解。操作前必须确保密钥可用且保留一个备用登录通道,避免被锁在服务器外。
先说结论:生成 SSH 密钥对并上传公钥后,修改服务端配置禁用密码认证,可显著降低被暴力破解风险,但操作失误会导致无法登录。
- 先判断:确认当前拥有服务器控制台(VNC)访问权限,以防密钥配置错误后被锁死。
- 优先做:在本地生成密钥并成功通过密钥登录测试后,再修改服务端配置。
- 再验证:修改配置重启服务后,尝试使用密码登录确认被拒绝,同时确保密钥登录正常。
命令速用版
以下命令适用于 Ubuntu/Debian 系统的 Droplet,其他发行版路径可能略有不同。
# 1. 本地生成密钥(推荐 ed25519 算法)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 2. 将公钥复制到服务器
ssh-copy-id user@your_server_ip
# 3. 测试密钥登录(不要关闭当前会话)
ssh -i ~/.ssh/id_ed25519 user@your_server_ip
# 4. 编辑 SSH 配置文件
sudo nano /etc/ssh/sshd_config
# 5. 重启 SSH 服务
sudo systemctl restart sshd为什么会这样
密码认证容易受到自动化脚本的暴力破解攻击,而密钥认证基于非对称加密原理,安全性更高。
SSH 密码登录需要通过网络传输密码验证信息,攻击者可以尝试大量常用密码组合。SSH 密钥登录使用私钥签名挑战,私钥不离开本地客户端,且密钥长度远超普通密码,极大增加了破解难度。禁用密码认证后,即使攻击者获取了用户名,没有对应的私钥也无法建立连接。
分步处理
步骤 1:生成 SSH 密钥对
在本地电脑终端执行生成命令。如果使用 Windows,可使用 PowerShell 或 Git Bash。
步骤 2:上传公钥到服务器
使用 ssh-copy-id 命令或手动将 ~/.ssh/id_ed25519.pub 内容追加到服务器 ~/.ssh/authorized_keys 文件中。确保服务器端 .ssh 目录权限为 700,authorized_keys 权限为 600。
步骤 3:测试密钥登录
打开一个新的终端窗口尝试登录,不要关闭当前已登录的会话,直到确认新密钥可以成功登录。
步骤 4:修改服务端配置
编辑 /etc/ssh/sshd_config 文件,找到或添加以下配置项:
PasswordAuthentication no
PermitRootLogin prohibit-password # 或 no,建议禁止 root 直接密码登录步骤 5:重启 SSH 服务
执行重启命令使配置生效。如果使用的是 Ubuntu 18.04+ 或 CentOS 7+,通常使用 systemctl 管理。
怎么验证是否生效
验证分为两部分:确认密钥可用,确认密码被禁。
检查密钥登录:使用 ssh -v user@ip 连接,观察输出中是否显示 Offering public key 且最终进入 shell,无需输入密码。
检查密码禁用:尝试使用密码登录(可在另一台未配置密钥的设备测试),连接应被拒绝或提示 Permission denied (publickey)。
查看日志:在服务器端查看 /var/log/auth.log(Ubuntu/Debian)或 /var/log/secure(CentOS),确认没有密码认证成功的记录。
常见坑
- 权限错误:服务器端 ~/.ssh 目录权限不能超过 700,authorized_keys 不能超过 600,否则 SSH 服务端会忽略密钥文件。
- 会话中断:在确认新密钥登录成功前,不要关闭现有的 SSH 会话,否则配置错误会导致无法远程修复。
- Root 登录限制:如果禁用密码认证的同时设置了 PermitRootLogin no,且普通用户未配置 sudo 权限,可能导致无法管理服务器。
- 防火墙拦截:确保服务器防火墙(如 ufw 或 firewalld)放行了 SSH 端口(默认 22),否则重启服务后可能无法连接。
常见问题
丢失了私钥怎么办?
通过云服务商提供的网页控制台(VNC/Console)登录服务器,重新添加新的公钥到 authorized_keys。
应该选择哪种密钥算法?
推荐使用 ed25519 算法,它在安全性和性能上优于 RSA,且密钥长度更短;如果需要兼容旧系统,可选择 RSA 4096 位。
修改配置后无法登录如何恢复?
使用云服务商控制台的恢复控制台登录,将 /etc/ssh/sshd_config 中的 PasswordAuthentication 改回 yes 并重启服务。
参考来源
- DigitalOcean 社区文档,How To Set Up SSH Keys on Ubuntu 20.04,https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-20-04
- Ubuntu 官方文档,OpenSSH 服务器配置,https://ubuntu.com/server/docs/service-openssh