R4B10 - TP 4
TLS et GnuPG
1. Introduction
Au cours de ce TP vous allez mettre en place une connexion TLS sur un serveur HTTP (HTTPS) et manipuler GnuPG pour chiffrer et signer des messages (en l'occurence un fichier) pour observer les effets de l'utilisation de la cryptographie.
Lors de ce TP vous allez travailler avec deux machines virtuelles préparées spécialement pour l'occasion.
2. Préparation de l'environnement
Machine de travail
Vous devrez exécuter tout le TP sur la machine dattier
. Pour cela
connectez sur cette machine via la commande ssh -X dattier
dans
votre terminal de travail.
Dossier de travail
Créez un dossier pour le TP dans votre dossier personnel (par exemple
~/r4b10/pki
).L'intégralité du TP devrait être fait dans ce dossier !
- Copiez correctement (faites notamment attention au droit du
fichier de la clé privé) dans votre dossier de travail la
paire de clé SSH contenu dans les fichiers :
- clé privée :
/home/public/r4b10/pki/id-pki
- clé publique :
/home/public/r4b10/pki/id-pki.pub
- clé privée :
Machines virtuelles
- Sur votre machine de travail créez les machines virtuelles
suivantes, puis démarrez les :
r4b10-pki-serveur
r4b10-pki-client
- Une fois créé modifiez les machines de façon à ce que
- le serveur ait l'adresse finissant par
30
dans votre tranche IP ; - le client ait l'adresse IP finissant par
31
dans votre tranche IP ; - que depuis les 2 machines les noms
monserveur.fr
etmonclient.fr
soient résolus avec les adresses IP adéquates - que sur les 2 machines les paquets suivants soit installés :
tcpdump
,w3m
,curl
- que sur le serveur les paquets suivants soient installés :
nginx
- que sur le client les paquets suivants soient installés :
firefox-esr
- le serveur ait l'adresse finissant par
Configurez correctement ssh de façon à ce que :
ssh serveur
vous connecte directement sur le serveur en tant queroot
;ssh client
vous connecte directement sur le client en tant queuser
.
Dans les 2 cas ssh doit utiliser la paire de clés
id-pki
(regardez le sens deIdentityFile
dansssh_config(1)
).
3. Mise en place de TLS sur HTTP
TLS (Transport Layer Security) est un protocole permettant de faciliter la communication de données de manière sécurisée. Il permet notamment de chiffrer des transmissions en utilisant une infrastructure de gestion des clés (Public Key Infrastructure) avec délégation de la confiance à une autorité de certification.
C'est un protocole très utilisé notamment sur le web où HTTPS implémente simplement une connexion HTTP au dessus de TLS. Techniquement TLS permet notamment à 2 services de s'entendre sur la nature de la cryptographie à utiliser pour leur transmission à partir d'une poignée de main qui initialise la communication (handshake). Vous pouvez étudiez les étapes de l'établissement d'une telle connexion par exemple sur : https://tls13.xargs.org/.
TLS se base sur l'utilisation de certificat. Pour mémoire un certificat est un fichier contenant une clé publique, des informations d'identification et une signature. Il sert à identifier un service et à chiffrer la communication avec lui.
Dans ce genre de PKI on délègue la gestion de la vérification de l'identification à une autorité de certification. Cette autorité est en charge de délivrer des certificats aux entités ou services qui en ont besoin.
Ils existent de nombreuses autorités de certifications et chacune choisit ses procédures, conditions de vérification de l'identité du demandeur, méthode de délivrance, délégation et le coût attaché à la certification. Let's Encrypt offre gratuitement des certificats à qui en veut en se basant sur l'utilisation d'un protocle spécifique (ACME).
Les outils utilisant TLS pour sécuriser leur communication ont besoin
de connaître et surtout de faire confiance aux autorités de
certification qui délivrent les certificats. Pour cela ils embarquent
souvent les certificats des autorités en qui ils ont confiance. C'est
notamment le cas de Firefox dont la liste des autorités embarqués par
défaut est à la fois disponible en ligne et dans le navigateur (cf
about:preferences
, onglet Vie privée et sécurité, rubrique
Certificats).
Cette année dans le cadre du TP nous ne pourrons ni utiliser une autorité reconnue par défaut par Firefox ni utiliser une autorité délivrant des certificats gratuitement.
Vous allez donc simuler une autorité de certification en générant un certificat que nous allons signer nous même et ajouter aux autorités de confiance. Vous allez faire ça grâce à mkcert.
Connexion sans TLS
Serveur web en HTTP
Assurez-vous que vous avez bien un serveur web nginx
qui est en
service sur votre serveur et qu'il sert en HTTP les fichiers contenus
dans /var/www/html
. Pour cela il vous faudra sans doute :
créer un fichier
/etc/nginx/conf.d/default.conf
contenant au moins :server { listen 80; server_name monserveur.fr; root /var/www/html; }
- vérifier la configuration (
nginx -t
) ; - redémarrer
nginx
.
Ajoutez un fichier /var/www/html/login
contenant uniquement
votre login de salle de TP.
Observation des paquets web circulant sur le serveur
Depuis votre machine de travail observer les paquets web circulant sur le serveur avec la commande suivante :
ssh serveur 'tcpdump -ni enp0s3 -U -w -' | wireshark -i - -k -Y 'tcp.port == 80 || tcp.port == 443'
Depuis le client et après vous être assuré de ne pas utiliser de
proxy (au moins pour le réseau 10.42.0.0/16) naviguer avec Firefox
pour atteindre l'URL http://monserveur.fr/login
.
Qu'observe-t-on dans les paquets capturés ?
Connexion avec TLS
Installation d'un autorité de certification
La politique de sécurité des systèmes d'informations de l'Université et la difficulté de vous donner accès à un sous-domaine accessible ne nous permet pas de générer et utiliser des certificats TLS en utilisant les PKI comme Let's Encrypt. Vous allez donc fabriquer une autorité de certification.
Sur votre serveur :
- installer
mkcert
en suivant les instructions de https://mkcert.dev ; - créer une autorité de certification locale ;
- identifier le fichier contenant le certificat de l'autorité de certification.
Création d'un certificat pour le serveur web
Vous allez maintenant créer un certificat pour le service web.
Sur votre serveur :
- créer un certificat et une clé pour la machine
serveur
grâce àmkcert
; - déplacer ces fichiers dans le dossier
/etc/tls/
(à créer) ; configurer
nginx
pour qu'il serve les fichiers de/var/www/html
en HTTPS.Il devrait vous suffir d'ajouter quelque chose ressemblant à ça dans sa configuration (avec
XXXX
etYYYY
remplacé par les chemins adéquats) :server { listen *:443 ssl; root /var/www/html; server_name monserveur.fr; ssl_certificate XXXX; ssl_certificate_key YYYY; }
- redémarrer
nginx
après avoir vérifié sa configuration.
Connexion et observation des paquets
Depuis le client naviguer avec Firefox
pour atteindre l'URL
https://monserveur.fr/login
.
Que se passe-t-il ? Pourquoi ?
Corriger le problème en modifiant la configuration de Firefox pour qu'il fasse confiance à notre autorité de certification.
Observer à nouveau les paquets web circulant sur le serveur.
Quelle est la différence avec l'observation précédente ?
4. GnuPG
GnuPG est une suite de logiciels implémentant la RFC-4880 (i.e. OpenPGP). Elle permet notamment de chiffrer et signer les messages (fichiers). La confiance en les clés utilisés n'est pas délégué à une autorité de confiance mais à des proches entités que l'on connait et que l'on a identifié soit même ou via un réseau de confiance.
Vous allez ici utiliser GPG pour créer des clés, chiffrer des messages, signer des messages et signer des clés.
Avant de commencer lisez les chapitres 3, 4 et 5 du GPG Mini HOWTO.
Pour toutes vos opérations vous utiliserez l'option -a
qui
permet d'obtenir des caractères codés sur 7 bits.
Création d'une paire de clés
En utilisant l'option --gen-key
construisez-vous une paire de clé publique/privée.
Copiez votre clé publique dans
/home/public/rb410/pki/cles-publiques
avec comme nom de base
votre login.
Chiffrement de fichier
Pour cet exercice vous allez devoir choisir un binôme (votre voisin ou un ou une autre étudiante ou étudiant du groupe).
- Créez un fichier
/home/public/rb410/pki/fichiers/BINOME-clair
avecBINOME
remplacé par le login de votre binôme et comme contenu votre login. - Chiffrez ce fichier avec la clé publique de votre binôme.
Déchiffrement de fichier
Récupérez le fichier que votre binôme a préparé pour vous et déchiffrez le. Vérifiez que le contenu est celui attendu (le login de votre binôme).
Signature
Signez le fichier /home/public/rb410/pki/fichiers/BINOME-clair
avec
BINOME
remplacé par le login de votre binôme et stockez la signature
dans le fichier /home/public/rb410/pki/signatures/BINOME-clair.asc
Vérifiez la signature du fichier
/home/public/rb410/pki/fichiers/LOGIN-clair
stocké dans
/home/public/rb410/pki/signatures/LOGIN-clair.asc
.
Signez la clé publique de votre binôme puis refaites la vérification précédente.
Quelle différence est apparue ?
Quel est le problème que la signature des clés fait apparaître ?