You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SSH私钥在远程服务器可带组权限使用,本地机器却不行?

为何SSH私钥在远程服务器可带组权限使用,本地机器却不行?

嘿,这个问题我之前也琢磨过,刚好能给你掰扯明白!咱们先把你的场景理清楚,再拆解两边行为不一样的原因。

你的场景回顾

你登录OverTheWire的bandit13用户后,拿到了一个叫sshkey.private的私钥,用来登录bandit14。用stat看这个文件的权限是这样的:

File: sshkey.private
  Size: 1679        Blocks: 8          IO Block: 4096   regular file
Device: 10301h/66305d   Inode: 517716      Links: 1
Access: (0640/-rw-r-----)  Uid: (11014/bandit14)   Gid: (11013/bandit13)
Access: 2024-06-03 16:10:51.521532387 +0000

说白了就是:这个文件属于bandit14用户,归bandit13组,权限是所有者能读能写,同组用户能读,其他用户啥权限都没有。你作为bandit13,刚好在这个组里,所以能读这个文件,而且用它成功登了bandit14。但要是把这个文件下载到本地,设成同样的0640权限,SSH客户端直接就报错说权限太开放,非得改成0600才行。

核心差异到底在哪?

这背后的关键是SSH客户端对私钥权限的检查逻辑,会根据文件是不是当前用户所有而变化,再加上本地和远程环境的默认配置不一样:

1. 远程服务器为啥允许0640?

你在远程服务器上以bandit13身份跑SSH客户端时,这个私钥的所有者是bandit14,不是你当前的用户。这时候OpenSSH的检查会松一些:

  • 首先确认你(当前用户)能读这个文件——毕竟你在bandit13组,组权限给了读,没问题
  • 然后检查非所有者、非同组的其他用户有没有权限——这里0640的其他权限是---,完全符合要求
  • 另外OverTheWire的服务器可能特意调过SSH配置(比如StrictModes参数),而且bandit13组里估计只有你一个用户,不存在同组其他人偷读私钥的风险,所以客户端就允许用这个私钥了。

2. 本地机器为啥拒绝0640?

把私钥下到本地后,默认你就是这个文件的所有者了。这时候SSH的检查就严格多了:

  • 私钥是你的个人敏感信息,绝对不能让同组或其他用户碰,不然别人拿着你的私钥就能随便登服务器
  • OpenSSH默认配置(StrictModes yes)要求,当你是私钥所有者时,权限必须是**0600(只有自己能读能写)**或者更严格的0400(只有自己能读)。只要组或者其他用户有读权限,直接就报错不让用。

一句话总结

远程那里,私钥不是你的,你靠组权限读,SSH只查外人不能碰,所以0640没事;本地这里,私钥是你的,SSH要确保只有你能碰,所以必须改成0600。

备注:内容来源于stack exchange,提问作者Charystag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:28:17