![SSH 使用外部存储中的密钥 - 权限?](https://linux22.com/image/48720/SSH%20%E4%BD%BF%E7%94%A8%E5%A4%96%E9%83%A8%E5%AD%98%E5%82%A8%E4%B8%AD%E7%9A%84%E5%AF%86%E9%92%A5%20-%20%E6%9D%83%E9%99%90%EF%BC%9F.png)
我有一组 SSH 密钥来登录帐户和服务器。然而,自从我将主要工作配置文件移至 USB 驱动器(出于同步和易用性等原因)后,我一直无法直接地使用配置文件中的 SSH 密钥进行身份验证,而必须创建本地副本。
正常的 SSH 工作流程通常会进行
ssh-add $HOME/.ssh/id_server_key
ssh username@domain
哪个工作没有问题。但是,为了防止每台计算机都有我的密钥副本,我将它们移动到 xexternal 驱动器,USB 格式为vfat
.然后是工作流程应该变成这样:
ssh-add /run/media/myself/USB/.ssh/id_server_key
ssh username@domain
...这行不通。 SSH 抱怨做了一些事情来保护我:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @警告:未受保护的私钥文件! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ “id_server_key”的权限 0644 过于开放。 要求您的私钥文件不能被其他人访问。 该私钥将被忽略。 错误权限:忽略密钥:id_server_key 权限被拒绝(公钥)。
虽然我能理解,但事实并非如此真的在这种情况下保护我。
USB 驱动器会自动安装在我的发行版中,其 fmask 为(我认为)022
。我可以使用 fmask 卸载并重新安装 USB 驱动器,077
但这会 (1) 每次都需要超级用户权限,并且 (2) 会影响设备中的每个文件,而不仅仅是 SSH 密钥。
我尝试过创建密钥的符号链接,即使以前使用过,umask
正如我在一些提示和技巧中看到的那样:
cd .ssh
umask 077
ln -s /run/media/myself/USB/.ssh/id_server_key
但权限不能以这种方式用于符号链接,所以我什么也得不到。
所以呢选项如果我的目标是不是机器上有密钥的物理副本吗?其中一台机器是一台家庭笔记本电脑,可以去不同的地方,所以我有兴趣避免一些密钥被发现。
到目前为止,我已经考虑了以下几点:
- 例如,是否有一个选项可以强制 SSH(
ssh-add
主要是)接受来自外部设备的密钥? (我认为应该有 - 大多数程序都遵循“我知道我在做什么”标志,但到目前为止我在联机帮助页中找不到它。 bindfs
在目录上设置.ssh/
,但问题是目录非空(因为它包含known_hosts
其他数据)。fuse-zip
- 翻开钥匙/dev/shm
似乎也是一条可能的路径。
编辑:根据@Gilles 的评论,是的,bindfs
解决了问题。检查联机帮助页后,使用以下调用成功进行了初始测试:
bindfs -n -r -p 0700 -o nonempty /run/media/myself/USB/.ssh/ ~/.ssh
它绑定禁止其他用户(显然甚至是root
!)的访问,只读,具有反射0700
权限。这种反思是我最初使用 bindfs 时所缺少的部分。nonempty
由于预先存在的文件(例如known_hosts
.这完全保留了原始工作流程,除了关于无法添加信息的额外警告消息known_hosts
(最终我可能不介意)。
当然,我现在按照最初的建议将文件系统绑定到另一个目录(在 /dev/shm 中),以使事情变得稍微容易一些。
我对encfs
我的 USB 驱动器还不太热心,所以从隐私角度来说,这对我来说已经足够了。
答案1
您可以通过以下方式加载外部密钥命名管道,例如
$ mkfifo -m=600 fifo
$ cat /external/media/.ssh/id_server_key >fifo | ssh-add fifo
使用进程替换也可以工作(使用类似 bash/zsh 的语法):
$ ssh-add <(cat /external/media/.ssh/id_server_key)
上述命令等同于:cat /external/media/.ssh/id_server_key | ssh-add -
。
假设你的匿名管道有正确的权限(通过检查:)stat <(:)
。
或者尝试从标准输入加载它:
$ cat /external/media/.ssh/id_server_key | ssh-add -
答案2
ssh-add
没有选项可以绕过其对关键权限的检查。您可以重新编译该程序并禁用该检查。
一个bindfs应该可以工作。您不需要将其安装在~/.ssh
,将其安装在特殊用途的位置并编写一个可以执行此操作的脚本ssh-add ~/.ssh-private-keys-bindfs
。
请注意,ssh 是正确的,因为您的设置非常不安全。您必须确保永远不要将该驱动器插入到您不是唯一用户的计算机中。
答案3
这是一个权限问题,如以下行所示:
“id_server_key”的权限 0644 过于开放。
出现这种情况,是因为你对私钥的权限过于开放,那么 ssh 就无法保证该密钥的真实性,而会犹豫使用它。
因此,考虑到拇指驱动器的 VFATness(不支持更改权限),您可以执行以下操作,例如将此行添加到/etc/fstab
文件中:
LABEL=USB none msdos -u=USERID,-m=PERMS
其中 USERID 是您的数字用户 ID,PERMS 是 700。这应该告诉自动安装程序始终以该用户身份安装 USB 驱动器,没有组或其他权限。
如果您的文件系统支持权限,则通过以下方式修复它会更容易:
chmod 700 /run/media/myself/USB/.ssh
chmod 400 /run/media/myself/USB/.ssh/id_server_key
答案4
在 Ubuntu 20.04 上,以下工作正常:
cat ~/.ssh/my-key.pem | ssh-add -
Identity added: (stdin) ((stdin))