SSH密钥登录配置禁用密码登录防爆破
为什么要用密钥登录取代密码登录?
服务器暴露在公网上时,SSH端口(默认22)每天都可能被自动化脚本暴力尝试密码登录。
即使你设置了复杂密码,也挡不住持续的猜解。SSH密钥登录使用一对非对称加密的密钥来验证身份:私钥留在本地,公钥放在服务器上。
攻击者即使拿到服务器IP和用户名,没有私钥也无法登录。
配置完成后禁用密码登录,可以从根本上防SSH爆破。
准备工作
操作前请确认以下几点:
- 你有一台Linux服务器(以Ubuntu 20.04/22.04、CentOS 7/8为例),已开通SSH服务并能通过密码登录。
- 本地电脑安装了SSH客户端(Windows 10/11自带OpenSSH,macOS/Linux自带终端)。
- 拥有服务器的root权限或具有sudo权限的用户。
生成SSH密钥对
在本地电脑打开终端(Windows打开PowerShell或cmd),执行以下命令生成密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com"
-t ed25519:指定密钥类型为Ed25519,安全且速度快。也可以使用传统的-t rsa -b 4096,但Ed25519是当前推荐方案。-C:添加备注,通常写自己的邮箱或机器名,方便管理。
按提示设置密钥保存路径(默认 ~/.ssh/id_ed25519)和密码短语(passphrase,可以为空,但建议设置以防私钥泄露)。
执行完后会在当前用户目录下的 .ssh 文件夹里生成两个文件:id_ed25519(私钥)和 id_ed25519.pub(公钥)。私钥请妥善保管,不要泄露给任何人。
上传公钥到服务器
将生成的公钥内容添加到服务器的 ~/.ssh/authorized_keys 文件中。
可以使用 ssh-copy-id 工具一键完成:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server-ip
执行后输入当前用户的密码,公钥会被自动追加到服务器上对应用户的 authorized_keys 文件中。
如果系统没有 ssh-copy-id,也可以手动复制公钥内容,登录服务器后执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
注意:authorized_keys文件的权限必须是600,.ssh目录权限必须是700,否则SSH会拒绝使用密钥认证。
修改SSH配置禁用密码登录
确认密钥登录已生效后(后面会验证),再修改配置文件彻底禁用密码登录。
用编辑器以root权限打开SSH配置文件:
sudo nano /etc/ssh/sshd_config
找到或添加以下参数,修改为指定值:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin prohibit-password # 如果允许root密钥登录,设置为without-password;禁止root登录则设为no
PubkeyAuthentication yes:启用公钥认证。PasswordAuthentication no:禁用密码登录,这是防爆破的关键。ChallengeResponseAuthentication no:关闭挑战-响应认证(一般不需要)。PermitRootLogin:如果想让root使用密钥登录,设为prohibit-password或without-password;如果希望更安全,设为no。
保存文件后,重启SSH服务使配置生效:
sudo systemctl restart sshd
验证配置并测试
重要:不要关闭当前SSH连接,新开一个终端窗口测试密钥登录是否正常。
在新终端执行:
ssh -i ~/.ssh/id_ed25519 user@your-server-ip
如果成功登录则说明密钥认证生效。
再尝试使用密码登录(故意输错密码或只按回车),如果提示 Permission denied (publickey) 而没有要求输入密码,则代表密码登录已禁用。
如果新窗口登录失败,检查公钥是否添加正确,sshd_config是否有语法错误(可用sshd -t检查),以及文件权限是否正确。恢复方式:切回旧窗口,修改配置临时开启密码登录,排错后再关闭。
常见问题与避坑
Q:密钥登录失败,提示“Permission denied (publickey)”?
A:最常见的三种原因:公钥未正确追加到 ~/.ssh/authorized_keys、.ssh或authorized_keys权限不对、sshd_config中PubkeyAuthentication未设为yes。
Q:禁用密码登录后,本地私钥丢失怎么办?
A:如果没留其他登录方式(如VNC、云控制台VNC),你将无法登录服务器。建议在禁用密码前先保留一个root密码登录的后备方案(如云服务商的救援模式),或者先测试密钥登录稳定后再禁用密码。
Q:需要多台服务器管理,是否每台都要单独上传公钥?
A:是的,每台服务器都需要将同一份公钥添加到对应用户的 authorized_keys 中。也可以使用SSH配置文件管理不同主机的私钥。
Q:是否必须重启SSH服务?
A:是的,修改 sshd_config 后必须重启SSH服务(systemctl restart sshd)或重新加载(systemctl reload sshd)才能使新配置生效。
完成上述步骤后,你的服务器SSH登录将只接受密钥认证,密码登录被彻底关闭,SSH暴力破解脚本基本失效。
建议同时开启防火墙限制SSH源IP(如有固定办公IP),并考虑更换SSH端口(非22)进一步降低扫描风险。