一、为什么要用 SSH 密钥登录
密码登录存在三个硬伤:一是密码容易被暴力破解,黑客用字典+撞库持续试探,弱口令几乎必挂;二是每次上线都要敲密码,前期带宽一断就忙乱;三是服务器权限多人共享一个 root 密码时,离职、换人有心术难防。SSH 密钥登录用非对称加密(RSA/ECDSA/Ed25519),私钥留在本地、公钥部署到服务器,只有在本地持有私钥的机器才能登录,配合禁用密码登录,账号安全性上一个台阶。
二、生成密钥对
在本地(Linux/macOS 或 Windows 的 Git Bash)生成 Ed25519 密钥对,Ed25519 比 RSA 更短更快更安全,新项目推荐优先使用:
# 生成密钥对,-C 填自己的邮箱便于标识 ssh-keygen -t ed25519 -C "you@example.com" -f ~/.ssh/id_ed25519 -N ""
执行后会自动创建两个文件:id_ed25519(私钥,绝不可外泄)和 id_ed25519.pub(公钥,放心分发)。若对方服务器老、不支持 Ed25519,则回退到 RSA 4096:
ssh-keygen -t rsa -b 4096 -C "you@example.com" -f ~/.ssh/id_rsa -N ""
-N "" 表示空口令。生产环境建议设置口令保护私钥,即使私钥文件被窃取也无法直接使用。
三、把公钥部署到服务器
最省事的办法是用 ssh-copy-id 一键把公钥追加到服务器 ~/.ssh/authorized_keys:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server-ip
它等价于手动完成下面三步:在服务器创建 ~/.ssh 目录、设置 700 权限、把公钥追加进 authorized_keys 并设 600 权限。也可以手动操作:
ssh user@your-server-ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh" scp ~/.ssh/id_ed25519.pub user@your-server-ip:/tmp/ ssh user@your-server-ip "cat /tmp/id_ed25519.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
authorized_keys 权限如果用 644 或 777,sshd 出于安全考量可能会直接忽略该文件,务必设 600。
四、测试无密码登录
部署完成后,本地直接 ssh 应无需输入密码即登录成功:
ssh user@your-server-ip
如果仍提示输密码,打开 -v 看调试输出,重点排查三处:公钥是否已追加(cat ~/.ssh/authorized_keys)、服务器上 authorized_keys 权限是否为 600、/etc/ssh/sshd_config 是否设置 PubkeyAuthentication yes。若本地有多个私钥,可用 ssh-agent 或 -i 显式指定:
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 ssh -i ~/.ssh/id_ed25519 user@your-server-ip
五、禁用密码登录彻底加固
确认密钥登录顺畅后,编辑服务器 /etc/ssh/sshd_config,做以下加固:
PubkeyAuthentication yes # 启用公钥认证 PasswordAuthentication no # 禁用密码登录 PermitRootLogin prohibit-password # root 仅允许密钥登录,或直接 no ChallengeResponseAuthentication no # 关闭额外质询,避免绕过 UsePAM no # 部分发行版需配合,避免 PAM 放行密码 MaxAuthTries 3 # 限制认证尝试次数
修改后务必先重载并保留一个已开终端,防止把自己锁在门外:
sudo sshd -t # 校验配置语法,出错会直接提示 sudo systemctl reload sshd
永远不要重载配置前就关闭当前 SSH 会话。最稳妥的办法:开一个新终端用密钥测试能登进,再删除旧连接、重启 sshd。若真的误锁,在控制台(VNC/云厂商网页终端)登录修复。
六、私钥的管理与备份
私钥是登录服务器的唯一凭证,要像保管银行卡那样对待:设置为仅当前用户可读(chmod 600 ~/.ssh/id_ed25519),不要拷进云盘、不要提交进 git 仓库、不要用微信/邮件明文传输。多台机器共用同一把私钥虽然方便但风险高,建议一台机器一把密钥。若担心单点故障,可以为重要服务器单独生成并妥善加密备份。
chmod 600 ~/.ssh/id_ed25519 # 私钥 chmod 644 ~/.ssh/id_ed25519.pub # 公钥
写在最后
SSH 密钥登录是 Linux 服务器安全加固的第一步,成本极低、收益极高。一次配置换来的是:告别弱口令被爆破的提心吊胆、摆脱每天敲密码的繁琐、以及多人协作时权限可审计可控。配合上面提到的限制登录尝试次数、收紧 root 登录、校验配置后重载这三板斧,你的服务器远程管理就站在了一个更牢固的地基上。
