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.
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
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 :
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.
# 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
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.
La base est de protéger le serveur SSH par un firewall. Sous Debian/Ubuntu, utilisez UFW.
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
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
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
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