如何配置 SSH 密钥登录禁用密码认证加固 Droplet 安全

文章导读
配置 SSH 密钥登录并禁用密码认证是加固 Linux 服务器(如 Droplet)的标准操作,能有效防止暴力破解。操作前必须确保密钥可用且保留一个备用登录通道,避免被锁在服务器外。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

配置 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 密钥登录禁用密码认证加固 Droplet 安全

使用 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 密钥登录禁用密码认证加固 Droplet 安全

怎么验证是否生效

验证分为两部分:确认密钥可用,确认密码被禁。

检查密钥登录:使用 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