Bの秘密鍵を使用して、AからBを介してCへのSSH


59

ローカルマシンAからプロキシBを経由して宛先ホストCにSSHで接続する簡単な方法を探しています。Cの公開キーに付随する秘密キーはBにあり、できません。ローカルマシンにそのキーを置きます。任意のヒント?

また、〜/ .ssh / configを使用してこれを実行できるようにしたいと思います。

ありがとう!


1
sshをAからBに、そしてSSHからCにしたいと言っていますか?または、プロキシは真のパススルー状況ですか?
thinice

私はAからCにsshして、Bを通過させたいと思います。以下の回答は、通過部分については機能しますが、パススルーホストBではなくローカルコンピューターでIdentityFileを検索しようとします。
ラングラー

回答:


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-
キース

2
ホストuser1 @ c ProxyCommand ssh -o 'ForwardAgent yes' user2 @ B 'ssh-add && nc%h%p'
Ravindranath Akila

2
マシンBにない場合、ソリューションはどのように変わりncますか?
mjalajel

1
[OK]を@DrewVS、1は追加する必要がありますForwardAgent yes 前に、ProxyJumpコマンドを実行します。
グレイファー

22

以下が機能しているか確認してください。

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で実行されるコマンド、つまりコマンドを指定しています。


これは動作しますが、それはそれはまだA.上に見えるB.からIdentityFileにピックアップしていません
ラングラー

@DrewVS答えを更新しました。動作するかどうかを確認してください。
サチンディヴェカー

サチン、とても賢い。それは完全に機能しました。本当にありがとう!
ラングラー

@DrewVSはそれがあなたのために働いたことを聞いてうれしいです。答えを受け入れてください。
サチンディベカー

ただし、これはパスワードで保護されたrsaキーでは機能しないようです。パスワード入力は非表示になっているため、このアプローチが機能するためには、ユーザーはssh-keyにキーを追加する必要があります。何か案は?
ラングラー

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」のIDファイルは、「B」のsshキーへのパスです。ProxyCommandはNetcatを使用して、「B」から「C」への接続を開きます。Netcat、またはncは「B」にインストールする必要があります。

これが他の人に役立つことを願っています。


3
私はあまりにも早く話しました。この解決策は機能しないようです。キーはssh-agentにロードされていたので、機能していると思いました。上記では、Cのための鍵は、依然としてA上に存在する必要はなく、B.
ラングラー

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

serverfault.com/a/701884/127993を受け入れる必要があります。
sjas

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ます。
  • ジャンプホスト上で、スルーのBSSHキーにキーを追加します。Assh-add
  • これは、を使用してSSHエージェントを転送したためにのみ機能し-o 'ForwardAgent yes'ます。
  • ssh-add -t 1 最終ホストCの認証に必要な1秒間だけキーを追加することを示します。
  • そして最後に、ポートで最終ホストへの接続をnc %h %p開始します(両方ともファイル内の情報に基づいてSSHによって記入されます)。netcat%h%p~/.ssh/config

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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.