SSH est sûrement le protocole sécurisé le plus utilisé après https. En effet il permet en autre de se connecter au shell d’une machine distante de manière sécurisée très facilement. Mais pas uniquement.
Contents
Historique
Le SSH (Secure Shell) est née une nuit de pleine lune, déjà ça s’annonçait bien pour lui … 😃
Blagues à part si c’est l’historique de SSH qui vous intéresse voici la page wikipedia
Ici Je vais plutôt aborder des aspects pratique de ce protocole.
L’usage basique
L’installation
Si comme moi vous utilisez Linux Debian ou une distribution dérivée (Ubuntu, Mint, …) il suffit d’installer le paquet openssh-client
sudo apt install openssh-client
Bien entendu la machine sur laquelle vous voulez vous connecter doit avoir un serveur SSH installé et lancé
sudo apt install openssh-server
Afin de vérifier que le serveur tourne correctement il faut lancer la commande
sudo systemctl status sshd
Une réponse de ce type devrait apparaître
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-04-16 08:50:13 CEST; 7h ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 743 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 782 (sshd)
Tasks: 1 (limit: 19033)
Memory: 3.3M
CPU: 15ms
CGroup: /system.slice/ssh.service
└─782 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
avril 16 08:50:13 PC-Olivier systemd[1]: Starting OpenBSD Secure Shell server...
avril 16 08:50:13 PC-Olivier sshd[782]: Server listening on 0.0.0.0 port 22.
avril 16 08:50:13 PC-Olivier sshd[782]: Server listening on :: port 22.
avril 16 08:50:13 PC-Olivier systemd[1]: Started OpenBSD Secure Shell server.
On voit bien l’état du service : Active: active (running)
Connexion avec SSH
Afin de se connecter au shell d’une autre machine il faut quelques pré requis :
- Savoir avec quel utilisateur on veut se connecter
- Connaître l’IP de la machine distante
- Que le port 22 soit ouvert (ce qui est en général le cas)
La commande se compose comme suit
ssh <utilisateur>@<IP_machine>
par exemple un test consiste à se connecter avec son propre utilisateur sur la boucle réseau locale (127.0.0.1), ce qui donne dans mon cas
Pour savoir si on est dans une connexion SSH il faut entrer la commande
echo $SSH_CONNECTION
Dans le cas ci-dessus ça doit renvoyer quelque chose comme
127.0.0.1 44106 127.0.0.1 22
Si on est pas dans une connexion SSH cette commande ne renvoi rien.
Envoyer une (ou plusieurs) commande sans se connecter
Parfois on peut avoir envie d’envoyer une commande à un serveur sans forcément vouloir s’y connecter. Et bien c’est très simple, il suffit de mentionner cette commande entre guillemets à la suite de la commande de connexion
ssh <utilisateur>@<IP_machine> 'ls -l'
Et si on veut envoyer plusieurs commandes (soyons fou), on a simplement à les séparer par des points virgules.
Déconnexion
Pour sortir de la connexion SSH il suffit de faire la combinaison CTRL+D ou bien entrer la commande.
exit
Fonctionnalités
SCP
Par défaut SSH dispose d’un système de copie de fichiers, ça s’utilise assez instinctivement
scp root@10.10.0.5:/home/wam_laba/super_file /home/wam_ici/
Dans l’exemple on a copié le fichier /home/wam_laba/super_file du serveur 10.10.0.5 dans le répertoire local /home/wam_ici/
Pour copier des dossiers il faut utiliser l’argument -r (pour récursive)
scp -r root@10.10.0.5:/home/wam_laba/super_folder .
Dans cet exemple on copie tout le dossier super_folder dans le répertoire courant
SFTP
Qui est en gros du FTP (File Transfer Protocol) sur SSH.
C’est utilisé pour que les communications soient chiffrées c’est chaudement recommandé si quand on veut mettre en place un serveur accessible par internet. La mise en œuvre d’un serveur SFTP étant plutôt longue elle sera développée dans un autre article.
Attention à ne pas confondre SFTP et FTPS (qui est un autre protocole)
Ouvrir une fenêtre graphique distante
Il est aussi possible d’ouvrir une application graphique distante avec SSH il suffit de se connecter avec l’argument -X
ssh root@10.10.123.5 -X
À présent on peut ouvrir une fenêtre à partir de cette connexion, en lançant sa commande.
Outils
Autossh pour limiter les déconnexions
Parfois la connexion est instable pour de nombreuses raisons et il arrive de perdre la liaison SSH du coup on se prend des messages genre « broken pipe ». Cela peut vite devenir casse pied lorsqu’on travaille toute la journée connecté à des serveurs. Une solution pour minimiser ce problème est d’utiliser autossh
sudo apt install autossh
Autossh va automatiquement reconnecter une liaison perdue, de plus il va de temps en interroger la connexion afin d’éviter que le serveur SSH ne nous claque pas la porte au nez pour cause d’un timeout (inactivité).
autossh s’utilise simplement comme ssh.
autossh <utilisateur>@<IP_machine>
Mot de passe automatique avec sshpass
À chaque connexion SSH demande un mot de passe pour s’authentifier, cela devient vite casse pied si on se connecte des dizaines de fois par jour, il existe plusieurs solutions.
Les plus connues sont le partage de clé et sshpass. Ici on va s’intéresser à la deuxième solution.
Déjà il faut l’installer
sudo apt install sshpass
Ensuite on peut simplement l’utiliser avec le mot de passe en clair
sshpass -p <mot de passe> ssh <utilisateur>@<IP_machine>
Toutefois il vaut mieux éviter cette méthode qui laisse visible le mot de passe dans la console et encore pire dans le fichier ~/.bash_history.
Du coup on va faire les choses un peu mieux en mettant de mot de passe dans un fichier dans le répertoire ~/.ssh/ puis on va faire sorte que personne d’autre que l’utilisateur puisse lire le contenu de ce fichier.
touch ~/.ssh/pwd_file
echo "mot de passe" > ~/.ssh/pwd_file
chmod 600 ~/.ssh/pwd_file
Dans un environnement professionnel il vaut mieux à supprimer la ligne qui contient le mot de passe de l’historique (c’est plus prudent) ou alors écrire le mot de passe dans le fichier avec un éditeur de texte comme vim ou nano.
Maintenant pour la lancer la commande on fait
sshpass -f ~/.ssh/pwd_file ssh <utilisateur>@<IP_machine>
Bien entendu si on change ssh par autossh comme vu plus haut ça marche aussi 😉
Un système de fichier distant avec SSHFS
Il est aussi possible de monter en local un système de fichiers distant, ça ce nomme SSHFS pour SSH File System.
Comme d’habitude il faut l’installer, attention il doit être présent sur le serveur et le client.
sudo apt install sshfs
ensuite pour monter un local un répertoire
sshfs <utilisateur>@<IP_machine>:<répertoire_distant> <répertoire_local>
Le répertoire local doit exister, celui distant aussi bien entendu 😃
Maintenant dans le répertoire local /home/olivier/mnt/tmp on a accès au répertoire du serveur distant /home/olivier
Pour visualiser les points de montage on dispose de la commande
mount
Qui doit afficher le montage de fichier qu’on vient de faire avec brio.
Pour démonter on utilise
sudo umount <montage_local>
Ici dans notre exemple ça donnerais
sudo umount /home/olivier/mnt/tmp
Astuces
Désactiver la connexion avec root
Pour raisons de sécurité il est bon de désactiver la possibilité de se connecter a SSH directement via l’utilisateur root. Ceci pour une simple raison : tous les systèmes Linux ont un utilisateur root donc l’attaquant possède une information importante dès le début.
Pour désactiver la possibilité de se connecter directement avec root il faut éditer le fichier /etc/ssh/sshd_conf et modifier la ligne comme ci dessous
PermitRootLogin no
Puis relancer le démon SSH
sudo systemctl restart sshd
Faire un proxy socks5
Il arrive des situations dans lesquelles on a pas accès à un site à cause d’un filtre d’URL (souvent dans les entreprises qui veulent empêcher Germaine de la compta à passer sa journée sur Facebook). Mais en tant d’informaticien il nous est capital d’aller sur le site bloqué, en sachant que si on fait la demande au SI on en a pour 2 à 3 mois …
Il faut donc prendre les devants, et utiliser son serveur afin de détourner cette odieuse restriction de liberté.
Le principe est simple on va ouvrir une connexion SSH sur un port quelconque (il faut que ce port soit ouvert et > 1024 bien entendu) entre notre client et le serveur, puis on va dire au navigateur d’utiliser cette connexion.
ssh -D 9999 <utilisateur>@<serveur> -N
Ici on a ouvert une connexion vers notre serveur avec le port 9999 l’argument -N permet en gros de garder le tunnel ouvert pour que le trafic réseau puisse y passer.
Ensuite il faut paramétrer le navigateur, avec Firefox (le meilleur navigateur de tous les temps :-D) il faut aller dans les paramètres puis tout en bas de la section général, paramètres réseaux
Et entrer les informations du proxy socks5
Maintenant avec cette instance de Firefox on peut naviguer tranquille sans restriction d’URL
Attention sur le serveur la redirection d’IP doit être activée, pour vérifier ça on fait
cat /proc/sys/net/ipv4/ip_forward
Le résultat doit être 1, sinon il faut entrer la commande (en utilisateur root)
echo 1 > /proc/sys/net/ipv4/ip_forward
Bannir les pirates en herbe avec fail2ban
Fail2ban est un petit logiciel qui va bannir les adresses IP qui vont tenter de se connecter à votre serveur et échouer, c’est à dire qui vont entrer le mauvais utilisateur ou mot de passe. Par défaut si quelqu’un se plante 5 fois en moins de 10 minutes il est banni pendant 10 minutes.
sudo apt install fail2ban
Faîtes gaffe à ne pas oublier votre nom d’utilisateur et son mot de passe sinon ça risque d’être chia… (je dis ça en connaissance de cause 😓)
0 commentaires
Trackbacks/Pingbacks