2 points par baeba 3 시간 전 | Aucun commentaire pour le moment. | Partager sur WhatsApp

Résumé

  • Un tunnel SSH permet soit d’accéder en toute sécurité à un service qui n’est pas directement accessible depuis l’extérieur, soit d’exposer temporairement un service interne vers l’extérieur.
  • La redirection de ports SSH se divise principalement en redirection locale, redirection distante, redirection locale dynamique et redirection distante dynamique.
  • -L ouvre un port sur le client SSH local, tandis que -R ouvre un port sur le serveur SSH distant.
  • Avec un Bastion Host, il est possible d’atteindre non seulement le serveur SSH lui-même, mais aussi d’autres services d’un réseau privé auxquels ce serveur a accès.
  • La redirection dynamique ne fixe pas une destination précise : elle crée un proxy SOCKS permettant d’accéder à plusieurs hôtes et ports.
  • Pour exposer une redirection distante au réseau externe, il faut vérifier le paramètre GatewayPorts du serveur SSH.

Introduction

Objectif des tunnels SSH

  • SSH ne sert pas seulement à exécuter des commandes à distance : il fournit aussi une fonction de tunnel qui transporte le trafic réseau de manière chiffrée.

  • Sans VPN séparé ni programme proxy dédié, il est possible d’accéder à un réseau privé et d’exposer des services avec la seule commande SSH standard.

  • Voici quelques cas d’usage représentatifs.

    • Accéder à un service interne d’un VPC en passant par un serveur public
    • Ouvrir dans le navigateur du PC utilisateur un port local d’un serveur de développement distant
    • Exposer temporairement vers l’extérieur un service domestique ou situé sur un réseau privé
    • Connecter le port de débogage du navigateur local à un agent de développement distant
  • Pour bien comprendre un tunnel SSH, il faut distinguer les deux points suivants.

    • Quel équipement ouvre un nouveau port et se met en écoute
    • Depuis quel équipement le trafic qui traverse le tunnel atteint effectivement sa destination

Développement

La redirection locale connecte un service distant en local

  • La redirection de port locale consiste à relier à un port local du PC utilisateur un serveur distant, ou un service auquel ce serveur distant peut accéder.
  • La structure de commande de base est la suivante.
ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr  
  • Le client SSH attend les connexions sur local_port du PC utilisateur.

  • Le trafic entrant sur ce port est transmis via le tunnel SSH vers remote_addr:remote_port.

  • La connexion à la destination finale s’effectue du point de vue du réseau où se trouve le serveur SSH.

  • Les principaux cas d’usage sont les suivants.

    • Connexion à MySQL, PostgreSQL ou Redis distants
    • Accès à une application web ouverte uniquement sur un réseau privé
    • Accès à un port de conteneur non exposé sur l’interface externe du serveur

Un Bastion Host sert de relais vers un réseau privé

  • remote_addr et sshd_addr, qui est la cible de la connexion SSH, n’ont pas besoin d’être la même machine.

  • Si le serveur SSH peut accéder à d’autres services internes, il peut être utilisé comme point de relais.

  • Ce type de serveur intermédiaire est appelé Bastion Host ou Jump Host.

  • Une architecture de connexion courante est la suivante.

    • Connexion SSH depuis le PC utilisateur vers un Bastion Host public
    • Transmission du trafic vers un service interne au VPC accessible depuis le Bastion Host
  • Cela permet d’accéder à des bases de données, des clusters de recherche ou des API internes qui ne sont pas exposés vers l’extérieur.

La redirection distante expose un service local à distance

  • La redirection de port distante consiste à relier un service du PC utilisateur ou d’un réseau interne à un port du serveur SSH externe.
  • La structure de commande de base est la suivante.
ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr  
  • Le serveur SSH distant ouvre remote_port et attend les connexions.

  • Le trafic entrant sur ce port est transmis via le tunnel SSH vers local_addr:local_port côté client SSH.

  • Les principaux cas d’usage sont les suivants.

    • Exposer un serveur de développement lancé sur un ordinateur portable pour une démonstration externe
    • Rendre accessible depuis Internet un service de homelab
    • Fournir à un environnement de développement distant le port de débogage du navigateur local

Une exposition externe nécessite le paramètre GatewayPorts

  • Par défaut, un port de redirection distante peut n’être lié qu’au localhost du serveur SSH.
  • Dans ce cas, le service est accessible depuis le serveur distant lui-même, mais pas depuis l’extérieur.
  • Pour permettre l’accès via l’IP publique du serveur distant, il faut vérifier le paramètre suivant dans sshd_config.
GatewayPorts yes  
  • Comme ce paramètre peut exposer le port sur une interface externe, il faut l’accompagner de règles de pare-feu et de contrôle d’accès.
  • Exposer directement un service de développement sur l’Internet public peut accroître le risque d’accès non authentifié ou d’attaque.

La machine locale peut devenir le Jump Host d’un réseau privé

  • La destination d’une redirection distante n’est pas limitée à la machine elle-même qui exécute le client SSH.

  • Si le PC utilisateur peut accéder à un autre serveur du réseau domestique, le port de ce serveur interne peut aussi être exposé via le serveur SSH distant.

  • Dans ce cas, le PC utilisateur devient un équipement relais entre les deux réseaux suivants.

    • Le réseau domestique ou le réseau privé de développement
    • Le serveur de passerelle SSH public
  • Cela permet d’accéder depuis l’extérieur à des services hébergés sur un serveur domestique ou un serveur de développement interne qui ne sont pas connectés directement à Internet.

La redirection locale dynamique crée un proxy SOCKS local

  • Une redirection locale classique associe un port local à une seule destination fixe.
  • La redirection locale dynamique crée un proxy SOCKS sur le client SSH.
  • La structure de commande de base est la suivante.
ssh -D [local_addr:]local_port [user@]sshd_addr  
  • Un proxy SOCKS s’exécute sur le port spécifié du PC utilisateur.

  • Les applications compatibles SOCKS peuvent indiquer à chaque connexion une adresse et un port de destination différents.

  • La connexion vers la destination réelle s’effectue du point de vue du réseau du serveur SSH distant.

  • La différence avec une redirection locale fixe est qu’une seule connexion SSH permet d’accéder à plusieurs services d’un réseau privé distant.

  • Les principaux cas d’usage sont les suivants.

    • Appeler plusieurs API internes via un Bastion Host
    • Explorer des applications web au sein d’un réseau privé
    • Accéder à plusieurs endpoints de VPC via une seule instance EC2

La redirection distante dynamique crée un proxy SOCKS distant

  • En omettant la destination fixe dans l’option -R, il est possible de créer un proxy SOCKS sur le serveur SSH distant.
  • La structure de commande de base est la suivante.
ssh -R [bind_address:]port [user@]gateway_addr  
  • Le serveur de passerelle distant attend les connexions SOCKS sur le port spécifié.
  • Les requêtes entrées dans ce proxy sont transmises au client via le tunnel SSH.
  • La destination finale est atteinte du point de vue du réseau où se trouve le client SSH.
  • Cela permet à un serveur distant d’accéder à l’ensemble du réseau domestique ou privé auquel le PC utilisateur a accès.
  • La redirection distante dynamique nécessite OpenSSH 7.6 ou une version ultérieure côté client.
  • Pour exposer ce proxy SOCKS distant sur une interface externe, le paramètre GatewayPorts est nécessaire, comme pour une redirection distante classique.

Les options d’exécution en arrière-plan conservent uniquement le tunnel

  • Pour maintenir uniquement la redirection de ports après la connexion SSH, sans exécuter de commande, utilisez l’option -N.
  • Pour envoyer le tunnel en arrière-plan, l’option -f peut être utilisée en complément.
  • Exemples selon le type.
ssh -f -N -L ...  
ssh -f -N -R ...  
ssh -f -N -D ...  
  • En environnement automatisé ou de longue durée, il faut aussi prévoir une stratégie de fermeture du tunnel, de reconnexion et de détection des pannes.

On distingue les commandes par l’endroit où le port est ouvert

  • ssh -L ouvre un nouveau port sur le client SSH local.
  • ssh -R ouvre un nouveau port sur le serveur SSH distant.
  • ssh -D crée un proxy SOCKS sur le client SSH local.
  • ssh -R sans destination crée un proxy SOCKS sur le serveur SSH distant.
  • Voici la règle de base à retenir.
-L = local:remote  
-R = remote:local  
  • L’adresse et le port à gauche des deux-points correspondent au point d’écoute nouvellement ouvert.
  • local peut désigner le client SSH lui-même ou une machine interne accessible depuis ce client.
  • remote peut désigner le serveur SSH lui-même ou une autre machine interne accessible depuis ce serveur.

Conclusion

Le choix d’un tunnel SSH dépend du sens d’accès

  • Pour utiliser un service distant depuis votre PC, utilisez la redirection locale -L.

  • Pour exposer votre PC ou un service interne du côté d’un serveur distant, utilisez la redirection distante -R.

  • Pour accéder de manière flexible à plusieurs destinations d’un réseau distant, utilisez la redirection locale dynamique -D.

  • Pour permettre à une passerelle distante d’accéder de manière flexible à tout le réseau côté client, utilisez la redirection distante dynamique -R sans destination.

  • Lors de la conception d’un tunnel SSH, il faut d’abord vérifier les points suivants.

    • L’emplacement où un nouveau port doit être ouvert
    • La machine capable d’atteindre la destination finale
    • Les paramètres GatewayPorts, le pare-feu et les droits d’accès SSH
    • Les risques de sécurité potentiels liés à une exposition externe
  • Le critère de décision essentiel est de savoir de quel côté le service doit être visible et quelle machine peut réellement atteindre la destination.

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.