使用B上的私钥从A到B到C进行SSH


59

我正在寻找一种从本地计算机A通过代理B到目标主机C进行SSH的简单方法。与C上的公钥一起的私钥在B上,但是我不能将该密钥放在我的本地计算机上。有小费吗?

另外,我希望能够使用〜/ .ssh / config进行此操作。

谢谢!


1
您是说要从A交换到B,然后从SSH交换到C吗?还是代理是真正的直通情况?
thinice 2011年

我想从A到C并通过B进行交换。下面的答案适用于通过部分,但它仍然尝试在本地计算机上而不是在通过主机B上查找IdentityFile。
wrangler

Answers:


74

原理图:

    ssh       ssh
A ------> B ------> C
    ^          ^
 using A's   using B's
 ssh key     ssh key

前提条件:

  • A 正在运行ssh-agent;
  • A可以访问B;
  • B可以访问C;
  • A的ssh公钥位于 B:~/.ssh/authorized_keys
  • B的ssh公钥位于 C:~/.ssh/authorized_keys

~/.ssh/configA,添加

Host C
    ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'

如果B上的ssh私钥位于非标准位置,请在后面添加其路径ssh-add

您现在应该能够访问C来自A

A$ ssh C
C$

13
只用了4年,但看来我们有答案了!太棒了
牧马人

3
从openssh v.7.3开始,您可以使用ProxyJump B。来源:Wikibooks
Keith,

2
这个问题能如此定义的:主机USER1 @çProxyCommand SSH -o 'ForwardAgent是'用户2 @ B '的ssh-添加&& NC%H%P'
Ravindranath阿基拉

2
如果机器B没有,解决方案将如何改变nc
mjalajel

1
@DrewVS好吧,需要在命令ForwardAgent yes 添加一个ProxyJump
Graipher

21

检查以下是否有效。

ssh -t B ssh C

如果要使用存储在B上的密钥,请使用以下命令。

ssh -t B ssh -i /path/to/identity_on_B C

在这里,我们指定命令,即ssh -i /path/to/identity_on_B C在B而不是登录shell上执行。


此方法有效,但不会从B接收IdentityFile。它仍然在A上看起来
。– wrangler

@DrewVS我已经更新了答案。请检查它是否对您有用。
2011年

萨钦,非常聪明。那很好。非常感谢!
wrangler

@DrewVS很高兴听到它对您有用。所以请接受答案。
2011年

但是,这似乎不适用于受密码保护的rsa密钥。密码输入是隐藏的,迫使用户必须将密钥添加到他们的ssh-key才能使此方法起作用。有任何想法吗?
wrangler

10

我现在已经解决了。这是解决方案,非常简单。我应该早点看的:

〜/ .ssh / config:

Host B
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/rsa_key
  ControlMaster auto
  ControlPath ~/.ssh/socket/master-%l-%r@%h:%p

Host C.*
  User customer_username
  Port customer_port
  IdentityFile remote/path/to/ssh/key
  ForwardAgent yes
  ProxyCommand ssh accessable.server nc %h %p

Host C.server-1
  HostName 2.3.4.5

“ B”是您要跳过的代理服务器。应该像通常配置对服务器的访问那样配置它。

“ C”是目标主机。需要将其配置为在连接过程中使用“ B”。“ C”中的身份文件是“ B”上ssh密钥的路径。ProxyCommand使用Netcat打开从“ B”到“ C”的连接。Netcat或nc将需要安装在“ B”上。

希望这对其他人有帮助。


3
我说得太早了。该解决方案似乎无效。密钥已加载到ssh-agent中,因此我认为它可以正常工作。在上面,C的密钥仍然需要在A而不是B上
。– wrangler

2

我写了一个简单的脚本,基本上在远程实例上列出了我的ssh密钥,然后将我选择的密钥添加到本地ssh代理中。这不是很干净,但是允许我将所有密钥都保留在远程位置而不是本地。

如果有人感兴趣,这是脚本:

#!/usr/bin/ruby

require "rubygems"
require "fileutils"

# Get key list
key_list = (`ssh jumpbox "cd ~/.ssh/ ; ls id_rsa*" | sed 's/id_rsa_/  /g' | sed     's/id_rsa//g'`)
puts ' '
puts 'Available customer keys:'
puts key_list

# Get customer name input
puts ' '
puts 'Enter customer name: '
customer_name = gets.chomp

# Add key to ssh-agent
key_name = "~/.ssh/id_rsa_#{customer_name}"
puts ' '
puts "Adding #{key_name} to local ssh-agent"
`ssh jumpbox "ssh-add ~/.ssh/id_rsa_#{customer_name}"`
exit 0

我认为添加密钥可以被视为幂等,从而消除了获取密钥列表的需要。
dmourati 2015年

您应该接受serverfault.com/a/701884/127993,它完全可以满足您的要求。
sjas 16/09/20

1
#!/usr/bin/env bash
target_host=10.121.77.16
target_port=22
target_user=vagrant

bastion_user=yourusername
bastion_host=10.23.85.245
bastion_port=32780

scp -P $target_port -o ProxyCommand="ssh -o 'ForwardAgent yes' $bastion_user@$bastion_host -p $bastion_port 'ssh-add ~/.ssh/*.rsa && nc %h %p'" /tmp/x.txt $target_user@$target_host:/tmp/

1

去做:

ssh someuser@IP_D

这样

A -> B-> C -> D A是您所在的主机,

像这样编辑本地〜/ .ssh / config:

Host IP_D
  ProxyCommand ssh -o 'ForwardAgent yes' userX@IP_C 'ssh-add && nc %h %p'
Host IP_C
  ProxyCommand ssh -o 'ForwardAgent yes' userY@IP_B 'ssh-add && nc %h %p'

该答案基于所选答案。我必须弄清楚各种用户如何适应整个方案。

这对我有用。HTH。


0

Snowball的回答很有帮助。但是,我对该命令做了一些修改,并想解释它的工作原理。在这种情况下:

    ssh        ssh
A -------> B -------> C
     ^          ^
  using A's  using B's
  ssh key    ssh key

修改~/.ssh/config文件并添加B要跳转的主机,就像通常配置主机一样​​:

Host B
 User myusername
 HostName b.mycompany.com

然后,添加C要结束的主机:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'

注意ProxyCommand,其中:

  • ssh -T -q指示它不应分配伪TTY(-T)并保持安静(-q);
  • 一旦跳主机上B,我们添加了关键的SSH密钥A通过ssh-add;
  • 之所以有效,是因为我们使用转发了SSH代理-o 'ForwardAgent yes'
  • ssh-add -t 1 表示我只希望将密钥添加到对最终主机C进行身份验证所需的1秒钟;
  • 最后,在端口上nc %h %p启动netcat到最终主机%h的连接%p(这两个端口都将根据~/.ssh/config文件中的信息由SSH填充)。

如果需要指定B要使用的自定义键,则可以通过修改ssh-add零件来实现:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.