13 votes

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

Voici mon scénario :

  • L'hôte C n'est pas accessible depuis A.
  • L'hôte B est accessible depuis A.
  • L'hôte C est accessible depuis B.
  • B et C ont tous deux ~/.ssh/id_rsa.pub (de A) en authorized_keys
  • B ne dispose pas de la clé privée ( ~/.ssh/id_rsa ), car cela constituerait un risque pour la sécurité (la clé est personnelle).
  • comme B n'a pas la clé privée, il n'est pas possible de se connecter à C à partir de celle-ci

Comment puis-je utiliser la clé de l'hôte A pour me connecter à l'hôte C ? Est-ce possible ? Je crains que non.

(similaire mais différent de cette question )

EDITAR

Ce dont j'ai besoin, c'est d'un moyen de fournir, à la volée (stdin ou similaire), la clé privée au ssh hop en B, sans qu'il ne touche jamais le système de fichiers en B. Est-ce possible ?

0 votes

Faire un tunnel ssh sur l'hôte B.

0 votes

Vous dites "B ne dispose pas de la clé privée (~/.ssh/id_rsa), car cela constituerait un risque pour la sécurité". Pourquoi ? Y a-t-il plusieurs utilisateurs qui se connectent à le même compte en B ? Est-il possible de créer plusieurs comptes en B (un par utilisateur) afin d'avoir des clés privées en B également ?

0 votes

@MrShunz pas au même utilisateur, mais plusieurs utilisateurs peuvent devenir root ...

11voto

martin Points 49

Si vous utilisez une version récente d'OpenSSH, vous pouvez simplement taper :

ssh -J B C

Si vous utilisez une version légèrement plus ancienne sans -J vous pouvez utiliser une syntaxe légèrement plus élaborée :

ssh -o ProxyCommand='ssh -W %h:%p B' C

Si vous en avez besoin à chaque fois que vous vous connectez par ssh de A à C, il peut être utile d'ajouter une entrée dans le fichier .ssh/config ressemblant à ceci (dans les versions récentes) :

Host C
   ProxyJump B

Ou comme ceci (dans les versions légèrement plus anciennes) :

Host C
   ProxyCommand ssh -W %h:%p B

En utilisant l'une ou l'autre des méthodes ci-dessus, vous pouvez simplement taper ssh C pour ouvrir la connexion. Ceci est particulièrement utile lorsque vous utilisez ssh indirectement par l'intermédiaire de l'un des nombreux outils qui utilisent ssh pour leur transport. Ces outils ne fournissent pas tous un moyen direct de passer des drapeaux de ligne de commande à la fonction ssh commandement.

4 votes

Vous pouvez également automatiser cette opération en créant ~/.ssh/config (sur A), et en ajoutant une entrée pour Host C avec l'option ProxyJump B (o ProxyCommand ssh -W %h:%p B le cas échéant). Ensuite, ssh C fera ce qu'il faut.

1 votes

@GordonDavisson C'est un bon point et particulièrement utile dans le cas où vous n'invoqueriez pas ssh directement mais plutôt indirectement par le biais d'un autre outil qui utilise ssh .

0voto

Marcel1980 Points 101

C'est plutôt facile. Il suffit d'utiliser le transfert d'agent (option -A sur ssh).

Un échantillon :

#On machine A use
ssh -A user@<machine_B>
#Then on machine B use
ssh -A user@<machine_C>

Plus besoin de copier des clés privées partout. -La machine A transmet uniquement les demandes de l'agent SSH à la première machine de la chaîne, de sorte qu'une clé privée sur la machine A peut être utilisée tant que vous ne changez pas d'utilisateur sur les machines intermédiaires.

Si vous changez d'utilisateur sur la machine B (par exemple avec un su foo vers l'utilisateur foo), le transfert d'agent ne fonctionne plus, car la prochaine connexion se fait en tant qu'utilisateur foo avec ses propres clés.

0 votes

Cela permettra à B d'utiliser toutes les clés de cet agent aussi longtemps que la connexion restera ouverte. Il existe des méthodes permettant de combiner tout cela en une seule commande invoquée sur A sans transfert d'agent, ce qui signifie qu'elles seront plus sûres et généralement plus pratiques.

0 votes

Mais seulement si quelqu'un se fait passer pour cet utilisateur sur B. Je ne savais pas pour -J, donc bon point, mais cela permet-il d'utiliser des noms d'utilisateur différents sur B et sur C ? Parfois, nous avons des serveurs avec des noms d'utilisateur différents mais des clés identiques (par exemple admin_server et admin_poi ou quelque chose de ce genre).

0 votes

Je pense que vous pouvez utiliser une syntaxe comme -J user@hostname (la machine sur laquelle je suis en ce moment a une version trop ancienne de ssh pour avoir -J donc je ne peux pas le tester pour l'instant).

0voto

Bradley Forney Points 246

Je suis tombé sur cette question en cherchant la même chose. La solution ici avec les clés ressemble à ceci :

ssh -o ProxyCommand="ssh -i /path/proxy.pem -W %h:%p user@proxy_host" -i /path/target.pem user@target_host

Je ne peux cependant pas m'attribuer le mérite de cette solution, car elle provient de une autre question mais j'ai vérifié que cette approche fonctionne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X