转发对 ssh-agent 身份子集的访问

Too*_*eys 8 security linux ssh

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

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

ssh -A redcorp-server1

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

同样,我可以运行:

ssh -A bluecorp-server1

并从那里访问 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。

有一个更好的方法吗?

dan*_*nyw 9

您现在可以使用多个代理并指定每个代理具体使用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
Run Code Online (Sandbox Code Playgroud)

  • @TylerAbair 因为“IdentityAgent”指令(2016 年 8 月的 OpenSSH 7.3)在 2015 年 1 月编写“最佳”答案时并不存在。这个新答案确实更好,并且随着时间的推移稳步获得选票,但这并不是因为最初的观众喜欢混淆或类似的内容。 (2认同)

小智 7

我为自己实现了一个ssh-agent-filter,将它用于:

$ afssh -c id_bluecorp -- server1.bluecorp.com
$ afssh -c id_bluecorp -- server2.bluecorp.com
$ afssh -c id_redcorp -- server42.redcorp.com
Run Code Online (Sandbox Code Playgroud)

它已经在 Debian(和 Ubuntu)中。


Hau*_*ing -3

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