私钥文件权限必须为600,400虽只读但因缺失写权限被openssh视为异常而拒绝使用;其源码硬编码校验st.st_mode & 077是否为0,仅600(-rw-------)满足要求。

私钥文件不能设为 400 权限。OpenSSH 明确要求私钥文件权限必须是 600,设成 400 会导致 SSH 客户端直接拒绝使用,并报错:Permissions for 'id_rsa' are too open——这不是提示,而是强制拦截。
为什么 400 不行,600 才是正确权限
Linux 文件权限 400 表示“仅所有者可读”,但 OpenSSH 在加载私钥时,不仅检查“是否可读”,还隐式要求“不可被组或其他用户写入或执行”。更关键的是,OpenSSH 的安全策略将 非 600 权限一律视为“过宽”,哪怕只是少了一个写位(如 400、500、644),都会触发拒绝逻辑。这是硬编码在源码中的校验,不是配置项。
- 600 = -rw-------:所有者可读可写,组和其他用户完全无权限 → 符合 OpenSSH 要求
- 400 = -r--------:所有者只读,看似更“保守”,但 OpenSSH 认为缺少写权限可能意味着文件被意外锁定、只读挂载或归属异常,存在潜在风险
- 实际测试中,设为 400 后运行
ssh -i ~/.ssh/id_rsa user@host会立即失败,不尝试连接
正确的权限设置操作
确保私钥和整个 ~/.ssh 目录都满足最小必要权限:
- 私钥文件:
chmod 600 ~/.ssh/id_rsa(路径必须完整,不能只写id_rsa) -
~/.ssh目录:chmod 700 ~/.ssh(防止他人遍历目录看到known_hosts或其他密钥) - 公钥文件可保持 644:
chmod 644 ~/.ssh/id_rsa.pub(公钥本就可公开) - 绝对不要用
sudo chmod修权限——会把文件属主变成 root,导致你自己的用户无法读取私钥
比改权限更有效的防泄露手段
权限只是基础防线,真正防泄露要结合运行时保护:
- 给私钥加口令:
ssh-keygen -p -f ~/.ssh/id_rsa,避免无密码私钥裸奔 - 用
ssh-agent管理:启动后ssh-add -t 3600 ~/.ssh/id_rsa,让私钥只在内存中解密、带超时、不落地 - 禁用无口令私钥的自动加载:在
~/.ssh/config中对高危主机显式指定IdentityFile,避免全局匹配误用
验证是否生效的小技巧
改完权限后别急着连服务器,先本地验证:
- 运行
ssh -T -i ~/.ssh/id_rsa git@github.com(或任意已知支持密钥的地址) - 如果返回
Hi xxx! You've successfully authenticated...,说明权限和密钥都正常 - 如果报
Too open,立刻检查:ls -l ~/.ssh/id_rsa和ls -ld ~/.ssh,确认数字权限确实是 600 和 700











