错误信息
WARNING: UNPROTECTED PRIVATE KEY FILE!
也可能输出为
- Permissions 0644 for '/path/to/key' are too open.
- It is required that your private key files are NOT accessible by others.
- This private key will be ignored.
以一段被 `@` 行包围的文字块输出,后面跟着“Permissions 0644 for '…' are too open.”——其中的权限位和路径是你的文件的。`ssh-add` 会输出同样的文字块,并拒绝添加该密钥。
OpenSSH client (ssh, ssh-add, scp, git over SSH) — key file permission check
含义
如果私钥文件能被这台机器上的其他用户读取,OpenSSH 就拒绝使用它。该密钥会被忽略(“This private key will be ignored.”),因此连接通常会继续,然后报出“Permission denied (publickey)”。消息中的八进制权限位显示了文件允许的访问;凡是超出所有者读写(`0600` 或 `0400`)的权限都会触发它,在 Windows 上,等效的检查依据的是文件的 ACL。
原因
密钥文件是以默认权限创建的
常见在 CI 中用 `echo "$SSH_KEY" > key` 写出、从压缩包中解压、从仓库克隆或从机密管理器下载的密钥,会得到 umask 决定的默认权限(通常为 0644)。
Windows 上继承的 ACL
常见Windows 版 OpenSSH 会检查有没有其他用户或组(例如 `Users` 或 `Authenticated Users`)拥有访问权限。用户配置文件中的文件常常继承了更宽的权限。
绑定挂载和网络共享
偶见从宿主机挂载到容器中的文件,或从 SMB/NTFS 共享挂载到 WSL 中的文件,可能显示为 0777/0755 权限,而且无法就地修改。
修复方法
- 1.
只允许所有者访问该文件
对密钥执行 `chmod 600`(或 400),对 `~/.ssh` 设为 700。在 CI 中,在写入密钥的同一步骤里设置权限。
bash chmod 600 ~/.ssh/id_ed25519 # owner read/write only (400 works too) chmod 700 ~/.ssh ls -l ~/.ssh/id_ed25519 # -rw------- 1 you you ... - 2.
修正 Windows 上的 ACL
禁用继承,只给你自己的账号授予读取权限。
text REM Windows OpenSSH: remove inherited permissions, grant only your user icacls %USERPROFILE%\.ssh\id_ed25519 /inheritance:r icacls %USERPROFILE%\.ssh\id_ed25519 /grant:r "%USERNAME%":R - 3.
以显式指定的权限挂载密钥
带 `mode: 0400` 的机密(或者把密钥复制到容器中再对它执行 `chmod`)能提供 OpenSSH 要求的权限。
yaml # docker compose: mount the key as a secret with explicit mode instead of a bind mount services: deployer: secrets: - source: deploy_key target: /root/.ssh/id_ed25519 mode: 0400