SCP via une connexion de passerelle SSH

8

La configuration de mon réseau ressemble à ceci:

Désormais, Alice a accès à la passerelle SSH (uniquement la passerelle à partir de maintenant) avec:

ssh [email protected]

et le fichier de clés autorisé sur la passerelle ressemble à ceci

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

donc quand Alice essaie de se connecter à la passerelle avec sa clé privée, elle se connecte en fait au serveur Web (le PC de la passerelle peut établir une connexion au serveur Web avec une clé privée sans mot de passe, afin que cela reste transparent).

La question

  1. Comment puis-je configurer cela pour qu'Alice puisse également scp les choses sur le serveur Web?

  2. Je sais que cela établit une connexion séparée, mais existe-t-il un moyen pour que cela fonctionne comme un ssh normal afin que même quelque chose comme ça -R12345:localhost:22fonctionne?

zidarsk8
la source

Réponses:

10

Si vous souhaitez accéder à un serveur ssh derrière un autre serveur ssh, utilisez simplement "ProxyCommand". Exemple: ajouter à .ssh / config

Host Alice  
   User myLoginAtAlice # optional 
   ProxyCommand ssh -o Compression=no gateway netcat -w 90 %h %p
   ServerAliveInterval 30
   Compression yes

Host gateway
   HostName gateway.public.ip
   User myLoginAtTheGateway # optional 
   Compression yes

Ensuite, vous pouvez simplement "ssh Alice" ou "rsync" ou "scp" directement en utilisant "Alice" comme nom d'hôte. La magie est cachée au client.

Cela vous permet de reconfigurer rapidement votre ssh au cas où votre topologie / configuration de réseau changerait, et de changer simplement le .ssh / config, au lieu de changer chaque script.

Explication: ssh utilise la commande donnée comme "commande proxy" comme transport au lieu d'une connexion TCP directe. Netcat est un outil réseau qui (parmi des millions d'autres fonctionnalités) redirige simplement son stdin / stdout vers l'hôte distant spécifié. Ainsi, "ssh gateway nc sshserver 22" vous connecte au serveur ssh de cette machine. % h est le nom d'hôte et% p est le port. Une telle configuration vous permet de spécifier "Port N" pour changer le port sans changer la ligne ProxyCommand.

J'active la compression sur l'ordinateur final et désactive la compression externe car la compression de données chiffrées ou compressées ne réduit pas davantage le volume de données. Tout bidouiller avec les paramètres de compression est également bien sûr facultatif.

Raúl Salinas-Monteagudo
la source
Une autre question, rysnc ne fonctionne pas comme ça si j'ai un port personnalisé vers la machine passerelle. Des réflexions à ce sujet.
zidarsk8
Ajoutez "Port numéro_port" à la section appropriée du fichier .ssh / config. Veuillez lire les pages de manuel ssh_config et sshd_config. Ce sont de nombreuses informations et elles pourraient vous apporter beaucoup d'inspiration.
Raúl Salinas-Monteagudo
Je voulais dire, rsync ne fonctionne pas si un port différent est spécifié. J'ai configuré le port pour que la connexion fonctionne normalement, mais rsync me pose des problèmes.
zidarsk8
3

J'ai eu exactement le même problème que celui-ci mais je l'ai fait fonctionner sans tout changer radicalement.

Tout ce que j'ai fait a été d'ajouter $ SSH_ORIGINAL_COMMAND à la passerelle authorized_keys pour passer à travers tout le long de la chaîne jusqu'au serveur final.

Donc ça:

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

Devient:

#/home/Alice/.ssh/authorized_keys
command="ssh -q -t alice@web $SSH_ORIGINAL_COMMAND" ssh-rsa ABCD...E== alice@somehost

Le -q est utilisé pour supprimer le message de connexion fermée de la machine du point final afin qu'il ne se retrouve pas dans la sortie locale si vous utilisez la redirection localement.

Vous pouvez ensuite utiliser scp comme ceci:

scp localFileName [email protected]:/path/on/end/point/remoteFileName

Cela a l'avantage supplémentaire de permettre aux utilisateurs de passer des commandes via le serveur d'extrémité et d'obtenir le résultat dans leur session locale afin qu'ils puissent les rediriger dans un fichier ou les rediriger vers un programme différent.

Par exemple:

ssh -t [email protected] "ls -l" > tmp

Cela fonctionne car il semble que sshd remplisse la variable d'environnement $ SSH_ORIGINAL_COMMAND avec la commande spécifiée par le client ssh mais je ne sais pas pourquoi cela permet miraculeusement à scp de passer à la machine d'extrémité ainsi qu'aux commandes.

Ash Vince
la source
0

Malheureusement, la redirection de port n'aiderait pas à copier des fichiers directement du poste de travail d'Alice vers le serveur Web à l'aide scp. Dans cet article SO, j'ai expliqué pourquoi ssh (et scp car il utilise les mêmes mécanismes d'authentification) ne fonctionnera pas pour les connexions transmises par port à l'aide de ssh.

L'option serait de configurer un serveur VPN sur une machine faisant maintenant office de passerelle SSH, de vous y connecter, puis d'accéder directement à n'importe quelle machine derrière le pare-feu.

Serge
la source