为何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
相关产品推荐
相关产品推荐

