Ssh密钥登录配置全教程 禁用密码登录防暴力破解实操指南
为什么密码登录不够安全?
每一台暴露在公网的 Linux 服务器,每天都会遭受大量自动化的 SSH 暴力破解攻击。攻击程序会不间断地尝试常见用户名和密码组合,一旦密码强度不足或使用了默认密码,服务器在几小时内就可能被入侵。
查看服务器的登录失败日志,你会发现真实情况有多严峻:
sudo grep "Failed password" /var/log/auth.log | wc -l很多服务器每天的失败登录尝试次数超过数千次。
SSH 密钥登录从根本上解决了这个问题:用数学上极难破解的非对称加密替代密码验证,即使攻击者知道你的用户名,没有私钥文件也无法登录。配合禁用密码登录,暴力破解攻击对你的服务器完全失效。
本文完整演示 SSH 密钥登录的配置流程,以及禁用密码登录后的安全加固操作。
一、SSH 密钥登录的工作原理
SSH 密钥登录基于非对称加密,使用一对密钥:
- 私钥(Private Key):保存在你的本地电脑,绝对不能泄露给任何人
- 公钥(Public Key):上传到服务器,存放在
~/.ssh/authorized_keys文件中
登录过程:服务器用公钥发出一个加密挑战,只有持有对应私钥的客户端才能正确解密并回应,服务器验证通过后允许登录。整个过程中密码从不传输,攻击者无法通过暴力尝试来破解。
二、第一步:在本地生成密钥对
在你的本地电脑(不是服务器)上执行以下命令:
Mac / Linux 用户(打开终端):
ssh-keygen -t ed25519 -C "备注信息,如your_email@example.com"推荐使用 ed25519 算法,比传统 RSA 4096 更安全、更快速。
执行后会有以下交互提示:
# 密钥保存路径,直接回车使用默认路径
Enter file in which to save the key (/home/yourname/.ssh/id_ed25519):
# 设置密钥密码(passphrase),建议设置,为私钥增加一层保护
# 如果不想每次使用密钥时输入密码,可以直接回车跳过
Enter passphrase (empty for no passphrase):
Enter same passphrase again:生成完成后,会在 ~/.ssh/ 目录下创建两个文件:
id_ed25519:私钥文件,保存在本地,不要外传id_ed25519.pub:公钥文件,需要上传到服务器
查看公钥内容(后面需要用到):
cat ~/.ssh/id_ed25519.pubWindows 用户:推荐使用 Windows Terminal 或 Git Bash,命令与上面相同。也可以使用 PuTTYgen 工具生成密钥对(生成后需将公钥转换为 OpenSSH 格式)。
三、第二步:将公钥上传到服务器
方法一:使用 ssh-copy-id(推荐,Mac/Linux 可用)
ssh-copy-id -i ~/.ssh/id_ed25519.pub youruser@your_server_ip输入服务器密码确认,公钥会自动追加到服务器的 ~/.ssh/authorized_keys 文件中。
方法二:手动上传(Windows 或无法使用 ssh-copy-id 时)
先在服务器上创建 .ssh 目录并设置权限:
mkdir -p ~/.ssh
chmod 700 ~/.ssh在本地查看公钥内容并复制:
cat ~/.ssh/id_ed25519.pub在服务器上将公钥内容写入 authorized_keys 文件:
nano ~/.ssh/authorized_keys将复制的公钥内容粘贴进去,保存退出,然后设置文件权限:
chmod 600 ~/.ssh/authorized_keys权限设置非常重要:如果 .ssh 目录或 authorized_keys 文件权限设置不正确,SSH 服务出于安全考虑会拒绝使用密钥登录。
四、第三步:测试密钥登录
在禁用密码登录之前,务必先测试密钥登录是否正常。
打开一个新的终端窗口(保持原有 SSH 连接不关闭),尝试密钥登录:
ssh -i ~/.ssh/id_ed25519 youruser@your_server_ip如果能够直接登录(不需要输入密码,或只需要输入 passphrase),说明密钥配置成功。
如果登录失败,在排查问题之前不要进行下一步,常见排查命令:
# 查看 SSH 服务日志
sudo tail -f /var/log/auth.log
# 用 verbose 模式连接查看详细信息
ssh -v -i ~/.ssh/id_ed25519 youruser@your_server_ip五、第四步:禁用密码登录
确认密钥登录正常后,编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config找到并修改以下配置项(如果前面有 # 注释符,需要删除):
# 禁用密码认证
PasswordAuthentication no
# 禁用空密码登录
PermitEmptyPasswords no
# 禁止 root 直接登录(已有普通用户的情况下)
PermitRootLogin no
# 只允许公钥认证(明确指定)
PubkeyAuthentication yes保存文件后,重启 SSH 服务:
sudo systemctl restart sshd在当前连接不断开的情况下,用新终端测试只用密钥能否登录,并验证密码登录已被拒绝:
# 测试密码登录应该被拒绝(提示 Permission denied)
ssh -o PreferredAuthentications=password youruser@your_server_ip看到 Permission denied (publickey) 说明密码登录已成功禁用。
六、第五步:修改默认 SSH 端口
默认 SSH 端口是 22,大量扫描器会自动探测这个端口。修改为非标准端口可以显著减少无效登录尝试和日志噪音。
编辑 SSH 配置文件:
sudo nano /etc/ssh/sshd_config找到 Port 配置行并修改:
# 将默认的 22 改为其他端口,如 2222
Port 2222在防火墙中放行新端口,并关闭旧的 22 端口:
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
sudo ufw reload重启 SSH 服务:
sudo systemctl restart sshd在新终端用新端口测试连接:
ssh -p 2222 -i ~/.ssh/id_ed25519 youruser@your_server_ip连接成功后再关闭旧的终端连接。
七、简化本地 SSH 配置(可选但推荐)
每次登录都要输入 -p 2222 -i ~/.ssh/id_ed25519 很麻烦。在本地创建 SSH 配置文件可以简化操作:
nano ~/.ssh/config写入以下内容:
Host myserver
HostName your_server_ip
User youruser
Port 2222
IdentityFile ~/.ssh/id_ed25519保存后,以后登录只需要:
ssh myserver传输文件也同样简化:
scp localfile.txt myserver:/home/youruser/八、管理多台服务器的密钥
如果你管理多台服务器,推荐为每台服务器生成独立的密钥对,而不是所有服务器共用一对密钥。这样即使某台服务器私钥泄露,不会影响其他服务器的安全。
# 为不同服务器生成不同密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_server1 -C "server1"
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_server2 -C "server2"在 ~/.ssh/config 中为不同服务器指定对应的密钥文件:
Host server1
HostName 1.2.3.4
User youruser
Port 2222
IdentityFile ~/.ssh/id_ed25519_server1
Host server2
HostName 5.6.7.8
User youruser
Port 2222
IdentityFile ~/.ssh/id_ed25519_server2常见问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| Permission denied (publickey) | 公钥未正确写入 authorized_keys | 检查公钥内容是否完整,权限是否为 600 |
| 密钥登录仍需输入密码 | .ssh 目录权限不正确 | 执行 chmod 700 ~/.ssh |
| 连接超时 | 防火墙未放行新端口 | 检查 UFW 规则是否包含新端口 |
| 修改端口后无法连接 | 未重启 SSH 服务或防火墙未更新 | 重启 sshd,检查 ufw status |
| 私钥 passphrase 忘记了 | 无法解密私钥 | 需重新生成密钥对,在服务器控制台登录更新 authorized_keys |
总结
完整的 SSH 安全加固流程:
- 本地生成 ed25519 密钥对
- 将公钥上传到服务器
authorized_keys - 测试密钥登录成功后,禁用密码登录
- 修改默认 SSH 端口降低扫描骚扰
- 配置本地 SSH config 文件简化操作
完成以上步骤后,你的服务器 SSH 登录安全性会从”随时可能被暴力破解”提升到”几乎无法被入侵”的级别。这是服务器安全加固中投入产出比最高的操作之一,强烈建议所有 VPS 用户在拿到服务器后立即执行。
如果你正在寻找稳定的香港或美国 VPS 练习本文操作,IDC.Net 香港云服务器和美国云服务器首月均 10 元起,支持 Ubuntu 系统,自助面板可随时重装系统重新练习,支付宝付款即可开通。