SSH 使用外部存储中的密钥 - 权限?

SSH 使用外部存储中的密钥 - 权限?

我有一组 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))

相关内容