Cryptographie appliquée

Hachage - Cryptographie asymétrique

1. Introduction

L'objectif de ce TP est de prendre en main concrêtement deux concepts de cryptographie que vous avez vu dans le cours de premier semestre (côté mathématiques) : les fonctions de hachages et le chiffrement asymétrique (dit à clés publiques).

Il s'agit à la fois de comprendre l'intérêt de ces deux concepts mais aussi et surtout de manipuler les commandes Unix qui les utilisent. Vous découvrirez et manipulerez également que quelques autres commandes Unix communes.

Lors de ce TP vous allez devoir travailler en ligne de commande notamment sur une machine virtuelle. Il est important de bien faire les étapes de préparation de votre environnement de travail en début de séance et le nettoyage de celui-ci en fin de séance.

2. Préparation de l'environnement de travail

  1. Ouvrez un terminal.
  2. Créez un dossier temporaire dans /tmp/, que vous nommerez /tmp/crypto, et déplacez vous dans celui-ci.

    L'intégralité du TP devrait être fait dans ce dossier !

Comme c'est l'habitude sous Unix, dans ce sujet les pages du manuel sont identifiées par leur nom suffixé par leur section entre parenthèse. On rappel que pour y accéder il suffit d'appeller la commande man en lui spécifiant en paramètre la section puis le nom de la page.

Par exemple pour accéder à la page intro(1) il suffit d'appeler la commande suivante :

man 1 intro

Les pages du manuel Unix sont souvent accessibles sur le web. Les pages web que vous trouveriez sur le web ne correspondant pas forcément à celles utilisées sur vos machines (distribution ou version différente), il est décommandé d'aller lire les pages du manuel ailleurs que sur un terminal de la machine sur laquelle vous travaillez.

Vous trouverez cependant dans ce sujet des liens web vers les versions des pages du manuel correspondant à Debian Bookworm (12) comme, par exemple, dans intro(1).

Faites attention les machines de TP sont, elles, encore en version Debian Bullseye (11).

3. Somme de contrôle

Une des utilisations les plus fréquentes des fonctions de hachages sous Unix est de construire des sommes de contrôle pour vérifier le bon téléchargement de gros fichiers.

Une somme de contrôle est ici le résultat d'une fonction de hachage calculée sur le contenu binaire d'un fichier.

Lorsque l'on télécharge un fichier en ligne, par exemple via HTTPS, il se peut que le fichier reçu ne soit pas correctement récupéré. Les raisons peuvent être nombreuses : mauvaise qualité de la connexion réseau, manque de place localement, modification du fichier par un des intermédiaires, etc.

L'idée, pour les services mettant à disposition des fichiers de taille importante (les distributeurs Linux par exemple), est de mettre également à disposition la somme de contrôle de ces fichiers. Lors d'un téléchargement il est alors simple de vérifier l'intégrité du fichier récupéré en recalculant la somme de contrôle de celui-ci et en la comparant à celle mise à disposition. Si les sommes sont équivalentes alors on a l'assurance que le fichier récupéré est dans le même état que celui qui était mis à disposition sinon il est corrompu.

Récupération de fichier

La commande wget permet de récupérer des fichiers via HTTPS.

  1. En étudiant la page wget(1) déterminez la ligne de commande permettant de récupérer le fichier vidéo iut-ibm360titre-ok.mkv qui est disponible à l'URL http://localhost/~bruno.beaufils/crypto/iut-ibm360titre-ok.mkv.
  2. Récupérez ce fichier dans votre dossier de travail et regardez le, par exemple via la commande ffplay(1).

Vérification de l'intégrité du fichier

  1. Après avoir étudié la page md5sum(1) déterminez la ligne de commande permettant de calculer la somme de contrôle via l'algorithme MD5 de ce fichier, puis exécutez là.
  2. La somme de contrôle du fichier original est 37877daf00759a346f7cac1187162fd0.

    Vérifiez que la somme que vous avez calculée et la somme originale sont bien identiques.

Compromission du fichier

  1. Modifiez quelques octets du début de votre fichier via la commande hexedit et enregistrez ces modifications. En cas de nécessité la lecture de la page hexedit(1) pourra vous rafraîchir la mémoire.
  2. Vérifiez que le fichier n'est plus utilisable, toujours via ffplay par exemple.
  3. Recalculez la somme de contrôle de votre fichier via md5sum et observez qu'elle est bien différente de la somme orginale.

Vérification automatique

L'algorithme MD5 est désormais connu pour être à la merci de collisions. Il est de ce fait de moins en moins utilisé pour le calcul des sommes de contrôles. Il est souvent remplacé par des sommes de contrôles calculées via des algorithmes de hachage cryptographique de type SHA.

On trouve dans le dossier disponibles à l'URL http://localhost/~bruno.beaufils/crypto plusieurs fichiers.

  1. Téléchargez dans votre dossier de travail, les fichiers suivants :
    • iut-ibm360titre-ko.mkv
    • iut-ibm360titre-ok.mkv
    • mini.iso
  2. Après avoir étudié les pages shasum(1) et sha256sum(1) et observé les autres fichiers disponibles dans le dossier, déterminez les commandes à exécuter pour vérifier automatiquement l'intégrité des 2 fichiers téléchargés à l'étape précédente.
  3. Exécutez ces commandes et vérifiez que 2 ont été correctement téléchargés et qu'un autre n'a pas la bonne somme de contrôle.

4. Connexion distante (ssh)

La machine virtuelle que vous allez créée est accessible via sa console virtuelle grâce à la commande vmiut console crypto.

L'utilisation de la console de la machine virtuelle n'est non seulement pas des plus pratique (pas de copier/coller, limitation à 80x25 caractères, etc.) mais souvent pas toujours possible.

Si vous êtes amenés à administrer ou juste à utiliser des machines, vous souhaiterez éviter le plus possible leur accès via ce genre de console (surtout si ce sont des machines physiques ou virtuelles louées chez un hébergeur, i.e. pas accessible physiquement).

Nous allons donc utiliser un logiciel de connexion à distance pour administrer la machine virtuelle. Cet outil est ssh. Il permet la connexion sur une machine distante, à travers une connexion chiffrée, pour notamment exécuter des commandes (par défaut un shell).

Avec ssh la connexion entre machine locale et machine distante est chiffrée symétriquement avec une clé de chiffrement échangée en début de session grâce à un chiffrement asymétrique.

Par ailleurs en plus de l'authentification classique par vérification d'un mot de passe, ssh permet une authentification sur la machine distante via un challenge basé sur un chiffrement asymétrique et donc une paire de clé publique/privée.

Par défaut la commande ssh démarre un simple shell sur une machine distante. Pour clore un connexion il suffit donc de terminer le shell.

On rappelle que pour fermer un shell on peut soit y utiliser la commande interne exit, soit, plus simplement, fermer son entrée standard via un envoi de CTRL-D dans le terminal auquel il est lié.

Préparation

  1. Toujours en restant dans votre dossier de travail (/tmp/crypto), créez une machine virtuelle en appelant la commande suivante :

    vmiut creer crypto && vmiut run crypto
    

    La machine virtuelle, nommée crypto, possède 1 Mo de mémoire, un disque dur virtuel de 10 Go sur lequel une version de Debian Bookworm (12.2) et est préinstallée avec 2 utilisateurs :

    • root avec comme mot de passe root
    • user avec comme mot de passe user

    Par ailleurs la configuration réseau de cette machine est obtenue par un appel à DHCP.

  2. Identifiez l'adresse IP de votre machine virtuelle. Pour cela vous pouvez :
    1. soit attendre un peu et utiliser la commande vmiut info crypto pour identifier l'adresse IP possible ;
    2. soit utiliser la commande vmiut console crypto pour pouvoir se connecter en tant que user pour obtenir l'adresse IP (comme vous l'avez vu en R306). Pour mémoire la commande ip a vous permet d'obtenir la configuration des différentes interfaces réséaux dont notamment leur adresse IP.
  3. Sur votre votre machine de virtualisation, supprimez la ligne StrictHostKeyChecking no, si elle est présente, de votre fichier ~/.ssh/config.

    Si vous n'avez jamais modifié ce fichier, vous pouvez tout simplement le supprimer.

Premier accès

Connexion

Lisez la page ssh(1) et trouvez puis exécutez la ligne de commande nécessaire pour vous connecter sur votre machine virtuelle en tant que l'utilisateur user.

En exécutant cette commande, un message similaire au message suivant devrait apparaître :

The authenticity of host '192.168.194.44 (192.168.194.44)' can't be established.
ECDSA key fingerprint is SHA256:pIQ72AO/u2dJwwmpjteTC//uKPPnx9ywJ80+4F5jBJg.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Ne répondez pas yes !

Ce message indique que votre client ssh ne s'est jamais connecté à la machine distante (ici la machine virtuelle). Il vous demande alors de vérifier si l'empreinte (fingerprint en anglais) du certificat de la machine correspond bien à la machine à laquelle vous voulez vous connecter.

Le but de cette vérification est de vous assurer que vous vous connectez bien à une machine de confiance. En effet, si la machine à laquelle vous tentez de vous connecter n'est pas la votre, mais une machine contrôlée par un tiers malveillant, il pourrait récupérer votre mot de passe.

Vérification clé machine distante

Sur votre machine virtuelle, lisez la page ssh-keygen(1) et trouvez comment afficher, l'empreinte de la clé, de type ECDSA du, stockée dans le fichier /etc/ssh/ssh_host_ecdsa_key.pub.

Vérifiez que cette empreinte correspond à celle que vous avez obtenue, sur votre terminal, en tentant de vous connecter à la machine virtuelle.

Si c'est le cas, vous pouvez saisir yes et établir la connexion.

Reconnection

Déconnectez vous de la machine virtuelle et effectuez à nouveau une connexion.

Devez-vous à nouveau vérifier l'empreinte ?

Pourquoi ?

Dans quel fichier a-t-elle été stockée ?

Simulation d'une attaque

Vous allez simuler ce qui se passerait si un tiers malveillant avait modifié le réseau (en truquant les réponses du serveur DNS par exemple) pour que votre connexion n'aboutisse pas sur votre serveur mais sur un autre sur lequel il aurait un contrôle complet. Ce peut être le cas lors d'un cas d'attaque classique appelée attaque de l'homme au milieu (man in the middle attack en anglais).

Pour cela vous allez modifier les clés de la machine virtuelle.

  1. Connectez-vous à votre console de votre machine virtuelle en tant que user, puis devenez root via un appel à la commande su -l.
  2. À l'aide de la commande suivante vous allez générez, un nouvel ensemble de clés, de type ECDSA :

    ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
    
  3. Redémarrez le service ssh via la commande systemctl restart ssh.
  4. Quittez la machine virtuelle pour revenir au terminal de votre machine physique.
  5. Refaites une tentative de connexion depuis votre terminal. Que se passe-t-il ? Pourquoi ?
  6. Utilisez la commande ssh-keygen -R IP (en remplaçant IP par l'adresse IP de votre machine virtuelle) pour supprimer l'enregistrement fait par votre client ssh de l'empreinte de l'ancienne clé de votre machine distante.

Authentification par échange de clés

Comme vous avez pu le voir dans les exercices précédents, il est possible de se connecter à une machine distante avec ssh en s'authentifiant via la fourniture d'un login et un mot de passe.

Il existe une autre solution pour prouver votre capacité à pouvoir utiliser l'identité demandée sur la machine distante. Cette solution est de vous authentifier à l'aide d'une paire de clés. C'est le même principe que celui utilisé pour la vérification de l'identité du serveur.

Dans cet exercice, vous allez donc vous fabriquer une paire de clés (publique et privée) que vous utiliserez ensuite pour vous connecter à votre serveur, sans avoir à donner votre mot de passe.

Création d'une paire de clé

Après avoir relu la page ssh-keygen(1), fabriquez une paire de clés privées/publiques qui doit :

  • avoir comme nom de base crypto
  • être stockée dans votre dossier de travail (i.e. /tmp/crypto)
  • utiliser l'algorithme ED25519

Quand la commande vous le demande, saisissez une phrase secrète (passphrase en anglais). Cette phrase secrète sera le seul moyen d'accéder à la clé privée. En effet, pour plus de sécurité, la clé privée sera stockée dans un fichier de manière chiffrée. La passphrase sert alors de clé de chiffrement symétrique.

La commande que vous avez utilisée a produit deux fichiers :

  • /tmp/crypto/crypto_ed25519 : c'est votre clé privée. Comme son nom l'indique, elle est privée et ne doit jamais être communiquée à quiconque. Seul le propriétaire (i.e. vous) de ce fichier doit pouvoir y accéder : le mode d'accès de doit pas donner plus de droits que 600 (i.e. -rw-------).
  • /tmp/crypto/crypto_ed25519.pub : c'est votre clé publique. Vous pouvez communiquer cette clé. Elle permettra de vérifier, par des moyens cryptographiques, que vous possédez bien la clé privée associée.

Autorisation d'authentification

Pour utiliser cette paire de clés, vous devez fournir à la machine sur laquelle vous voulez vous connecter votre clé publique. Dans le cas de ssh, un utilisateur peut autoriser une connexion en ajoutant une clé publique au fichier ~/.ssh/authorized_keys de la machine sur laquelle il veut se connecter.

Pour le cas qui nous concerne il faut donc que votre clé publique soit ajouter au fichier /home/user/.ssh/authorized_keys de la machine virtuelle.

Lisez la page de ssh-copy-id(1) et trouvez comment ajouter la clé publique que vous venez de créer au compte user de votre machine virtuelle.

Connexion avec authentification par clé

Connectez-vous à votre machine virtuelle en tant que user depuis votre machine de TP en utilisant l'identité que vous venez de générer (via les fichiers /tmp/crypto/crypto*).

5. Nettoyage de l'environnement de travail

Supprimez votre machine virtuelle via la commande vmiut rm crypto.