将访问转发给 ssh-agent 身份子集

将访问转发给 ssh-agent 身份子集

我在两家公司工作(我们称它们为 RedCorp 和 BlueCorp)。他们都信任我,但他们彼此不信任,我不想将任何一方的秘密泄露给另一方。

我的笔记本电脑的 ssh-agent 有两个私钥,一个用于访问每个公司。我可以运行:

ssh -A redcorp-服务器1

并凭借我的转发代理连接从那里访问 redcorp 的所有其他服务器。

同样,我可以运行:

ssh -A bluecorp-服务器1

并从那里访问 bluecorp 的所有其他服务器。

问题是,每当我登录到 redcorp-server1 时,那里的 root 用户都可以设置他的 $SSH_AUTH_SOCK 以指向我的转发代理连接,并滥用我的其他身份闯入 BlueCorp。

我怎样才能防止这种情况发生?

ssh 的 IdentitiesOnly 选项不能满足我的要求。它只能控制我在向 redcorp-server1 进行身份验证时提供哪个密钥;它无法改变我的转发代理连接允许 redcorp-server1 上的 ssh 进程使用我的任何身份进行身份验证的事实。

我发现的唯一解决方案是运行两个单独的 ssh 代理,并且只在每个代理中加载一个密钥。但这非常麻烦:ssh_config 节无法指定连接到给定主机时应使用哪个代理。相反,我不得不在笔记本电脑上为两个公司中的每一个创建 shell 别名,在运行 ssh 之前将 $SSH_AUTH_SOCK 指向正确的代理。此外,我使用 rsync 和十几个其他使用 ssh 作为传输的工具,并且每个工具都必须使用不同的语法进行配置,以使其以这种特殊方式调用 ssh。

有一个更好的方法吗?

答案1

现在,您可以使用多个代理并使用 来具体指定每个代理IdentityAgent,并使用 来添加所需的密钥,IdentityFile并将其设置AddKeysToAgentyes。您必须使用 选项指定每个代理ssh-agent要绑定到的unix 套接字-a。当然,您也可以在创建每个代理后使用 来手动添加密钥ssh-add

首先创建你的代理:

ssh-agent -a ~/.ssh/redcorp-agent

然后你.ssh/config就会有类似这样的事情:

Host redcorp* *.redcorp.com
IdentityFile ~/.ssh/redcorp.pem
IdentityAgent ~/.ssh/redcorp-agent
AddKeysToAgent yes
ForwardAgent yes

答案2

我实施了一个ssh-代理过滤器对于我自己来说,使用它来:

$ afssh -c id_bluecorp -- server1.bluecorp.com
$ afssh -c id_bluecorp -- server2.bluecorp.com
$ afssh -c id_redcorp -- server42.redcorp.com

它已经存在于 Debian(和 Ubuntu)中。

答案3

openssh 有一个补丁,它将把SSH_AUTH_SOCK_FORWARD环境变量指定的 ssh-agent 转发到远程主机,并使用通常的环境变量代理SSH_AUTH_SOCK对主机进行身份验证。

这意味着您可以使用 ssh-agent 过滤器来仅过滤您希望在远程计算机上可用的密钥,并将环境变量从 ssh-agent 过滤器更改为,SSH_AUTH_SOCK_FORWARD同时将所有密钥留在SSH_AUTH_SOCK代理中。

您可以在这里找到补丁:

https://bugzilla.mindrot.org/show_bug.cgi?id=1937

希望它能够应用于openssh。

答案4

我不明白这个问题。如果您将 $SSH_AUTH_SOCK 设置并导出为适当的值,则调用 ssh 的程序不需要任何修改。当然,例如 rsync 调用的目标必须与 ssh-agent 的选择兼容。

相关内容