Problem entry · machine-readable · 编码代理与终端

SSH 报 UNPROTECTED PRIVATE KEY FILE / Permissions ... are too open(私钥权限过宽)

本页嵌入 #trove-entity JSON(本条目全量结构化数据);全库数据见 /agent/trove.json。

元数据

idssh-key-permissions收录2026-08-29
问题域编码代理与终端主题分组权限与安全
适用工具ssh · 外部工具

症状

用 `ssh -i 私钥` 登录时整屏警告:

```

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ WARNING: UNPROTECTED PRIVATE KEY FILE! @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Permissions 0644 for '/path/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 "/path/id_rsa": bad permissions

root@host: Permission denied (publickey,keyboard-interactive).

```

特征:密钥文件本身没问题,是**文件权限**被 ssh 拒绝(组/其他人可读就报);

常见于从压缩包/网盘拷来的密钥、Windows 工具生成的密钥(azure-cli-extensions#6408 就是工具生成 0644 密钥)、

或 WSL 里挂载 Windows 盘的密钥(chmod 无效)。

原因

OpenSSH 客户端加载私钥时强制要求:私钥不能被其他用户/组读取(必须是 600/700 级别)。

一旦 group/other 有读权限(644/640/664 等),直接忽略该密钥并拒绝用其认证——这是防私钥泄露的安全设计,不是故障。

注意:该检查在**认证阶段**才触发(需要先建立 TCP 连接),所以连不上服务器时看不到这个警告。

解法

1. **改权限(Linux/macOS/WSL)**:`chmod 600 ~/.ssh/id_ed25519`(私钥),`chmod 644` 公钥、`chmod 700 ~/.ssh`;

2. **Windows 原生 OpenSSH**:chmod 不适用,用 `icacls "私钥路径" /inheritance:r /grant:r "%USERNAME%:R"`;

3. **WSL 访问 /mnt/c 上的密钥**:drvfs 不支持 chmod(chmod 看着生效实际无效),

正确做法把密钥复制到 WSL 内(`cp` + `chmod 600`)或用 icacls 在 Windows 侧修;

4. **工具生成的临时密钥**(az bastion ssh / 各类 CLI 的 /tmp 密钥):先 chmod 600 再用,或反馈工具修复(#6408 场景);

5. 检查父目录:`~/.ssh` 目录本身别 777(`chmod 700 ~/.ssh`);

6. 批量修复:`chmod 600 ~/.ssh/*` 会误伤公钥(公钥 644 无妨,600 也行),精确一点只改无 .pub 的文件。

验证证据

- 本地实测(2026-08-29,WSL Ubuntu,OpenSSH 10.2p1,本机临时 sshd 端口 2222):

- 环境:apt 装 openssh-server,临时 sshd(127.0.0.1:2222、PermitRootLogin prohibit-password、PasswordAuthentication no),ed25519 密钥加入 authorized_keys;

- 基线:私钥 600 → 免密登录成功(exit 0);

- 复现 1:chmod 644 → `UNPROTECTED PRIVATE KEY FILE` + `Load key ... bad permissions` + `Permission denied`(exit 255);

- 复现 2:chmod 640(仅组可读)→ 同样警告(exit 255)——规则是「不可被他人读取」,不是只要 owner 可读写;

- 修复:chmod 600 → 免密登录恢复成功(exit 0);

- 补充:无 sshd 时(连接失败)该警告不出现——检查在认证阶段,需先能连上;

- 清理:测试 sshd 已杀、端口 2222 空闲、临时密钥与 authorized_keys 已删(本机原 id_ed25519 未动)。

- 实测复现日志(2026-08-29)

来源与证据

素材来源:https://github.com/Azure/azure-cli-extensions/issues/6408

验证证据:Evidence details kept locally (2026-08-29)