首页  /  安全  /  正文

关掉密码登录,用密钥管好我的云服务器

安全 2026-09-18📖 9 分钟👁 —

我一直以为"密码够复杂就安全"。直到我打开服务器的登录日志。

先看看日志里有什么

lastb | head -20                    # 失败登录记录
sudo grep "Failed password" /var/log/auth.log | wc -l   # 统计次数

输出让我有点意外:短短几天,几万次失败登录尝试,来自世界各地的 IP。它们用字典一个个试 root、admin、test 这些用户名和弱密码。

公网上的 22 端口,24 小时都有人敲门。这不是针对你,是自动化的机器人。

为什么密钥比密码安全

密码登录密钥登录
能被猜吗可以(字典、撞库)几乎不可能(2048 位以上)
会在网络传吗会(就算加密也怕中间人)不传,只做签名验证
能复用吗经常复用(一漏全漏)每台机器一把,互不影响
能自动化吗要写死密码,很危险天然支持免密脚本

生成密钥

ssh-keygen -t ed25519 -C "备注标签"

它会生成两个文件:

文件是什么放哪
id_ed25519私钥(钥匙)只留在自己电脑,绝不外传
id_ed25519.pub公钥(锁)装到服务器上,可以公开

把公钥装到服务器

# 本地执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@服务器IP

# 手动方式(ssh-copy-id 不可用时)
cat ~/.ssh/id_ed25519.pub | ssh user@服务器IP \
  "mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
   cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

验证!这一步不能跳

ssh -i ~/.ssh/id_ed25519 -o PasswordAuthentication=no user@服务器IP
为什么要加 PasswordAuthentication=no?
它强制这次连接只能用密钥。如果还能进去,说明密钥真的生效了,而不是偷偷用了密码。

确认无误后,关闭密码登录

sudo vim /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin prohibit-password
PubkeyAuthentication yes
sudo sshd -t && sudo systemctl reload ssh
顺序很重要:必须先装好公钥、验证能进,再关密码登录。
反了的话,你就被关在门外了——只能去云厂商控制台救。

总结

  1. 公网 22 端口一直有人爆破,别抱侥幸
  2. 密钥登录:私钥不出门,公钥随便给
  3. 改配置前想清楚顺序:先开门,再拆墙
  4. 验证一定要用 PasswordAuthentication=no 强制走密钥
安全不是"加个复杂密码",而是把攻击面变小。关掉密码登录之后,爆破机器人连试的机会都没有了。