Linux SSH密钥登录配置全攻略:无密码登录、密钥管理与实践


一、为什么要用 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 登录、校验配置后重载这三板斧,你的服务器远程管理就站在了一个更牢固的地基上。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

rsync服务器数据同步备份实战:增量传输、滚动快照与排错指南

Nginx 反向代理与负载均衡配置实战:proxy_pass、upstream 权重、健康检查一网打尽

评 论
更换验证码