别再让服务器"裸奔":SSH 密钥登录实战,关闭密码认证 + 别名一键登录
密码可以被暴力破解、被撞库、被钓鱼,但一把 256 位的私钥,暴力破解到宇宙毁灭也试不完。今天这篇文章,手把手带你把服务器的密码登录彻底关掉,换成更安全的密钥登录,再配一个"别名",让你以后一条命令就能优雅上线。
一、为什么建议关闭密码登录?
如果你的服务器开放了 22 端口,又允许密码登录,那么几乎从开机那一刻起,它就在被全世界扫描。随便看一眼登录失败日志就能感受到攻击者的"热情":
# 查看最近的登录失败记录(Ubuntu/Debian)
sudo grep "Failed password" /var/log/auth.log | tail -5
# CentOS/OpenEuler 系统
sudo grep "Failed password" /var/log/secure | tail -5
输出往往长这样:
Failed password for root from 43.135.xx.xx port 51234 ssh2
Failed password for root from 43.135.xx.xx port 51236 ssh2
Failed password for admin from 111.231.xx.xx port 40122 ssh2
密码登录的风险主要有三个:
- 暴力破解:攻击者用字典日夜不停地试密码,弱密码撑不过几分钟;
- 撞库攻击:你在别处泄露的密码,会被拿来直接试你的服务器;
- 钓鱼与嗅探:密码在传输中虽然加密,但"你知道的秘密"终究可能被骗走。
而密钥登录的认证方式完全不同——服务器上没有可以被"猜"的秘密。私钥只存在你自己的电脑里,从不在网络上传输,攻击者没有私钥文件本身,连"试"的资格都没有。
二、一分钟看懂密钥登录的原理
SSH 密钥登录基于非对称加密,核心是"一对钥匙":
- 私钥(private key):相当于你家的大门钥匙,只保存在你自己的电脑上,绝不外传;
- 公钥(public key):相当于门上的锁孔,可以随便公开,放到任何一台你想登录的服务器上。
登录时的流程大致是:
- 你发起连接,服务器用你事先放好的公钥发起一个"数学挑战";
- 你的客户端用本地私钥对这个挑战进行签名;
- 服务器用公钥验证签名——验证通过,证明你确实持有私钥,放行。
整个过程私钥从不离开你的电脑,没有任何"密码"参与,自然也就无从暴力破解。
三、实战:四步完成密钥登录
以下操作以本地 macOS / Linux 终端为例,Windows 用户推荐使用 Windows 10+ 自带的 OpenSSH(PowerShell 中同样可用),或使用华为云 CloudShell。
第 1 步:在本地生成密钥对
ssh-keygen -t ed25519 -C "my-server-key"
-t ed25519:指定算法为 Ed25519,目前最推荐——比传统 RSA 更短、更快、更安全;-C:备注信息,方便你区分这把钥匙是干嘛的(不影响功能)。
执行后会提示:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
- 保存路径:直接回车,使用默认路径
~/.ssh/id_ed25519; - passphrase(密码短语):给私钥再加一层口令。设置后即使私钥文件被偷,对方也无法使用。个人日常使用可以留空回车,生产环境强烈建议设置。
完成后,本地 ~/.ssh/ 目录下会多出两个文件:
~/.ssh/id_ed25519 # 私钥(打死也不能外传)
~/.ssh/id_ed25519.pub # 公钥(可以随便放)
💡 如果你的服务器环境较老、不支持 Ed25519,可以改用
ssh-keygen -t rsa -b 4096生成 4096 位 RSA 密钥。
第 2 步:把公钥放入服务器的 SSH 配置中
方式一:ssh-copy-id 一键上传(推荐)
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@你的服务器IP
输入一次密码(这是你最后一次用密码登录),它就会自动把公钥追加到服务器的 ~/.ssh/authorized_keys 文件里,并顺手把文件权限配好。
方式二:手动追加(本地没有 ssh-copy-id 时)
cat ~/.ssh/id_ed25519.pub | ssh root@你的服务器IP \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
⚠️ 权限非常重要!SSH 对权限极其敏感,权限不对会直接拒绝密钥认证:
~/.ssh目录必须是700~/.ssh/authorized_keys文件必须是600
第 3 步:验证密钥登录
ssh root@你的服务器IP
如果配置了 passphrase,会先提示你输入私钥的密码短语,然后直接登录成功——注意观察,此时已经不再要求输入服务器密码了。
看到熟悉的欢迎语,说明密钥登录已经生效。先别急着退出,接着做最后一步。
第 4 步:关闭密码登录(关键加固)
⚠️ 强烈建议:保持当前这个已登录的会话不要断开,另开一个新终端做下面的操作。 万一配置有误,你还能用旧会话救场,否则把自己锁在门外就尴尬了。
编辑服务器上的 SSH 配置文件:
sudo vim /etc/ssh/sshd_config
找到并修改以下配置项(去掉前面的 # 注释并改值):
PubkeyAuthentication yes # 启用密钥认证(默认即开启,显式写上更稳妥)
PasswordAuthentication no # 关闭密码认证
PermitRootLogin prohibit-password # 禁止 root 密码登录,但允许 root 密钥登录
💡 关于
PermitRootLogin的取值:
yes:root 可用任何方式登录(不推荐)prohibit-password:root 只能密钥登录,不能密码登录(推荐)no:完全禁止 root 登录(更严格,需先用普通用户登录再 sudo 提权)
改完先做个语法检查,防止手滑写错导致 sshd 起不来:
sudo sshd -t
没有任何输出就是检查通过。然后重启 SSH 服务使配置生效:
# Ubuntu / Debian
sudo systemctl restart ssh
# CentOS / OpenEuler / EulerOS
sudo systemctl restart sshd
最终验证:再开一个新终端,执行 ssh root@你的服务器IP,能直接进去;然后故意用一把错误的私钥或不带私钥去连,应该收到 Permission denied (publickey),且无论怎么输密码都进不去——密码登录已被彻底关闭。✅
四、进阶:配置别名,一条命令优雅登录
到目前为止,你登录服务器还得敲:
ssh -i ~/.ssh/id_ed25519 root@192.168.1.100 -p 22
IP 难记、参数冗长。其实在本地编辑(没有就新建)~/.ssh/config 文件:
vim ~/.ssh/config
写入如下内容:
Host myserver
HostName 192.168.1.100 # 服务器的公网 IP 或域名
User root # 登录用户名
Port 22 # 端口(改过端口的话写实际端口)
IdentityFile ~/.ssh/id_ed25519 # 私钥路径
保存后给文件加上正确权限:
chmod 600 ~/.ssh/config
从此以后,登录服务器只需要:
ssh myserver
回车即达。用 scp 传文件也变得极其顺手:
scp ./app.tar.gz myserver:/opt/
甚至 VS Code 的 Remote-SSH 插件也会自动识别这些别名,在服务器列表里直接点 myserver 就能连上——从此告别记 IP 的日子。
五、常见踩坑与注意事项
| 现象 | 原因与解决 |
|---|---|
| 配了公钥还是要密码 | 九成是权限问题:检查服务器 ~/.ssh 是否 700、authorized_keys 是否 600 |
| 依然提示密码登录 | 确认改的是 sshd_config 而不是 ssh_config;确认重启了 sshd;部分系统还需检查 /etc/ssh/sshd_config.d/ 目录下是否有覆盖配置 |
| 云服务器连不上 | 检查云平台安全组是否放行了 22 端口(华为云 ECS 在控制台"安全组"中配置入方向规则) |
| 关闭密码后进不去 | 用旧会话改回配置;若会话已断,需通过云平台控制台的 VNC 远程登录进入救援 |
| 多台服务器共用一把钥匙? | 不建议。最好一台服务器一对密钥,备注写清楚,泄露时也方便单独作废 |
两个额外建议:
- 私钥务必备份:关闭密码登录后,私钥就是你唯一的钥匙。丢失了就只能靠云平台控制台救援了。可以加密备份到安全的密码管理器或离线存储中。
- 有条件的话顺手改掉默认端口:把 22 改成其他高位端口,能挡掉绝大部分无差别扫描(记得同步修改安全组和
Port配置)。
六、写在最后
回顾一下我们做了什么:
- ✅ 本地生成 Ed25519 密钥对;
- ✅ 公钥放入服务器的
authorized_keys; - ✅ 验证密钥登录成功;
- ✅ 修改
sshd_config关闭密码登录,重启 sshd; - ✅ 配置
~/.ssh/config别名,一条ssh myserver直达。
整套流程不超过十分钟,却直接消灭了服务器暴露面里最常见的一个风险点。安全从来不是一蹴而就的大工程,而是这样一次次低成本、高回报的小加固。
如果你的服务器还在用密码登录,现在就动手试试吧。也欢迎在评论区交流你的 SSH 加固心得——你用的是什么算法的密钥?有没有改默认端口?我们评论区见。
本文基于 OpenSSH 8.x 验证通过,适用于主流 Linux 发行版与华为云 ECS。如果对你有帮助,欢迎点赞收藏,转发给还在用密码登录的朋友。
- 点赞
- 收藏
- 关注作者
评论(0)