web-dev-qa-db-fra.com

SSH de A à B vers C, en utilisant la clé privée sur B

Je cherche un moyen simple de SSH depuis ma machine locale, A, via un proxy, B, vers un hôte de destination, C. La clé privée qui va avec la clé publique sur C est sur B, et je ne peux pas mettre cette clé sur ma machine locale. Des conseils?

Aussi, j'aimerais pouvoir le faire en utilisant ~/.ssh/config.

Merci!

69
wrangler

Schématique:

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

Conditions préalables:

  • A exécute ssh-agent;
  • A peut accéder à B;
  • B peut accéder à C;
  • La clé publique ssh de A est présente dans B:~/.ssh/authorized_keys
  • La clé publique ssh de B est présente dans C:~/.ssh/authorized_keys

Dans ~/.ssh/config sur A, ajoutez

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

Si votre clé privée ssh sur B se trouve dans un emplacement non standard, ajoutez son chemin après ssh-add.

Vous devriez maintenant pouvoir accéder à C à partir de A:

A$ ssh C
C$
84
Snowball

Vérifiez si ce qui suit fonctionne.

ssh -t B ssh C

Utilisez la commande suivante si vous souhaitez utiliser la clé stockée sur B.

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

Ici, nous spécifions la commande i.e ssh -i /path/to/identity_on_B C à exécuter sur B au lieu d'un shell de connexion.

27
Sachin Divekar

Je l'ai résolu maintenant. Voici la solution, qui est assez simple. J'aurais dû le voir plus tôt:

~/.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" est le serveur proxy que vous utilisez. Il doit être configuré comme vous le feriez normalement pour configurer l'accès à un serveur.

"C" est l'hôte de destination. Il doit être configuré pour utiliser "B" dans le processus de connexion. Le fichier d'identité en "C" est le chemin d'accès à la clé ssh sur "B". Le ProxyCommand utilise Netcat pour ouvrir la connexion à "C" à partir de "B". Netcat, ou nc, devra être installé sur 'B'.

J'espère que cela aide les autres.

11
wrangler

J'ai écrit un script simple pour répertorier mes clés ssh sur l'instance distante, puis ajouter celle que j'ai sélectionnée à mon agent ssh local. Ce n'est pas très propre, mais cela me permet de conserver toutes les clés sur un emplacement distant plutôt que localement.

Voici le script si quelqu'un est intéressé:

#!/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

réponse de Snowball a beaucoup aidé. Cependant, j'ai apporté quelques modifications à la commande et je voulais expliquer comment cela fonctionne. Compte tenu de cette situation:

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

Modifiez votre ~/.ssh/config fichier et ajoutez l'hôte B par lequel vous voulez sauter, comme vous le feriez normalement pour configurer un hôte:

Host B
 User myusername
 HostName b.mycompany.com

Ensuite, vous ajoutez l'hôte C sur lequel vous souhaitez vous retrouver:

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

Notez le ProxyCommand, où:

  • ssh -T -q indique qu'il ne doit pas allouer de pseudo-ATS (-T) et tais-toi (-q);
  • une fois sur l'hôte de saut B, nous ajoutons la clé aux clés SSH de A à ssh-add;
  • ce qui ne fonctionne que parce que nous avons transféré l'agent SSH à l'aide de -o 'ForwardAgent yes'.
  • ssh-add -t 1 indique que je souhaite que la clé soit ajoutée uniquement pendant la seconde nécessaire à l'authentification auprès de l'hôte C final;
  • et enfin, nc %h %p initie une connexion netcat à l'hôte final %h au port %p (les deux seront remplis par SSH sur la base des informations contenues dans le ~/.ssh/config fichier).

Si vous devez spécifier une clé personnalisée sur B à utiliser, vous pouvez le faire en modifiant le ssh-add partie:

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'

Faire:

ssh someuser@IP_D

tel que

A -> B-> C -> D où A est l'hôte sur lequel vous vous trouvez,

éditez votre ~/.ssh/config local comme ceci:

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'

Cette réponse est basée sur la réponse choisie. J'ai dû comprendre comment divers utilisateurs s'intégraient à l'ensemble du scénario.

Cela fonctionne pour moi. HTH.

1
Ravindranath Akila