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

60

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

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

Merci!

cow-boy
la source
1
Voulez-vous dire que vous voulez passer de A à B, puis de SSH à C? Ou le proxy est-il une véritable situation de pass-thru?
Thinice
Je souhaite passer de A à C en passant par B. Ma réponse ci-dessous fonctionne pour la partie en transit, mais elle essaie toujours de rechercher le fichier IdentityFile sur mon ordinateur local plutôt que sur B, l'hôte intermédiaire.
wrangler

Réponses:

74

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;
  • Apeut accéder B;
  • Bpeut accéder C;
  • ALa clé publique ssh de est présente dans B:~/.ssh/authorized_keys
  • BLa clé publique ssh de est présente dans C:~/.ssh/authorized_keys

Dans ~/.ssh/configle A, ajoutez

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

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

Vous devriez maintenant pouvoir accéder à Cpartir de A:

A$ ssh C
C$
Boule de neige
la source
13
Cela n'a pris que 4 ans, mais on dirait que nous avons une réponse! Awesome
Wrangler
3
À partir de openssh v.7.3, vous pouvez simplement utiliser ProxyJump B. source: wikibooks
Keith
2
Cela peut-il être défini de la manière suivante: hôte hôte1 @ c, ProxyCommand ssh -o 'ForwardAgent yes' utilisateur2 @ B 'ssh-add && nc% h% p'
Ravindranath Akila, le
2
Comment la solution changerait-elle si la machine B n'a pas nc?
Mjalajel
1
@DrewVS Ok, il faut ajouter ForwardAgent yes avant la ProxyJumpcommande.
Graipher
22

Vérifiez si suivre 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 que la commande ssh -i /path/to/identity_on_B Cest exécutée sur B au lieu d’un shell de connexion.

Sachin Divekar
la source
Cela fonctionne mais il ne récupère pas le fichier d'identité de B. Il a toujours l'air sur A.
wrangler
@DrewVS J'ai mis à jour la réponse. S'il vous plaît vérifier si cela fonctionne pour vous.
Sachin Divekar
Sachin, très intelligent. Cela a fonctionné parfaitement. Merci beaucoup!
Wrangler
@DrewVS heureux d'apprendre que cela a fonctionné pour vous. alors s'il vous plaît accepter la réponse.
Sachin Divekar
Cependant, il semble que cela ne fonctionne pas avec les clés RSA protégées par mot de passe. La saisie du mot de passe est masquée, ce qui oblige l'utilisateur à ajouter la clé à sa clé ssh pour que cette approche fonctionne. Des idées?
Wrangler
10

J'ai travaillé ça maintenant. Voici la solution, qui est plutôt 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-%[email protected]%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 par lequel vous passez. 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'. 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.

cow-boy
la source
3
J'ai parlé trop tôt. Cette solution ne voit pas fonctionner. La clé avait été chargée dans ssh-agent, alors j'ai pensé que cela fonctionnait. Dans ce qui précède, la clé pour C doit toujours être sur A, pas sur B.
wrangler
2

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 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
cow-boy
la source
Je pense que l'ajout d'une clé peut être traité comme idempotent, éliminant ainsi le besoin d'obtenir une liste de clés.
dmourati
Vous devriez accepter serverfault.com/a/701884/127993 qui fait exactement ce que vous voulez.
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' [email protected]$bastion_host -p $bastion_port 'ssh-add ~/.ssh/*.rsa && nc %h %p'" /tmp/x.txt [email protected]$target_host:/tmp/
wcc526
la source
1

Faire:

ssh [email protected]_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' [email protected]_C 'ssh-add && nc %h %p'
Host IP_C
  ProxyCommand ssh -o 'ForwardAgent yes' [email protected]_B 'ssh-add && nc %h %p'

Cette réponse est basée sur la réponse choisie. Je devais comprendre comment divers utilisateurs s’intégraient dans le scénario.

Cela fonctionne pour moi. HTH.

Ravindranath Akila
la source
0

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

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

Modifiez votre ~/.ssh/configfichier et ajoutez l'hôte Bpar lequel vous souhaitez passer, comme vous le feriez normalement pour configurer un hôte:

Host B
 User myusername
 HostName b.mycompany.com

Ensuite, vous ajoutez l'hôte sur Clequel 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 -qindique qu'il ne doit pas allouer de pseudo-TTY ( -T) ni être silencieux ( -q);
  • une fois sur l'hôte de saut B, nous ajoutons la clé aux clés SSH de Athrough ssh-add;
  • qui ne fonctionne que parce que nous avons transféré l'agent SSH en utilisant -o 'ForwardAgent yes'.
  • ssh-add -t 1 indique que je souhaite que la clé ne soit ajoutée que pendant la seconde nécessaire à l'authentification auprès de l'hôte final C;
  • et enfin, nc %h %pinitie une netcatconnexion au dernier hôte %hau port %p(les deux seront renseignés par SSH en fonction des informations contenues dans le ~/.ssh/configfichier).

Si vous devez spécifier une clé personnalisée Bà utiliser, vous pouvez le faire en modifiant la ssh-addpièce:

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'
Daniel AA Pelsmaeker
la source