Qu'est-ce qu'un tunnel SSH ?

culture générale informatique devops Sep 22, 2022

Hello

Aujourd’hui, on va parler de tunnel et SSH.

Ssh, Secure Shell, est un protocole sécurisé.

Ca permet de connecter deux systèmes entre eux avec de la cryptographie.

Ca reste un des protocoles les plus sécurisés.

Les dévs s’en servent surtout pour se connecter sur des linux pour administrer leur application : apache, docker, upload de code…

Sans oublier le fameux debug en production 😬

Mais c’est aussi un protocole qui peut se superposer aux autres.

Par exemple, on peut se connecter à un dépot GIT distant via SSH : ca permet l’authentification des personnes qui veulent contribuer au dépôt.

Tu peux aussi te connecter à un serveur Mysql distant qui n’est accessible que sur ton serveur.

Ca s’appelle faire un tunnel. C’est la possibilité d’interconnecter deux machines avec SSH pour la sécurité puis d’utiliser cette connexion pour faire d’autres actions.

Entrons dans la pratique

Voici les commandes de bases

  • Se connecter sur un Linux à distance :

ssh imrane@server_distant

  • Se connecter sur un Linux à distance sur un autre port SSH :

ssh imrane@server_distant -p 2222

  • Exécuter une commande sur un Linux à distance directement :

ssh imrane@server_distant 'df -H'

  • Copier un dossier et son contenu de ta machine sur un Linux distant : (-P pour un port différent et -r pour copier un dossier)

scp -P 2322 -r /local/directory imrane@server_distant:/remote/directory

  • Copier un dossier et son contenu de la machine distante sur ta machine locale (c’est dans l’autre sens 😜) :

scp -r imrane@server_distant:/remote/directory /local/directory

  • S’authentifier sans utiliser de mot de passe sur le réseau (pour augmenter la sécurité, on utilise le mot de passe de la clé) :

    • Sur sa machine locale on génère une paire de clé

    ssh-keygen -t ed25519

    • On copie la clé sur le serveur distant (à faire pour chaque serveur distant)

    ssh-copy-id imrane@serveur_distant

    • On peut se connecter sans mettre le mot de passe du serveur

    ssh imrane@sereur_distant

    • Pense aux droits de la clé en 600

  • Pour se connecter sur un BDD distante via un tunnel

    • -N et -f pour n’autoriser que la connexion

    • On ramène le port 3306 distant

      • Sur ton poste (localhost) et sur le port 3306 aussi

    • Tu peux ensuite te connecter à ta BDD en utilisant localhost:3306

    • Ca marche pour tous les ports

ssh -N -f serveur_distant -L 3306:localhost:3306

  • Mettre un mot de passe sur ta clé privée (recommandé)

ssh-keygen -p -f ~/.ssh/id_rsa

  • Enlever le mot de passe sur ta clé privée (non recommandé)

    • Sauf que là, tu tapes aucun mot de passe (tu fais juste Entrer)

ssh-keygen -p -f ~/.ssh/id_rsa

  • Utiliser dans github ou gitlab

    • Pour t’authentifier avec ssh, il suffit de copier le clé ‘public’

cat ~/.ssh/id_rsa.pub

Il se peut que tu utilises une paire de clé ssh différente pour se connecter à GitLab par exemple (oui c’est possible d’avoir plusieurs paire de clé, c’est même recommandé en fonction des risques)

Tu peux spécifier quelle paire de clé utilisé en fonction du serveur sur lequel tu veux aller : Il suffit de modifier ton fichier ~/.ssh/config :

# GitLab.com
Host gitlab.com
PreferredAuthentications publickey
   IdentityFile ~/.ssh/gitlab_com_rsa

Bien sur, tu devras générer une clé qui s’appelle “gitlam_com_rsa“ avant (par exemple)

Quand tu fais beaucoup de connexion ssh d’affiler (avec git surtout) c’est chiant de taper son mdp de clé privé à chaque fois. Tu peux “sauver” la passphrase pour la session de travail en cours :

exec ssh-agent bash
ssh-add
# utiliser SSH autant de fois que nécessaire

 

Pour aller plus loin :

  • Il est recommandé de changer le port ssh (22 par défaut) de ton VPS pour le mettre sur un port autre (non utilisé)

    • Modifier le fichier /etc/ssh/sshd_config

    • Remplacer la ligne Port 22 par la valeur que tu souhaites

  • Tu peux aussi empêcher “root” de se connecter directement sur ton serveur. Tu vas devoir créer d’abord un autre utilisateur, lui donner les droits sudo, puis faire “su” et mieux “sudo”

    • Modifier le fichier /etc/ssh/sshd_config

    • Modifier pour avoir PermitRootLogin no

    • ATTENTION : bien créer le user non root avant sinon tu vas perdre la main sur ton serveur

  • Tu peux “confiner” (mot de saison) un utilisateur pour qu’il ne puisse voir que son dossier sans pouvoir remonter dans l’arborescence (pour ssh et sftp) :

    • Là, c’est un peu plus compliqué

    • Si ca t’intéresse, tu peux chercher de la doc avec le mot-clé “chroot”

  • Tu peux aussi configurer de la double authentification avec SSH

 

Conclusion 

On peut faire énormément de choses avec SSH, c’est très connu et donc très bien supporté sur toutes les plateformes.

Surtout, c’est très sécurisé !

Voilà :)

Hésites pas à poser des questions si il y a des zones d’ombres.

À vendredi prochain

Imrane 🏖

 

La newsletter pour ne rien louper

Rejoins les 2500 lecteurs de  la newsletter pour obtenir des conseils, des stratégies et des ressources pour développer et monétiser tes compétences Tech.