SSH 是 Linux 服务器远程管理的标准协议。传统的密码登录虽然简单直接,却面临暴力破解、撞库和键盘记录等风险。相比之下,基于非对称加密的密钥登录不仅大幅提升安全性,还能简化自动化运维流程。这一节将说明如何使用密钥登录替代密码登录。
1. 为什么密钥登录更安全
- 抗暴力破解:密钥通常有 2048 位甚至更高强度,无法被穷举,而密码受人为记忆限制,往往强度有限。
- 私钥不离开客户端:认证过程中,私钥永远不通过网络传输,仅用其生成数字签名,即使中间人截获通信也无法窃取凭据。
- 可搭配口令保护:私钥本身还可以用密码短语(passphrase)加密,即使文件泄露,攻击者也难以直接使用。
- 便于自动化:脚本和持续部署工具(如 Ansible、Jenkins)使用密钥免交互登录,减少硬编码密码的需要。
2. 生成密钥对
在客户端(你个人使用的电脑)上生成一对密钥。打开终端,输入:
ssh-keygen -t ed25519 -C "your_email@example.com"
-t ed25519:指定使用 Ed25519 算法,它比 RSA 更紧凑且安全性相当,是目前推荐的选择。如果设备较老不支持 Ed25519,可用-t rsa -b 4096。-C:添加注释,方便识别该密钥的用途,通常填写邮箱。
执行后会提示选择保存位置,按回车使用默认路径 ~/.ssh/id_ed25519 即可。接着会询问是否设置密码短语,建议输入一个强口令,为私钥增加一层保护;若用于全自动脚本,可留空(但需严格保护私钥文件)。
完成后,~/.ssh/ 目录下会生成两个文件:
id_ed25519(私钥,必须保密,权限应为 600)id_ed25519.pub(公钥,可以分发给服务器)
3. 将公钥部署到服务器
使用 ssh-copy-id 命令是最便捷的方式(Linux / macOS 自带):
ssh-copy-id user@your_server_ip
输入一次用户的当前密码后,公钥会自动追加到服务器上 ~/.ssh/authorized_keys 文件中,并设置正确的权限。
如果服务器未安装该命令,可以手动完成:
cat ~/.ssh/id_ed25519.pub | ssh user@your_server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
部署后,尝试登录验证:
ssh user@your_server_ip
若设置了私钥密码短语,会提示解锁;否则直接登录成功。
4. 禁用密码登录(加固可选步骤)
确认密钥登录正常工作后,可以在服务器上关闭密码认证,彻底杜绝暴力破解。编辑 SSH 服务配置文件:
sudo nano /etc/ssh/sshd_config
找到并修改以下参数:
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
保存后重启 SSH 服务:
sudo systemctl restart sshd # 或 sudo service ssh restart
注意:在关闭密码登录前,务必确保你至少拥有一个可用的密钥,且已测试成功,并保持当前会话不断开,直到新开窗口验证密钥登录仍有效。否则可能会将自己锁在服务器外。
5. 管理多个密钥和主机
如果你需要连接多个服务器或使用不同密钥,可以在客户端 ~/.ssh/config 文件中定义快捷别名:
Host myserver
HostName 192.168.1.100
User deploy
IdentityFile ~/.ssh/id_ed25519_myserver
之后只需 ssh myserver 即可使用指定密钥登录。
6. 私钥安全的底线
- 私钥文件(
id_ed25519)的权限必须是 600(chmod 600 ~/.ssh/id_ed25519),否则 SSH 会拒绝使用。 - 不在不安全的设备或共享环境中存放未加密的私钥。
- 定期轮换密钥,并在服务器上移除不再使用的公钥。
通过用密钥登录替代密码登录,你不仅加固了服务器的第一道防线,也为后续的自动化运维铺平了道路,是每个 Linux 用户都应掌握的操作习惯。