我正在使用代理转发,它运行正常。但是ssh客户端正在与远程服务器共享所有已注册的(ssh-add)密钥。我有个人密钥,我不想与远程服务器共享。有没有办法限制密钥被转发?
我有多个github帐户和aws帐户。我不想分享所有的ssh-key。
答案 0 :(得分:4)
转发代理商不会共享密钥本身。转发的是能够联系本地主机上的ssh-agent的能力。远程系统通过转发隧道发送质询请求。他们自己不会要求钥匙。
有关图形说明,请参阅http://www.unixwiz.net/techtips/ssh-agent-forwarding.html#fwd。
答案 1 :(得分:4)
看起来可以使用OpenSSH 6.7 - 它支持unix套接字转发。我们可以使用特定密钥启动辅助ssh-agent并将其套接字转发到远程主机。不幸的是,在撰写本文时,我的服务器/客户端系统无法使用此版本。
我找到了另一种可能的解决方案,使用socat和标准SSH TCP转发。
对ssh代理的请求是这样的:
local ssh-agent (secondary)
^
|
v
/tmp/ssh-.../agent.ZZZZZ - agent's socket
^
| (socat local)
v
localhost:portXXX
^
| (ssh port forwarding)
v
remote's localhost:portYYY
^
| (socat remote)
v
$HOME/tmp/agent.socket
^
| (requests for auth via agent)
v
SSH_AUTH_SOCK=$HOME/tmp/agent.socket
^
| (uses SSH_AUTH_SOCK variable to find agent socket)
v
ssh
socat
。但看起来可以简单地上传预编译的二进制文件(我在FreeBSD上测试它并且它可以工作)。ssh-add
手动添加密钥,转发需要运行2个额外进程(socat),必须手动管理多个ssh连接。因此,这个答案可能只是概念证明,而不是生产解决方案。
让我们看看它是如何完成的。
运行新的ssh-agent。它将用于您只想在远程主机上看到的密钥。
$ ssh-agent # below is ssh-agent output, DO NOT ACTUALLY RUN THESE COMMANDS BELOW
SSH_AUTH_SOCK=/tmp/ssh-qVnT0UsgV6yO/agent.22982; export SSH_AUTH_SOCK;
SSH_AGENT_PID=22983; export SSH_AGENT_PID;
它打印一些变量。不要设置它们:你将丢失主ssh代理。设置另一个变量,建议值为SSH_AUTH_SOCK
:
SSH_AUTH_SECONDARY_SOCK=/tmp/ssh-qVnT0UsgV6yO/agent.22982
然后在本地建立从某个TCP端口到我们的ssh-agent套接字的转发:
PORT=9898
socat TCP4-LISTEN:$PORT,bind=127.0.0.1,fork UNIX-CONNECT:$SSH_AUTH_SECONDARY_SOCK &
socat
将在后台运行。完成后别忘了kill
。
使用ssh-add
添加一些密钥,但使用修改后的环境变量SSH_AUTH_SOCK
运行它:
SSH_AUTH_SOCK=$SSH_AUTH_SECONDARY_SOCK ssh-add
通过端口转发连接到远程主机。您的主要(非次要)ssh代理将用于hostA上的身份验证(但不会从中获取,因为我们不转发它)。
home-host$ PORT=9898 # same port as above
home-host$ ssh -R $PORT:localhost:$PORT userA@hostA
在远程主机上建立从ssh-agent套接字转发到与主机上相同的TCP端口:
remote-host$ PORT=9898 # same port as on home host
remote-host$ mkdir -p $HOME/tmp
remote-host$ SOCKET=$HOME/tmp/ssh-agent.socket
remote-host$ socat UNIX-LISTEN:$SOCKET,fork TCP4:localhost:$PORT &
socat
将在后台运行。完成后别忘了kill
它。关闭ssh连接时,它不会自动退出。
在远程主机上为ssh设置enviromnent变量,以了解代理套接字(来自上一步)的位置。它可以在同一个ssh会话中完成,也可以并行执行。
remote-host$ export SSH_AUTH_SOCK=$HOME/tmp/ssh-agent.socket
现在可以在远程主机上使用辅助代理的密钥:
remote-host$ ssh userB@hostB # uses secondary ssh agent
Welcome to hostB!