GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

SSH / SSH tunneling

SSH ? Kesaco ?

SSH (Secure SHell) est un protocole de communication sécurisé. Il établit des connexions chiffrées entre des ordinateurs. Il utilise par défaut le port 22 pour établir le lien entre les deux parties du tunnel. C'est un peu le couteau Suisse de la connexion informatique. SSH permet de se connecter, de lancer des commandes sur le site distant, de transférer des données et tout ça, de manière sécurisée.

SSH existe sous la forme d'un client (pour établir des connexions à un serveur); sous la forme d'un serveur (pour accepter les connexions des clients SSH); sous la forme d'un tunnel chiffré pour exécuter des programmes à distance à travers une machine intermédiaire, le proxy.

Installer un client SSH

Sous Linux, le client ssh devrait être installé par défaut sur les nouvelles distributions. Pour vous en assurer :

ssh -V
. Si une version s'affiche alors tout est déjà installé. Sinon
sudo apt install openssh-client

Avec Windows, depuis Windows 10 / Windows Server 2022, le client SSH existe en tant que fonctionnalité optionnelle. Pour le mettre en place, cliquez sur le Menu Démarrer > Paramètres > Applications et fonctionnalités > Fonctionnalités facultatives. Cliquez sur + Ajouter une fonctionnalité et dans la liste cherchez Client OpenSSH. Cliquez sur Installer. Pour tester faire comme sous Linux en ouvrant un terminal Powershell et en faisant

ssh -V

Connexion à un serveur SSH

Par défaut le serveur SSH écoute sur le port 22 mais vous pouvez préciser un port différent

ssh username@adresse_ip -p port

Cependant l'usage du SSH repose toujours sur le couple (identifiant, mot de passe). Ce n'est plus suffisant aujourd'hui. Il est recommandé d'utiliser un chiffrement asymétrique sur la base du couple (clé privée, clé publique) et de bloquer l'accès aux utilisateurs à fort privilège, notamment root ou l'administrateur.

Il y a deux types de clés sécurisées :

Afin de disposer d'une clé, l'utilitaire ssh-keygen sera votre meilleur allié.

ssh-keygen -t ed25519 -C "votre.email@domain.tld" -N ""
Les options généralement utilisées avec ssh-keygen : Lors de la génération de la clé, suivez les instructions pour définir le chemin d'enregistrement et un éventuel mot de passe pour la clé. ATTENTION : si vous affectez un mot de passe à la clé, il faudra le ressaisir à chaque connexion.

Maintenant que vous avez votre clé privée et votre clé publique, copiez cette dernière sur le serveur sur lequel vous souhaitez vous connecter. Pour cela, l'utilitaire ssh-copy-id fait cela pour vous.

ssh-copy-id -i ~/.ssh/id_ed25519.pub username@adresse_ip -p port
Votre clé publique sera ajoutée au fichier ~/.ssh/authorized_keys de l'utilisateur sur le serveur.

Maintenant que la connexion s'effectue sans mot de passe, vous pouvez désactiver l'authentification par mot de passe sur le serveur en mettant no à la ligne PasswordAuthentication du fichier /etc/ssh/sshd_config. Redémarrez le service pour appliquer la configuration.

Lorsque la connexion est réalisée, la première fois, les informations sont stockées dans le fichier ~/.ssh/known_hosts. Si le serveur distant a changé d'adresse, votre clé SSH ne sera plus valide et SSH considèrera que vous êtes face à une attaque Man In The Middle. Si vous êtes sûr de votre site distant, vous pouvez remplacer les informations stockées dans ~/.ssh/config afin de revalider la connexion. Le faire manuellement est faisable quand vous n'avez qu'une connexion. Lorsque vous en manipulez un grand nombre préférez utiliser ssh-keygen avec ses options de gestion des clés :

ssh-keygen -t ed25519 -f "~/.ssh/known_hosts" -R adresse_ip_a_supprimer
A la prochaine connexion les nouvelles informations seront enregistrées.

Pour simplifier les connexions SSH et ne pas avoir à se rappeler toutes les configurations de tous les serveurs, vous pouvez créer un fichier ~/.ssh/config (ou c:\users\votre_nom\.ssh\config si vous êtes sous Windows). Ce fichier est sensible à la casse et aux espaces car sa syntaxe est très stricte.

Chaque bloc doit commencer par le mot clé Host suivi de l'alias du serveur à contacter (c'est pour le retrouver dans la liste et pas le nom officiel du serveur). Les éléments de configuration sont décalés d'une indentation par rapport à mot clé Host. Si l'alias est '*' alors cela correspond à des valeurs globales qui seront affectées à toutes les connexions.


	  Host *
	  Compression yes
	  ForwardX11 no
	  ServerAliveInterval 60
	  
	  Host serveur1
	  HostName mon.beauserveur.com
	  User lgb

	  Host serveur2
	  Hostname 192.168.1.5
	  User administrateur
      
La compression accélère les connexions; ServerAliveInterval configure le serveur pour un envoi toutes les 60 secondes pour éviter la déconnexion automatique sur inactivité; ForwardX11 est désactivé pour toutes les connexions.

L'intérêt d'utiliser le fichier ~/.ssh/config est de permettre la mise en place de l'exécution automatique d'une commande à l'établissement de la connexion. Tout se passe avec la commande RemoteCommand. Par exemple, en ajoutant cette ligne dans la description d'un Host :

RemoteCommand cd /var/www && ls

Toutes les versions de SSH ne sont cependant pas compatibles avec cette directive et faites attention à ce que vous lancez comme commande car celles-ci s'exécutent dans le contexte de la session SSH et donnent accès à toutes les variables et paramètres disponibles dans cette session.

Droits sur les fichiers SSH


	  # Seul l'utilisateur doit pouvoir lire, écrire et exécuter le dossier .ssh
	  chmod 700 ~/.ssh

	  # Seul l'utilisateur doit lire et écrire les différentes clés privées
	  chmod 600 ~/.ssh/id_ed25519

	  # Les clés publiques doivent être lisibles
	  chmod 644 ~/.ssh/id_ed25519.pub
	  chmod 644 ~/.ssh/known_hosts
	  chmod 644 ~/.ssh/config
      

Configuration du serveur SSH

Depuis 1995 et la création de Secure SHell par Tatu Ylönen (Université d'Helsinki), et sa commercialisation en 1996, le protocole n'a cessé d'évoluer pour améliorer la sécurité et la performance des connexions. En 1999, OpenSSH a été créé pour être un fork opensource de la version commerciale. Mené par le projet OpenBSD, OpenSSH est maintenant disponible dans toutes les distributions Linux notamment.

sudo apt install openssh-server fail2ban
	  sudo systemctl start sshd
	  sudo systemctl enable sshd
      

Le service ssh se base sur /etc/ssh/sshd_config pour sa configuration. Cependant, comme les évolutions de OpenSSH ne peuvent pas garantir qu'il n'y aura pas de modifications dans ce fichier, préférez utiliser un fichier *.conf que vous mettrez dans le dossier /etc/ssh/sshd_config.d/. Après chaque modification des fichiers de configuration de SSH, relancez le service par

sudo systemctl reload ssh

Les éléments de durcissement immédiat à mettre en place sont

PermitRootLogin no
	  PubkeyAuthentication yes
Utilisez
sudo sshd -T
pour vérifier les paramètres de configuration de SSH.

Durcissement des connexions

Firewall

La base est de protéger le serveur SSH par un firewall. Sous Debian/Ubuntu, utilisez UFW.

Mise en place d'un tunnel SSH

Un tunnel SSH permettra d'accéder aux ressources d'un serveur distant qui pourrait être bloqué par un firewall ou simplement inaccessible depuis Internet. Par exemple, si l'on suppose que notre service est accessible sur un serveur sur le port 80. Vous voulez accéder à ce service depuis votre ordinateur local mais il y a un firewall sur votre chemin.

ssh -N -L -p 22 localhost:8888:localhost:80 root@x.y.z.t
Une fois la commande exécutée, le service distant situé à localhost:80 sera accessible depuis la machine locale à localhost:8888.

Mais l'exemple précédent est un peu verbeux et peut être fortement raccourci

ssh -L 8888:localhost:80 root@x.y.z.t

SSH Proxy Tunnel

Le principe du proxy tunneling est similaire à celui du tunnel SSH en remplaçant le firewall par un serveur sur lequel on dispose d'une connexion. Puisque nous avons accès au serveur proxy nous pouvons nous connecter à un service distant par ssh.

ssh -L 8888:remote_server:80 root@proxy_ip

Reverse SSH Tunnel

Le reverse SSH tunnel rend accessible un service local à un serveur distant de manière sécurisée.

ssh -R 8888:localhost:80 user@x.y.z.t