ssh公钥应设为644权限,因其本质公开无需保密;必须设为600的仅三类文件:客户端私钥(如id_rsa)、服务端authorized_keys文件、identityfile指定的私钥路径。

SSH 公钥本身不需要保密,设置为只读权限(644)是正确且推荐的做法。强行设成 600 不但没安全收益,反而会干扰自动化流程和团队协作。
哪些文件必须是 600?
真正需要严格限制为 600 的只有三类:
- 客户端私钥文件(如 ~/.ssh/id_rsa、~/.ssh/id_ed25519)——OpenSSH 客户端加载时会直接拒绝权限过宽的私钥
- 服务端 ~/.ssh/authorized_keys 文件——sshd 在 StrictModes 启用时,会因权限非 600 拒绝读取
- 服务端配置中 IdentityFile 指向的私钥路径(如 /etc/keys/deploy.key)——只要它是私钥,就必须是 600
为什么公钥要设成 644?
公钥本质是“公开的锁模”,设计上就允许分发和查看。设为 644 是合理开放,不是疏忽:
- CI/CD 流水线中,Jenkins 或 GitHub Actions 需要读取公钥上传到目标服务器;若为 600,非属主用户无法读取,导致部署失败
- 团队成员常需用 ssh-keygen -lf id_rsa.pub 核对指纹,600 权限会让普通用户执行失败
- OpenSSH 对公钥文件无权限校验,644 不影响任何功能,且符合最小权限原则中的“按需开放”逻辑
一键完成权限加固
执行以下命令即可覆盖常见场景:
- chmod 600 ~/.ssh/id_ed25519(修复私钥)
- chmod 600 ~/.ssh/authorized_keys(修复服务端授权列表)
- chmod 700 ~/.ssh(确保目录不可被他人进入)
- chmod 644 ~/.ssh/id_ed25519.pub(显式设公钥为只读)
- chown $USER:$USER ~/.ssh ~/.ssh/*(避免 root 创建后普通用户无权访问)
排查免密登录失败的关键线索
运行 ssh -Tvvv user@host,重点关注日志中是否出现:
- "UNPROTECTED PRIVATE KEY FILE!" → 私钥权限错误(应为 600)
- "Authentication refused: bad ownership or modes" → 服务端 authorized_keys 或 .ssh 目录权限不合规
注意:~/.ssh/known_hosts 不需要也不建议设为 600,保持默认 644 即可;Windows 用户请通过文件属性安全设置替代 chmod。











