web-dev-qa-db-ja.com

Bの秘密鍵を使用して、AからBを介してCにSSH接続します。

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

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

ありがとう!

69
wrangler

回路図:

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

前提条件:

  • Aはssh-agentを実行しています。
  • ABにアクセスできます。
  • BCにアクセスできます。
  • Aのssh公開鍵はB:~/.ssh/authorized_keysにあります
  • Bのssh公開鍵はC:~/.ssh/authorized_keysにあります

A~/.ssh/configに、

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

Bのssh秘密鍵が標準以外の場所にある場合は、ssh-addの後にそのパスを追加します。

これで、CからAにアクセスできるようになります。

A$ ssh C
C$
84
Snowball

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

ssh -t B ssh C

Bに保存されているキーを使用する場合は、次のコマンドを使用します。

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

ここでは、ログインシェルの代わりにBで実行するコマンド、つまりssh -i /path/to/identity_on_B Cを指定しています。

27
Sachin Divekar

私はこれを今解決しました。これが解決策です。これはかなり単純です。私はもっ​​と早くそれを見ていたはずです:

〜/ .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」にインストールする必要があります。

これが他の人を助けることを願っています。

11
wrangler

基本的にリモートインスタンスの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
2
wrangler
#!/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
wcc526

スノーボールの答え は大いに役立ちました。ただし、コマンドにいくつかの変更を加え、コマンドがどのように機能するかを説明したいと思いました。この状況を考えると:

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

~/.ssh/configファイルを変更して、ジャンプしたいHost Bを追加します。これは、通常のHostの構成方法と同じです。

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);ことを示します。
  • ジャンプHost Bに到達したら、Assh-addのSSHキーにキーを追加します。
  • これは、-o 'ForwardAgent yes'を使用してSSHエージェントを転送したためにのみ機能します。
  • 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'

実行するには:

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。

1