别再让服务器"裸奔":SSH 密钥登录实战,关闭密码认证 + 别名一键登录

举报
yd_293824473 发表于 2026/11/14 03:25:00 2026/11/14
【摘要】 密码可以被暴力破解、被撞库、被钓鱼,但一把 256 位的私钥,暴力破解到宇宙毁灭也试不完。今天这篇文章,手把手带你把服务器的密码登录彻底关掉,换成更安全的密钥登录,再配一个"别名",让你以后一条命令就能优雅上线。 一、为什么建议关闭密码登录?如果你的服务器开放了 22 端口,又允许密码登录,那么几乎从开机那一刻起,它就在被全世界扫描。随便看一眼登录失败日志就能感受到攻击者的"热情":# 查看...

密码可以被暴力破解、被撞库、被钓鱼,但一把 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

密码登录的风险主要有三个:

  1. 暴力破解:攻击者用字典日夜不停地试密码,弱密码撑不过几分钟;
  2. 撞库攻击:你在别处泄露的密码,会被拿来直接试你的服务器;
  3. 钓鱼与嗅探:密码在传输中虽然加密,但"你知道的秘密"终究可能被骗走。

而密钥登录的认证方式完全不同——服务器上没有可以被"猜"的秘密。私钥只存在你自己的电脑里,从不在网络上传输,攻击者没有私钥文件本身,连"试"的资格都没有。

二、一分钟看懂密钥登录的原理

SSH 密钥登录基于非对称加密,核心是"一对钥匙":

  • 私钥(private key):相当于你家的大门钥匙,只保存在你自己的电脑上,绝不外传;
  • 公钥(public key):相当于门上的锁孔,可以随便公开,放到任何一台你想登录的服务器上。

登录时的流程大致是:

  1. 你发起连接,服务器用你事先放好的公钥发起一个"数学挑战";
  2. 你的客户端用本地私钥对这个挑战进行签名;
  3. 服务器用公钥验证签名——验证通过,证明你确实持有私钥,放行。

整个过程私钥从不离开你的电脑,没有任何"密码"参与,自然也就无从暴力破解。

三、实战:四步完成密钥登录

以下操作以本地 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 远程登录进入救援
多台服务器共用一把钥匙? 不建议。最好一台服务器一对密钥,备注写清楚,泄露时也方便单独作废

两个额外建议:

  1. 私钥务必备份:关闭密码登录后,私钥就是你唯一的钥匙。丢失了就只能靠云平台控制台救援了。可以加密备份到安全的密码管理器或离线存储中。
  2. 有条件的话顺手改掉默认端口:把 22 改成其他高位端口,能挡掉绝大部分无差别扫描(记得同步修改安全组和 Port 配置)。

六、写在最后

回顾一下我们做了什么:

  1. ✅ 本地生成 Ed25519 密钥对;
  2. ✅ 公钥放入服务器的 authorized_keys;
  3. ✅ 验证密钥登录成功;
  4. ✅ 修改 sshd_config 关闭密码登录,重启 sshd;
  5. ✅ 配置 ~/.ssh/config 别名,一条 ssh myserver 直达。

整套流程不超过十分钟,却直接消灭了服务器暴露面里最常见的一个风险点。安全从来不是一蹴而就的大工程,而是这样一次次低成本、高回报的小加固。

如果你的服务器还在用密码登录,现在就动手试试吧。也欢迎在评论区交流你的 SSH 加固心得——你用的是什么算法的密钥?有没有改默认端口?我们评论区见。


本文基于 OpenSSH 8.x 验证通过,适用于主流 Linux 发行版与华为云 ECS。如果对你有帮助,欢迎点赞收藏,转发给还在用密码登录的朋友。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。