我在两家公司工作(我们称它们为 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
并将其设置AddKeysToAgent
为yes
。您必须使用 选项指定每个代理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 的选择兼容。