ssh "permissions are too open"问题解决

ssh “permissions are too open”问题解决

技术背景

在使用 SSH 进行远程连接时,可能会遇到 “permissions are too open” 错误。这是因为 SSH 要求私钥文件的权限必须严格控制,只有文件所有者可以读取和写入,否则 SSH 会认为私钥不安全,从而忽略该私钥文件。

实现步骤

Linux 和 macOS 系统

  1. 设置私钥文件权限:私钥文件需要设置为只有所有者可以读写。可以使用以下命令:
1
chmod 600 ~/.ssh/id_rsa

也可以设置为只有所有者可以读取(同时也阻止了写入权限):

1
chmod 400 ~/.ssh/id_rsa

一般情况下,600 权限更合适,因为后续编辑文件时不需要再次更改权限。

  1. 设置 .ssh 目录权限.ssh 目录权限建议设置为 700
1
chmod 700 ~/.ssh

Windows 系统

使用 Cygwin

  1. 更改文件所属组:
1
chgrp Users ~/.ssh/id_rsa
  1. 设置文件权限:
1
chmod 600 ~/.ssh/id_rsa

使用 PowerShell

  1. 以管理员权限打开 PowerShell 并进入密钥所在目录。
  2. 依次执行以下命令:
1
2
3
4
$path = ".\{your private key file name}"  # 例如 ".\mykey"
icacls.exe $path /reset
icacls.exe $path /GRANT:R "$($env:USERNAME):(R)"
icacls.exe $path /inheritance:r

手动设置文件权限

  1. 右键点击文件,选择 “属性”。
  2. 切换到 “安全” 选项卡。
  3. 禁用继承,将继承的权限转换为显式权限。
  4. 移除除管理员和当前用户之外的所有用户和组。
  5. 为当前用户授予只读权限。

使用 WSL(Windows Subsystem for Linux)

简单方法

直接在 ssh 命令前加上 sudo

1
sudo ssh -i keyfile.pem <user>@ip

但这种方法存在安全风险,不建议长期使用。

最佳方法

  1. 将私钥文件复制到 WSL 的家目录下的 .ssh 文件夹:
1
cp keyfile.pem ~/.ssh
  1. 设置私钥文件权限:
1
sudo chmod 400 ~/.ssh/keyfile.pem
  1. 使用 ssh 命令连接:
1
ssh -i ~/.ssh/keyfile.pem <user>@ip

核心代码

Linux 和 macOS 设置权限

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa

Windows PowerShell 设置权限

1
2
3
4
$path = ".\mykey"
icacls.exe $path /reset
icacls.exe $path /GRANT:R "$($env:USERNAME):(R)"
icacls.exe $path /inheritance:r

WSL 最佳实践

1
2
3
cp keyfile.pem ~/.ssh
sudo chmod 400 ~/.ssh/keyfile.pem
ssh -i ~/.ssh/keyfile.pem <user>@ip

最佳实践

  • 定期检查 SSH 私钥文件的权限,确保其安全性。
  • 避免在公共环境中使用不安全的私钥文件。
  • 在自动化脚本中使用 SSH 时,确保私钥文件的权限设置正确。

常见问题

使用 sudo 解决问题是否安全?

不建议长期使用 sudo 解决权限问题,因为这会使 SSH 以 root 身份运行,存在安全风险。应尽量按照最佳实践设置私钥文件权限。

更改权限后仍然无法连接?

  • 检查私钥文件路径是否正确。
  • 检查远程服务器的 SSH 配置是否允许使用该私钥进行连接。
  • 检查防火墙设置,确保 SSH 端口(默认 22)是开放的。

在 WSL 中更改权限无效?

可能是因为文件位于 Windows 文件系统中,WSL 的 chmod 无法生效。应将私钥文件复制到 WSL 的家目录下再进行权限设置。


ssh "permissions are too open"问题解决
https://119291.xyz/posts/ssh-permissions-are-too-open-solve/
作者
ww
发布于
2025年5月9日
许可协议