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
- Ouvrez un terminal.
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.
- En étudiant la page
wget(1)
déterminez la ligne de commande permettant de récupérer le fichier vidéoiut-ibm360titre-ok.mkv
qui est disponible à l'URL http://localhost/~bruno.beaufils/crypto/iut-ibm360titre-ok.mkv. - 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
- 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à. 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
- 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 pagehexedit(1)
pourra vous rafraîchir la mémoire. - Vérifiez que le fichier n'est plus utilisable, toujours via
ffplay
par exemple. - 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.
- Téléchargez dans votre dossier de travail, les fichiers suivants :
iut-ibm360titre-ko.mkv
iut-ibm360titre-ok.mkv
mini.iso
- Après avoir étudié les pages
shasum(1)
etsha256sum(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. - 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
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 passeroot
user
avec comme mot de passeuser
Par ailleurs la configuration réseau de cette machine est obtenue par un appel à DHCP.
- Identifiez l'adresse IP de votre machine virtuelle. Pour cela vous pouvez :
- soit attendre un peu et utiliser la commande
vmiut info crypto
pour identifier l'adresse IP possible ; - soit utiliser la commande
vmiut console crypto
pour pouvoir se connecter en tant queuser
pour obtenir l'adresse IP (comme vous l'avez vu en R306). Pour mémoire la commandeip a
vous permet d'obtenir la configuration des différentes interfaces réséaux dont notamment leur adresse IP.
- soit attendre un peu et utiliser la commande
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.
- Connectez-vous à votre console de votre machine virtuelle en tant
que
user
, puis devenezroot
via un appel à la commandesu -l
. À 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
- Redémarrez le service ssh via la commande
systemctl restart ssh
. - Quittez la machine virtuelle pour revenir au terminal de votre machine physique.
- Refaites une tentative de connexion depuis votre terminal. Que se passe-t-il ? Pourquoi ?
- 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 clientssh
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 que600
(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
.