墨绿渐变上一把白色的钥匙,齿朝向右侧

SSH 免密登录,一次配好

免密登录的价值不只是省一次输入。

密码登录意味着服务器上有一个可以被反复尝试的口令。只要你开着 22 端口,每天都会有几十上百次撞库。密钥登录则把这件事变成数学问题:猜中的概率可以忽略。

配置只有三步,五分钟。

一、在本机生成一对密钥

Windows 用 PowerShell,Mac 和 Linux 用终端:

ssh-keygen -t ed25519 -C "你的备注"

一路回车即可。想要更稳妥,可以给密钥加一个口令(passphrase)——这样即使私钥文件被偷,没有口令也用不了。

生成两个文件:

  • id_ed25519 —— 私钥,绝对不能给别人
  • id_ed25519.pub —— 公钥,可以随便发

Windows 上默认在 C:\Users\你的用户名\.ssh\。

二、把公钥传到服务器

一条命令搞定:

ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名@服务器IP

Windows 没有 ssh-copy-id,用这个等价写法:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh 用户名@服务器IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

这一步会要求输一次密码,之后就再也不用了。

三、验证,然后关掉密码登录

先别急着关。新开一个终端窗口试一下:

ssh 用户名@服务器IP

能直接进去,说明密钥生效。然后才改服务器上的 /etc/ssh/sshd_config:

PasswordAuthentication no
PubkeyAuthentication yes

改完重启服务:

sudo systemctl restart ssh

顺序很重要:先验证密钥能登,再关密码。反过来操作,一旦密钥有问题,你就把自己锁在门外了——只能去云控制台走 VNC 救援。

几个容易踩的点

  • 权限太开会导致密钥失效。~/.ssh 要 700,authorized_keys 要 600。权限不对,sshd 会直接忽略这个文件,而且日志里只说「认证失败」,不说原因。
  • authorized_keys 一行一个公钥,不能有换行断裂。复制时尤其注意别把一行折成两行。
  • 云主机的防火墙和安全组是两层。改 sshd 端口之后,安全组也要放行,否则连不上。
  • 同一个公钥可以给多台机器用,私钥只留一份,别到处拷。

关于端口

把 22 改成别的端口,能挡掉绝大部分无差别扫描,但它不是安全措施,只是减少日志噪音。真正的安全来自:密钥登录 + 禁止 root 直接登录 + 及时更新系统。

我现在的做法是:只允许密钥、禁用密码、禁用 root 登录,端口没改——因为改了端口,每次连都得记一个数字,收益不值。