Ce billet vous explique comment configurer openssh-server de votre SeedBox pour permettre d'y accéder à distance de manière beaucoup plus sécurisée.
Pour maintenir votre Seedbox, il faut pouvoir se connecter dessus et accéder aux informations de son système afin de le maintenir et de vérifier son bon fonctionnement. La solution la plus adéquate est d'utiliser SSH qui veut dire 'Secured Shell'. Pour celà il vous faut un client. Si vous êtes sur un système Linux ou un Mac, les deux systèmes disposent nativement d'un terminal sous la forme d'une application et qui permet d'exécuter la commande ssh pour se connecter à un serveur SSH. Sur un PC, vous pouvez installer le client SSH de Windows qui est conçue pour se connecter en SSH à un serveur. Sur un Mac il y a l'application Termius dont les fonctionnalités de base ne sont pas payantes.
Lorsque vous disposer d'un client SSH il faut qu'il y ait un serveur sur votre SeedBox qui permet de communiquer avec votre client. Pour celà il y a openssh-server que vous pouvez installer avec la commande...
sudo apt install openssh-server
Le contrôle d'exécution du serveur SSH se fait avec la commande
systemctl
. On peut demander par exemple le status du service avec la commande...
sudo systemctl status sshd.service
qui affichera l'état du service...
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; preset: enabled)
Active: active (running) since Mon 2024-01-22 15:20:28 CET; 1min 32s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 590 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 598 (sshd)
Tasks: 1 (limit: 4635)
Memory: 8.4M
CPU: 47ms
CGroup: /system.slice/ssh.service
└─598 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
Jan 22 15:20:28 tool systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
Jan 22 15:20:28 tool sshd[598]: Server listening on 0.0.0.0 port 22.
Jan 22 15:20:28 tool sshd[598]: Server listening on :: port 22.
Jan 22 15:20:28 tool systemd[1]: Started ssh.service - OpenBSD Secure Shell server.
Jan 22 15:20:44 tool sshd[611]: pam_env(sshd:session): deprecated reading of user environment enabled
Si le service est en cours d'exécution on peut aussi vérifier les ports de communication utilisés avec la commande...
sudo netstat -tunlp
qui affichera...
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 661/sshd: /usr/sbin
tcp6 0 0 :::22 :::* LISTEN 661/sshd: /usr/sbin
tcp6 0 0 :::21 :::* LISTEN 1664/vsftpd
udp 0 0 0.0.0.0:68 0.0.0.0:* 562/dhclient
Vous devriez constater que le service sshd écoute sur le port 22.
Dans l'affiche du status d'exécution du service sshd, il est possible que le message suivant s'affiche...
...
Jan 22 15:20:44 tool sshd[611]: pam_env(sshd:session): deprecated reading of user environment enabled
...
La lecture des variables de l'utilisateur est considérée comme très peu sécurisée de par sa conception car un processus hautement privilégié lit les fichiers contrôlés par des utilisateurs non privilégiés avec un analyseur assez complexe et non renforcé ou particulièrement bien écrit. Cela n'a d'impact que sur l'élévation des privilèges des utilisateurs qui se connectent, mais il s'agit toujours d'un problème de sécurité inutile qui doit être évité.
Pour supprimer ce message, il suffit de désactiver l'option dans le fichier PAM (Pluggable Authentication Modules) du service sshd. PAM est le système sous GNU/Linux qui permet à de nombreuses applications ou services d’authentifier les utilisateurs de manière centralisée.
Pour désactiver la fonctionnalité, il faut éditer le fichier PAM du service sshd avec la commande...
sudo nano /etc/pam.d/sshd
Il faut ensuite retrouver le paramètre user_readenv et lui associer la valeur 0, comme dans l'exemple ci-dessous.
...
session required pam_env.so user_readenv=0 envfile=/etc/default/locale
...
Une fois la modification faite, il faut ensuite redémarrer le service et le tour est joué.
Si le service est en cours d'exécution on peut aussi vérifier les ports d'écoute qu'il utilise avec la commande...
sudo netstat -tunlp
qui affichera...
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 661/sshd: /usr/sbin
tcp6 0 0 :::22 :::* LISTEN 661/sshd: /usr/sbin
udp 0 0 0.0.0.0:68 0.0.0.0:* 562/dhclient
Vous devriez constater que le service sshd écoute sur le port 22.
Un nombre importants de port de communication sont réservés par défaut afin que les applications qui sont en cours d'éxécution puisse recevoir les commandes qu'on leur demande d'exécuter sur leur port dédié par défaut. Par exemple, pour SSH c'est le 22, pour FTP c'est le 21, etc...
Vous pouvez consulter le page des ports utilisés par défaut ici. Mais les port entre 10000 et 20000 ne sont pas réservés et peuvent donc être utilisés.
Tous les pirates connaissent ssh et savent que le port d'écoute par défaut est 22. Une première protection consiste à changer ce port d'écoute.
Pour modifier le port par défaut il faut éditer son fichier de configuration avec la commande...
sudo nano /etc/ssh/sshd_config
Puis retrouver ou créer le paramètre Port de définition du port d'écoute et lui donner la valeur que vous souhaitez, par exemple...
...
Port 12322
...
Une fois la modification faite, il faut redémarrer le service et le tour est joué.
Vous pouvez alors contrôler que votre modification a bien été prise en compte en réaffichant les ports d'écoute des service avec la commande...
sudo netstat -tunlp
qui affichera...
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:12322 0.0.0.0:* LISTEN 661/sshd: /usr/sbin
tcp6 0 0 :::12322 :::* LISTEN 661/sshd: /usr/sbin
udp 0 0 0.0.0.0:68 0.0.0.0:* 562/dhclient
Pour vous connecter à votre serveur ssh il faudra maintenant préciser le port de communication utilisé comme dans l'exemple suivant...
ssh me@tools.local -p 12322
Si le service est en cours d'exécution on peut aussi vérifier les ports d'écoute qu'il utilise avec la commande...
sudo netstat -tunlp
qui affichera...
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:12322 0.0.0.0:* LISTEN 661/sshd: /usr/sbin
tcp6 0 0 :::12322 :::* LISTEN 661/sshd: /usr/sbin
udp 0 0 0.0.0.0:68 0.0.0.0:* 562/dhclient
La colonne Protoindique les protocoles qu'utilisent le service. tcp indique qu'il s'agit du protocole TCP/IP V4 et tcp6du protocole TCP/IP V6. Bien souvent l'utilisation du prootcole TCP/IP V4 est suffisant. Pour supprimer l'écoute sur des adresses TCP/IP V6, il faut éditer le fichier de configuration du service avec la commande...
sudo nano /etc/ssh/sshd_config
Puis décommenter le paramètre ListenAddress 0.0.0.0
...
ListenAddress 0.0.0.0
...
Une fois la modification faite, il faut redémarrer le service et le tour est joué.
Vous pouvez alors contrôler que votre modification a bien été prise en compte en réaffichant les ports d'écoute des service avec la commande...
sudo netstat -tunlp
qui affichera...
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:12322 0.0.0.0:* LISTEN 661/sshd: /usr/sbin
udp 0 0 0.0.0.0:68 0.0.0.0:* 562/dhclient
Pour se connecter avec ssh, vous devez fournir par défaut un compte utilsiateur et un mot de passe. On peut remplacer l'en voi de son mot de passe par l'utilisation d'une clé de cryptage publique mais personnelle qui est une solution beaucoup plus sécurisée. Le cryptage par clé publique utilise un processus non réversible d'encryption qui nécessite une clé privée pour le décryptage. La clé de cryptage réside sur le poste que l'on utilise pour se connecter et n'est jamais transmise.
Les exemple présentés ci-dessous ont été réalisés avec mon Mac. Mais c'est le même processus si vous être sur un système Linux.
Il faut tout d'abord savoir si vous avez déjà une clé d'authnetification pour ssh avec la commande...
ls -al ~/.ssh
Si dans le résultat affiché il y a ...
-r-------- 1 myuser staff 2622 14 mar 2023 id_rsa
-rw-r--r-- 1 myuser staff 581 14 mar 2023 id_rsa.pub
... c'est que vous disposez déjà d'une clé ssh et par conséqunet vous pouvez passer directement à l'étape de publication de votre clé publique vers la SeedBox.
Sinon, il faut générer la commande avec la commande...
ssh-keygen
qui va générer une pair de clé comme suit...
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/myuser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/myuser/.ssh/id_rsa
Your public key has been saved in /Users/myuser/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:8og/X2hwUxOIx5asWYu0+nicRPUYCj5oEJMhzPN3g3g myuser@mycomputer.local
The key's randomart image is:
+---[RSA 3072]----+
|B+ + o. |
|+= . o @ . |
|o.=o o @ =o |
|Eoo+o B o... |
| .. .+o S |
| ...* o |
| .=..+ . |
| ..*. . |
| ..o. |
+----[SHA256]-----+
Une fois la pair de clés générés, on publie la clé sur le serveur distant avec la commande...
ssh-copy-id -p 12322 rmuser@rmhost.local
Dans cet exemple la commande lancera une connexion sur le server rmhost.local avec l'utilisateur rmuser. Lors de l'exécution de la commande, il vous sera demandé de confirmer la connexion ainsi que le mot de passe de l'utilisateur qui se connecte.
Le résultat suivant s'affichera...
ssh-copy-id -p 10022 rmuser@rmhost.local
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/fxlevy/.ssh/id_rsa.pub"
The authenticity of host '[rmhost.local]:10022 ([10.211.55.83]:10022)' can't be established.
ED25519 key fingerprint is SHA256:iWYzYquTCzmsTA10gneeMTp9VeUiLqkROVgDWadJq2k.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
rmuser@rmhost.local's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p 10022 'rmuser@rmhost.local'"
and check to make sure that only the key(s) you wanted were added.
Tout d'abord il faut éditer le fichier de configuration de ssh avec la commande...
sudo nano /etc/ssh/sshd_config
Il faut ensuite retrouver la ligne ...
Include /etc/ssh/sshd_config.d/*.conf
Si la ligne est commenté ilm faut retirer la décommenté et si elle n'existe pas il faut la créer.
Une fois l'ajout d'extension de configuration possible on édite un nouveau de fichier de configuration avec la commande ...
udo nano /etc/ssh/sshd_config.d/disable_root_login.conf
Que le fichier existe ou qu'il n'existe pas il faut que les paramètres suivants soit présents avec les bonnes valeurs associées...
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
PermitRootLogin no