SSH代理转发特定密钥而不是所有已注册的ssh密钥

时间:2014-03-22 13:52:47

标签: linux github amazon-web-services ssh ssh-keys

我正在使用代理转发,它运行正常。但是ssh客户端正在与远程服务器共享所有已注册的(ssh-add)密钥。我有个人密钥,我不想与远程服务器共享。有没有办法限制密钥被转发?

我有多个github帐户和aws帐户。我不想分享所有的ssh-key。

2 个答案:

答案 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转发。

  1. 在本地主机上,我们运行辅助ssh-agent,只包含我们希望在远程主机上看到的密钥。
  2. 在本地主机上,我们设置了某些端口(portXXX)上的TCP连接转发到辅助ssh-agent的套接字。
  3. 在远程主机上,我们设置从某个套接字转发到某个TCP端口(portYYY)。
  4. 然后我们与远程的portYYY到本地portXXX的端口转发建立ssh连接。
  5. 对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
    

    缺点

    1. 它不是完全安全的,因为ssh-agent通过TCP部分可用:远程主机的用户可以在127.0.0.1:portYYY上连接到本地代理,本地主机的其他用户可以在127.0.0.1上连接: portXXX。但他们只会看到您手动添加到此代理的有限密钥集。并且,作为AllenLuce mentioned,他们无法抓住它,他们只能在代理运行时将其用于身份验证。
    2. 必须在远程主机上安装
    3. socat。但看起来可以简单地上传预编译的二进制文件(我在FreeBSD上测试它并且它可以工作)。
    4. 无自动化:必须通过ssh-add手动添加密钥,转发需要运行2个额外进程(socat),必须手动管理多个ssh连接。
    5. 因此,这个答案可能只是概念证明,而不是生产解决方案。

      让我们看看它是如何完成的。

      指令

      客户端(运行ssh-agent的地方)

      运行新的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!