SSH 密钥认证:免密登录与安全配置
SSH 密钥认证:从原理到免密登录的完整配置指南
在远程管理 Linux 服务器时,SSH(Secure Shell)是最常用的工具。传统的密码登录不仅繁琐,还存在暴力破解的风险。SSH 密钥认证提供了一种更安全、更便捷的验证方式,让你无需每次输入密码即可安全登录。本教程将带你从零开始,理解密钥对的工作原理,完成免密登录配置,并掌握关键的安全强化设置。
什么是 SSH 密钥对?
SSH 密钥对由两个文件组成,它们就像一把特制的锁和钥匙:
- 私钥(Private Key):严密保管在你的本地电脑上,相当于“钥匙”。绝不能泄露。
- 公钥(Public Key):安装在远程服务器上,相当于一把“锁”。它可以公开分发,但只有对应的私钥才能打开。
登录时,服务器会用它保存的公钥加密一段随机数据发送给你的客户端。只有持有对应私钥的客户端才能解密并返回正确的响应,从而完成身份验证。这个过程全程不传输私钥,从根本上杜绝了中间人攻击和密码泄露的风险。
第一步:在本地生成 SSH 密钥对
任何 Linux、macOS 或 Windows 10 以上系统的终端都可以执行此操作。我们将使用 ssh-keygen 命令生成一对 Ed25519 算法密钥,它比传统的 RSA 更快、更短且更安全。
打开终端,输入以下命令(将注释文字替换为你的邮箱,便于识别):
ssh-keygen -t ed25519 -C "your_email@example.com"
按回车后,系统会依次提示:
- 文件保存位置:直接按
Enter接受默认路径(~/.ssh/id_ed25519)。如有多个密钥,可修改文件名。 - 设置口令(passphrase):为私钥添加一层额外的保护。即使私钥文件被盗,不知道口令也无法使用。日常使用中,可配合
ssh-agent避免重复输入。本教程为简单起见,可先留空直接回车,但生产环境强烈建议设置。
生成成功后,终端会显示密钥指纹和随机图像。此时在 ~/.ssh/ 目录下会多出两个文件:
id_ed25519(私钥,权限必须为 600)id_ed25519.pub(公钥,内容以ssh-ed25519开头)
第二步:将公钥上传到远程服务器
要让服务器认可你的“锁”,需要把公钥内容追加到远程服务器上指定用户的 ~/.ssh/authorized_keys 文件中。有几种简便方法:
方法一:使用 ssh-copy-id(推荐)
绝大多数系统自带此工具,它会自动完成公钥复制并设置正确的文件权限。
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@remote_host
替换 username 和 remote_host 为实际的登录用户名和服务器 IP 或域名。过程中需要输入一次该用户在远程服务器上的登录密码,之后即可免密登录。
方法二:手动复制(适合无 ssh-copy-id 的场景)
首先查看并复制你的公钥内容:
cat ~/.ssh/id_ed25519.pub
然后登录远程服务器,确保用户的 home 目录下存在 .ssh 文件夹,且权限为 700:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
用文本编辑器(如 vim 或 nano)打开(或创建)authorized_keys 文件:
nano ~/.ssh/authorized_keys
将复制好的公钥内容(一整行)粘贴进去,保存退出。最后务必设置该文件的严格权限:
chmod 600 ~/.ssh/authorized_keys
第三步:验证免密登录
现在,尝试用 SSH 连接远程服务器:
ssh username@remote_host
如果一切顺利,无需输入密码即可直接进入系统。如果你在生成密钥时设置了私钥口令,系统会提示你输入该口令(而不是服务器密码)。后续可以配置 ssh-agent 来暂存口令,一次输入,多次使用。
第四步:为安全加固 SSH 配置
配置完密钥登录后,建议进一步增强服务器的 SSH 安全性,彻底关闭密码登录功能,杜绝暴力破解。
1. 备份并编辑 SSH 服务端配置文件
以 root 权限或使用 sudo 编辑 /etc/ssh/sshd_config:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config
2. 修改关键安全参数
找到并修改以下配置项,若行首有 # 请删除以取消注释。
-
禁用密码认证:确保已经成功配置并测试过密钥登录,否则会将自己锁在服务器外。
PasswordAuthentication no -
禁止空密码登录:
PermitEmptyPasswords no -
禁用 root 用户直接登录:养成使用普通用户 +
sudo的习惯。先创建一个普通用户并配置好密钥,再修改此项。PermitRootLogin no -
启用密钥认证(通常默认开启,但最好显式确认):
PubkeyAuthentication yes
3. 重启 SSH 服务使配置生效
sudo systemctl restart sshd
重要提醒:在关闭当前会话前,另开一个终端窗口测试新配置能否正常连接。如果出现问题,还能通过原终端修复配置,避免被锁在服务器外。
第五步(进阶):使用 SSH 配置别名简化登录
频繁输入用户名和 IP 也很麻烦。可以在本地创建 ~/.ssh/config 文件,为服务器设置别名。
编辑该文件:
nano ~/.ssh/config
写入如下格式内容:
Host myserver
HostName 192.168.1.100
User john
Port 22
IdentityFile ~/.ssh/id_ed25519
保存后,直接用 ssh myserver 就能登录。你可以为多台服务器添加多个 Host 段落。
常见问题与注意事项
- 权限错误:如果配置后仍然提示输入密码,90% 的可能是远程服务器上的目录或文件权限不正确。请严格检查:
- 用户 home 目录:权限 755 或更严格(不能是 777)。
~/.ssh目录:权限 700。~/.ssh/authorized_keys文件:权限 600。
- 私钥丢失:私钥一旦丢失,若没有备用登录方式(如控制台 Web 端),将无法登录。请将私钥妥善备份在安全的地方。
- 多个密钥管理:为不同服务生成不同密钥对,并在
~/.ssh/config中为每个 Host 指定IdentityFile,做到密钥隔离。
恭喜!你已经掌握了 SSH 密钥认证的完整流程。从此告别频繁输入密码,享受安全、高效的远程管理体验。这份技能将是你系统管理和 DevOps 学习之路上的重要基石。