ssh “permissions are too open”问题解决
技术背景
在使用 SSH 进行远程连接时,可能会遇到 “permissions are too open” 错误。这是因为 SSH 要求私钥文件的权限必须严格控制,只有文件所有者可以读取和写入,否则 SSH 会认为私钥不安全,从而忽略该私钥文件。
实现步骤
Linux 和 macOS 系统
- 设置私钥文件权限:私钥文件需要设置为只有所有者可以读写。可以使用以下命令:
也可以设置为只有所有者可以读取(同时也阻止了写入权限):
一般情况下,600
权限更合适,因为后续编辑文件时不需要再次更改权限。
- 设置
.ssh
目录权限:.ssh
目录权限建议设置为 700
:
Windows 系统
使用 Cygwin
- 更改文件所属组:
1
| chgrp Users ~/.ssh/id_rsa
|
- 设置文件权限:
使用 PowerShell
- 以管理员权限打开 PowerShell 并进入密钥所在目录。
- 依次执行以下命令:
1 2 3 4
| $path = ".\{your private key file name}" icacls.exe $path /reset icacls.exe $path /GRANT:R "$($env:USERNAME):(R)" icacls.exe $path /inheritance:r
|
手动设置文件权限
- 右键点击文件,选择 “属性”。
- 切换到 “安全” 选项卡。
- 禁用继承,将继承的权限转换为显式权限。
- 移除除管理员和当前用户之外的所有用户和组。
- 为当前用户授予只读权限。
使用 WSL(Windows Subsystem for Linux)
简单方法
直接在 ssh
命令前加上 sudo
:
1
| sudo ssh -i keyfile.pem <user>@ip
|
但这种方法存在安全风险,不建议长期使用。
最佳方法
- 将私钥文件复制到 WSL 的家目录下的
.ssh
文件夹:
- 设置私钥文件权限:
1
| sudo chmod 400 ~/.ssh/keyfile.pem
|
- 使用
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 的家目录下再进行权限设置。