我很好奇这是否可行或者是否值得推荐。
假设我想防止有人设法入侵我的用户帐户(我们称之为帐户)而窃取我的 SSH 或 GPG 密钥user
。因此,我想将密钥的私有部分放在我无权访问的另一个帐户上(我们称之为帐户)。user-keys
因此,如果我希望能够进行任何类型的 SSH 或 GPG 身份验证,我需要将该请求发送到该user-keys
帐户,它会执行身份验证工作,然后将结果发送回我的user
帐户。
这可能吗?如果可以,怎么做?另外,这是推荐的吗?或者除了从互联网上下载和运行软件时要小心之外,还有其他更好的方法来保护密钥吗?
答案1
您或多或少会寻找ssh-agent
类似的工具。它们将签名密钥保存在内存中(通常被锁定,因此即使调试工具也无法访问它们),并且仅在请求时分发签名。
ssh-agent 并非专为在账户之间共享而构建,但
ssh
它本身确实具有“代理转发”模式 - 因此您可以以用户 1 的身份启动代理,然后运行ssh -A user2@localhost
,现在以用户 2 身份运行的进程可以连接到代理并要求其签署身份验证质询。(请注意,它们必须知道由“ssh -A”创建的 $SSH_AUTH_SOCK 值。)这是可行的,因为 ssh-agent 的协议中没有导出私钥的命令。你可以添加代理的私钥;你可以让它签署东西;你可以列出民众键;就是这样。
或者,您可以在主帐户下运行代理,并将实际私钥保存在远程某个地方 - 然后使用 连接
ssh -A
,添加密钥并断开连接。当然,这需要您信任 ssh-agent 使用的 OS 提供的锁定功能(例如无法附加 gdb)。gpg-agent 是有点复杂通过 SSH 转发,但其基本思想仍然相同。GnuPG 已经要求它,但它为应用程序提供了两个不同的套接字来连接;
S.gpg-agent
提供完全访问权限(包括密钥导出),而S.gpg-agent.extra
仅提供与 ssh-agent 类似的基本签名/解密功能的访问权限。请注意,gpg-agent 与 ssh-agent 不同,前者具有执着的密钥存储(作为 ~/.gnupg/ 下的文件),因此“替代”方法不起作用。它还坚持启动自己的密码对话框弹出窗口(pinentry),这在尝试 SSH 转发时可能再次造成困难。
因此,如果您的发行版支持它,我实际上会研究“强制访问控制”模块,例如 AppArmor 或 SELinux,它们可用于拒绝对 ~/.gnupg/ 的所有访问即使来自同一个 UID除通过代理进程外。