问题描述
在通过 SSH 从一台服务器连接到另一台服务器时,出现以下错误:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0755 for '/root/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/root/.ssh/id_rsa": bad permissions
错误信息明确指出,问题根源在于私钥文件(/root/.ssh/id_rsa)的权限设置过于开放,不符合 SSH 的安全要求。
原因分析
SSH 协议对私钥文件的权限有严格的安全限制。私钥文件(如 id_rsa)的权限必须设置为仅文件所有者可读写,其他任何用户(包括同组用户)都不能有访问权限。通常,正确的权限是 600(即 -rw-------)。
如果权限设置不当(例如 755 或 644),SSH 客户端出于安全考虑会拒绝使用该私钥,从而导致连接失败。
解决方案
解决此问题的核心是修正私钥文件的权限。以下是详细步骤和最佳实践。
步骤一:修正私钥文件权限
在发起连接的服务器(客户端)上,执行以下命令:
chmod 600 /root/.ssh/id_rsa
此命令将私钥文件的权限设置为仅 root 用户可读写。
步骤二:确保 .ssh 目录权限正确
除了私钥文件,.ssh 目录本身的权限也应正确设置。通常,.ssh 目录的权限应为 700(drwx------)。
chmod 700 /root/.ssh
步骤三:使用 ssh-copy-id 安全复制公钥(推荐)
为了避免手动复制公钥可能带来的权限问题,建议使用 ssh-copy-id 命令。该命令会自动将公钥追加到目标服务器的 ~/.ssh/authorized_keys 文件中,并设置正确的文件权限。
基本命令格式如下:
ssh-copy-id -i /root/.ssh/id_rsa.pub -p [端口号] root@[目标服务器IP]
参数说明:
-i /root/.ssh/id_rsa.pub:指定要发送的公钥文件路径。-p [端口号]:指定目标服务器的 SSH 端口。如果 SSH 服务运行在默认的 22 端口,可省略此参数。如果修改过端口,请务必指定。root@[目标服务器IP]:目标服务器的用户名和 IP 地址。
示例: 假设目标服务器 IP 为 192.168.1.100,SSH 端口为 2222,则命令为:
ssh-copy-id -i /root/.ssh/id_rsa.pub -p 2222 root@192.168.1.100
执行后,根据提示输入目标服务器 root 用户的密码即可完成配置。
步骤四:验证双向免密登录(可选)
如果需要实现两台服务器之间的双向免密 SSH 登录,需要在另一台服务器上重复上述过程:
- 在目标服务器上生成 SSH 密钥对:
ssh-keygen -t rsa(按提示操作,通常直接回车使用默认设置)。 - 使用
ssh-copy-id命令将新生成的公钥复制回第一台服务器。 - 确保两台服务器上的私钥文件(
id_rsa)权限均为600,.ssh目录权限均为700。
补充说明与最佳实践
- 权限检查: 配置完成后,可使用
ls -la /root/.ssh/命令检查权限是否正确。 - 安全建议: 尽量避免直接使用 root 用户进行 SSH 密钥登录。建议为日常操作创建一个具有 sudo 权限的普通用户,并在该用户下配置 SSH 密钥对,以提升系统安全性。
- 端口确认: 如果不确定目标服务器的 SSH 端口,可以在目标服务器上查看 SSH 配置文件:
cat /etc/ssh/sshd_config | grep ^Port。 - 通用性: 本文所述方法适用于 Linux 及 macOS 系统。Windows 系统使用 OpenSSH 客户端时,权限管理逻辑类似,但文件路径和命令可能有所不同。
遵循以上步骤,即可彻底解决“WARNING: UNPROTECTED PRIVATE KEY FILE!”错误,并建立安全的 SSH 免密登录通道。