如何配置 SSH AuthorizedKeys 实现免密登录
SSH (Secure Shell) 是一种加密的网络协议,用于在不安全的网络上安全地执行网络服务。它最常见的用途是远程登录到服务器,执行命令,以及在计算机之间安全地传输文件。虽然默认的 SSH 登录需要密码,但这在自动化脚本、频繁登录或安全性要求更高的场景下显得不够便捷。通过配置 authorized_keys,我们可以实现免密登录,极大地提高效率和安全性。
本文将详细介绍如何配置 SSH authorized_keys 文件,实现免密登录。
为什么选择免密登录?
- 安全性提升:相比于每次输入密码,使用 SSH 密钥对进行身份验证更为安全。密钥更长、更复杂,难以暴力破解。
- 操作便利性:无需每次输入密码,节省时间,尤其适用于需要频繁连接服务器或在自动化脚本中集成 SSH 登录的场景。
- 自动化友好:是实现自动化部署、持续集成/持续交付 (CI/CD) 的基础。
核心原理
免密登录的核心是基于非对称加密的密钥对认证。
- 密钥对:由一个私钥 (Private Key) 和一个公钥 (Public Key) 组成。
- 私钥:保存在本地客户端,绝不能泄露。
- 公钥:存放在远程服务器的
~/.ssh/authorized_keys文件中。
- 认证过程:
- 客户端尝试连接服务器。
- 服务器向客户端发送一个随机字符串。
- 客户端使用其私钥对该字符串进行加密,并将加密结果发送回服务器。
- 服务器使用预存的公钥解密客户端发回的数据。如果解密成功,证明客户端拥有对应的私钥,服务器即允许免密登录。
配置步骤
步骤 1:在本地客户端生成 SSH 密钥对
如果您还没有 SSH 密钥对,需要先生成。打开您的终端或 Git Bash (Windows),执行以下命令:
bash
ssh-keygen -t rsa -b 4096 -C "[email protected]"
-t rsa:指定密钥类型为 RSA。-b 4096:指定密钥长度为 4096 位,提供更高的安全性(默认为 2048 位)。-C "[email protected]":为密钥添加注释,通常是您的邮箱,便于识别。
执行命令后,系统会提示您:
- Enter file in which to save the key (/home/user/.ssh/id_rsa):
- 这是密钥的保存路径。默认路径
~/.ssh/id_rsa通常是最佳选择,直接按回车即可。如果您想为不同的服务器创建不同的密钥,可以指定不同的文件名,例如~/.ssh/id_rsa_myserver。
- 这是密钥的保存路径。默认路径
- Enter passphrase (empty for no passphrase):
- 设置私钥的密码。强烈建议设置一个强密码。即使私钥被盗,攻击者也无法直接使用。如果您想完全免密(连私钥密码都不想输入),可以留空,但安全性会降低。
- Enter same passphrase again:
- 确认密码。
生成成功后,您会在 ~/.ssh/ 目录下找到两个文件:
* id_rsa (私钥)
* id_rsa.pub (公钥)
请务必保护好您的私钥 id_rsa,不要将其分享给任何人。
步骤 2:将公钥复制到远程服务器
这是实现免密登录的关键一步。有几种方法可以将公钥复制到远程服务器。
方法 A:使用 ssh-copy-id (推荐)
ssh-copy-id 是一个方便的工具,它可以自动将您的公钥复制到远程服务器的 ~/.ssh/authorized_keys 文件中,并设置正确的权限。
bash
ssh-copy-id username@remote_host
username:您在远程服务器上的用户名。remote_host:远程服务器的 IP 地址或域名。
第一次执行时,系统可能会提示您输入远程服务器的密码。成功后,您的公钥就会被添加到服务器上。
方法 B:手动复制公钥
如果您的本地系统没有 ssh-copy-id 工具,或者您更喜欢手动操作,可以使用 ssh 或 scp 命令。
-
使用
ssh命令:
bash
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
这个命令的解释:cat ~/.ssh/id_rsa.pub:在本地显示公钥内容。|:管道操作符,将cat的输出作为下一个命令的输入。ssh username@remote_host:通过 SSH 连接到远程服务器。"...":在远程服务器上执行的命令字符串。mkdir -p ~/.ssh:如果~/.ssh目录不存在,则创建它。chmod 700 ~/.ssh:设置~/.ssh目录的权限为rwx------(只有所有者有读、写、执行权限),这是 SSH 安全要求。cat >> ~/.ssh/authorized_keys:将通过管道传输过来的公钥内容追加到~/.ssh/authorized_keys文件中。如果文件不存在,则创建。chmod 600 ~/.ssh/authorized_keys:设置authorized_keys文件的权限为rw-------(只有所有者有读写权限),这也是 SSH 安全要求。
-
使用
scp命令:
bash
scp ~/.ssh/id_rsa.pub username@remote_host:~/.ssh/authorized_keys_temp
这会将公钥文件复制到远程服务器的主目录下的一个临时文件。然后,您需要通过 SSH 连接到服务器,并手动将其添加到authorized_keys文件中并设置权限:
bash
ssh username@remote_host
# 在远程服务器上执行以下命令
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat authorized_keys_temp >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
rm authorized_keys_temp
exit
步骤 3:验证免密登录
复制公钥后,尝试从本地客户端连接到远程服务器:
bash
ssh username@remote_host
如果一切配置正确,您应该能够直接登录到远程服务器,而无需输入密码(如果您的私钥设置了密码,则只需输入私钥密码)。
步骤 4 (可选):配置 SSH 客户端 (config 文件)
为了更方便地管理多个 SSH 连接,您可以在本地客户端配置 ~/.ssh/config 文件。
创建或编辑 ~/.ssh/config 文件:
Host myserver
HostName remote_host_ip_or_domain
User username
Port 22 # 如果SSH端口不是22,请指定
IdentityFile ~/.ssh/id_rsa # 如果您为特定服务器使用了非默认私钥,请指定路径
# AddKeysToAgent yes # 自动将密钥添加到ssh-agent
# ForwardAgent yes # 转发认证代理连接
保存后,您就可以通过 ssh myserver 命令连接到服务器了。
步骤 5 (可选):禁用密码登录 (提高安全性)
一旦您确认免密登录工作正常,为了进一步提高服务器安全性,您可以在远程服务器上禁用密码登录。
- 通过 SSH 连接到远程服务器。
- 编辑 SSH 配置文件
/etc/ssh/sshd_config(需要 root 权限):
bash
sudo nano /etc/ssh/sshd_config - 找到并修改以下行(如果被注释,请取消注释并修改):
#PasswordAuthentication yes
PasswordAuthentication no - 保存文件并退出。
- 重启 SSH 服务以应用更改:
- 对于大多数基于 Systemd 的系统 (如 Ubuntu 16.04+, CentOS 7+):
bash
sudo systemctl restart sshd - 对于旧版本系统 (如 Debian 8-, Ubuntu 14.04-):
bash
sudo service ssh restart
- 对于大多数基于 Systemd 的系统 (如 Ubuntu 16.04+, CentOS 7+):
重要提示: 在禁用密码登录之前,请务必确认您的 SSH 密钥登录已经完全正常工作,并且您能够成功登录。否则,一旦禁用密码登录,您将无法通过密码登录服务器,可能会导致无法访问。
故障排除
- 权限问题:
~/.ssh目录权限必须是700(drwx------)。~/.ssh/authorized_keys文件权限必须是600(-rw-------)。- 检查这些权限:
ls -ld ~/.ssh和ls -l ~/.ssh/authorized_keys。 - 如果权限不正确,请使用
chmod命令修复。
- 公钥内容错误:确保
authorized_keys文件中的公钥内容是完整的、正确的,没有多余的空格或换行符。 - 私钥密码:如果您为私钥设置了密码,在登录时需要输入私钥密码,而不是服务器密码。
- SSH 服务未运行:确保远程服务器上的 SSH 服务 (
sshd) 正在运行。 - 防火墙:检查服务器和客户端的防火墙设置,确保 SSH 端口 (默认为 22) 是开放的。
通过以上步骤,您就可以成功配置 SSH 免密登录,享受更安全、更便捷的远程访问体验。