Ssh密钥登录配置全教程 禁用密码登录防暴力破解实操指南

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.pub

Windows 用户:推荐使用 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 安全加固流程:

  1. 本地生成 ed25519 密钥对
  2. 将公钥上传到服务器 authorized_keys
  3. 测试密钥登录成功后,禁用密码登录
  4. 修改默认 SSH 端口降低扫描骚扰
  5. 配置本地 SSH config 文件简化操作

完成以上步骤后,你的服务器 SSH 登录安全性会从”随时可能被暴力破解”提升到”几乎无法被入侵”的级别。这是服务器安全加固中投入产出比最高的操作之一,强烈建议所有 VPS 用户在拿到服务器后立即执行。

如果你正在寻找稳定的香港或美国 VPS 练习本文操作,IDC.Net 香港云服务器美国云服务器首月均 10 元起,支持 Ubuntu 系统,自助面板可随时重装系统重新练习,支付宝付款即可开通。

Telegram