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!
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
;A
est présente dans B:~/.ssh/authorized_keys
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$
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.
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.
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
#!/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/
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
);B
, nous ajoutons la clé aux clés SSH de A
à ssh-add
;-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;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.