SSH

Nous commençons notre voyage de cybersécurité en créant une connexion sécurisée à un serveur distant à l'aide de Secure SHell (SSH).

Ce type de tunnel crypté est une norme industrielle et utilise un cryptage asymétrique.

Vous aurez donc besoin d'une paire de clés pour établir une connexion :

L'utilisateur qui veut se connecter :

  • garde sa clé privée pour lui

  • envoie sa clé publique au serveur auquel il veut accéder

L'administrateur du serveur :

  • vérifie s'il souhaite accorder l'accès à l'utilisateur

  • si oui, il installe la clé publique de l'utilisateur au bon endroit sur le serveur

Lorsque l'utilisateur tente de se connecter, il crypte un message à l'aide de sa clé privée. Si le serveur parvient à décrypter le message avec la clé publique correspondante, l'utilisateur est identifié, puisqu'il est le seul à posséder la clé privée.

Exercice

J'ai créé un compte pour chacun d'entre vous sur mon serveur :

unixshell.hetic.glassworks.tech

Vous aurez également reçu un email contenant deux pièces jointes : une clé privée et une clé publique vous permettant d'accéder à votre compte sur ce serveur.

Téléchargez ces deux pièces jointes et enregistrez-les à un endroit accessible sur votre machine locale, par exemple sur le bureau.

Ouvrez un terminal sur votre machine locale :

  • Sous MacOS, utilisez l'application Terminal.

  • Sur Windows :

    • Soit utiliser PowerShell

    • Soit installer Git pour Windows, et ouvrir l'application Git BASH

Naviguez vers le répertoire où vous avez téléchargé vos clés :

cd ~/Desktop/security

Pour établir une connexion à mon serveur alors :

ssh -i ./sshkey.pri [email protected]

Veuillez noter ce qui suit :

  • le premier paramètre -i ./sshkey.pri indique l'emplacement de votre fichier de clé privée. Si vous l'avez sauvegardé ailleurs, veuillez modifier votre commande en conséquence.

  • remplacez votre identifiant par celui spécifié dans l'email que vous avez reçu

Il se peut que l'erreur suivante s'affiche :

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for './sshkey.pri' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "./sshkey.pri": bad permissions

Vous devez sécuriser votre fichier de clé privée afin qu'il ne soit accessible qu'à vous seul :

Sur Linux ou MacOS :

chmod 600 ./sshkey.pri

Ou sur Windows :

  • Cliquez droit sur le fichier, afficher les propriétés, et naviguez dans l'onglet Sécurité, cliqué sur les paramètre Avancés

    • Désactiver l'héritage des permissions

    • Convertir les permissions hérités en permission explicites

    • Enlever le "groupe" de l'utilisateur, et d'autres utilisateurs qui ont accès

    • Seulement le propriétaire (vous) devrait avoir les droits au fichier.

  • D'autres solutions existent :

    • Utiliser une solution tierce comme Putty

    • Utiliser un shell plus orienté Linux (WSL ou Git-bash) et émettre la commande chmod 600 ...

Vous saurez si vous êtes connecté lorsque vous verrez le message :

....
Last login: Fri Apr 26 13:47:42 2024 from 185.226.32.79
identifiant@challenge-student-server:~$ 

La configuration des clés

Pour cette démonstration, j'ai crée une paire de clés au préalable :

  • Une clé privée, que je vous ai partagée (sshkey.pri)

  • Une clé publique, que j'ai collé dans le fichier ~/.ssh/authorized_keys

Exercice : Etant connecté à votre compte sur mon serveur, allez chercher le fichier ~/.ssh/authorized_keys et visionner les contenus afin de voir à quoi la clé publique ressemble.

Lorsqu'une connexion est établi par ssh, les caractères sont cryptés de mon coté en utilisant la clé privée. A la réception, les caractères sont décryptés en utilisant la clé publique. Seulement cette clé peut décrypter les caractères.

Attention : ce scénario est fabriqué pour vous aider à créer votre première connexion ssh. Dans la vraie vie, on ne partage jamais la clé privé ! La procédure réelle est la suivant :

  • Je crée une paire de clés avec la commande ssh-keygen

  • J'envoie ma clé publique (celle qui se termine par .pub) à l'administrateur du serveur auquel je veux de l'accès.

  • Si l'administrateur est d'accord de me donner accès, il me crée un utilisateur (facultatif), et il copie la clé publique dans le fichier /home/UTILISATEUR/.ssh/authorized_keys.

Je peux désormais me connecter au serveur en tant que UTILISATEUR avec tous les droits et groupes accordés à cet utilisateur là. Si l'administrateur du serveur veut retirer mon accès, il n'a juste à enlever ma clé publique du fichier /home/UTILISATEUR/.ssh/authorized_keys.

Générez votre propre paire de clés

On peut sécuriser nos comptes en utilisant une paire de clés différente à ce que je vous ai passé !

Quittons la connexion à la machine distante avec exit.

Sur votre machine locale, nous allons effectuer la commande ssh-keygen :

hetic@eabaf4e7983c:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hetic/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/hetic/.ssh/id_rsa
Your public key has been saved in /home/hetic/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:dkOqsde5rj1aZjlfZQNiYPjnX+Pg2gJez+Qmz5SfeRE hetic@eabaf4e7983c
The keys randomart image is:
+---[RSA 3072]----+
|        .o       |
|       .. .      |
|        . .o .   |
|         +... .E |
|      . S =    .+|
|       = + * o.*.|
|      o o @ Bo= o|
|       . *.*+O..+|
|        o++oB+ +.|
+----[SHA256]-----+
hetic@eabaf4e7983c:~$ ls ~/.ssh
id_rsa  id_rsa.pub  known_hosts

Ne mettez pas de mot de passe quand il vous le demande.

On voit que sur notre machine locale, nous avons maintenant une paire de clés dans le dossier ~/.ssh :

  • id_rsa : la clé privée, à protéger précieusement, et à ne jamais partager

  • id_rsa.pub : la clé publique, qu'on partage à l'administrateur du serveur distante

Vous allez ensuite reconnecter à mon serveur, et remplacer la clé dans ~/.ssh/authorized_keys par celle qu'on vient de générer.

Pour ouvrir un éditeur de texte sur Linux (instructions pour nano ici) :

nano `~/.ssh/authorized_keys

⚠️ Attention ! Si vous faites une bêtise, vous perdrez l'accès à mon serveur. La seule façon de corriger votre erreur serait de me demander de remettre en place la clé d'avant.

Quittez avec la commande exit.

Essayez de reconnecter avec :

ssh -i ./sshkey.pri [email protected]
Est-ce que cela fonctionne ? Pourquoi ?

La paire de clés ne correspond plus !! Ma clé privée qui se trouve à ./sshkey.pri ne correspond pas avec la nouvelle clé dans `~/.ssh/authorized_keys`.

Afin d'établir une connexion avec la bonne clé privée il faut plutôt utiliser :

ssh -i `~/.ssh/id_rsa` [email protected]

L'emplacement ~/.ssh est bien connu par la commande ssh comme endroit pour chercher la clé privée de l'utilisateur actuel. Donc on peut l'omettre dans la commande, et ssh saura où trouver la clé :

Accorder accès à vos camarades

Vous pouvez accorder et révoquer l'accès à votre compte, simplement en collant la clé publique d'une personne dans le fichier authorized_keys.

Donnez à votre voisin l'accès à votre compte en récupérant sa clé publique et en la collant dans votre fichier. Testez qu'il peut se connecter correctement à votre compte.

Mis à jour