Activité Utiliser des algorithmes de chiffrement

Consigne

  1. La durée de l’activité est estimée à environ 180 minutes.
  2. Avant de commencer l’activité :
    • Lire la mise en situation, prendre connaissance des objectifs, du résultat attendu, et des ressources à disposition.
    • Lire une première fois en entier la section Mise en route.
  3. Effectuez le travail décrit dans la section Mise en route et effectuez les tâches demandées dans la section Tâches.

Mise en situation

Vous êtes chargé de mettre en œuvre des mesures techniques pour la protection des données dans un système Linux. Pour cela, vous devez créer un compte pour chaque utilisatrice et utilisateur du système, des groupes représentant les rôles que peuvent avoir ces utilisatrices et utilisateurs. Vous devez ensuite créer des répertoires partagés et configurer les droits d’accès à ces répertoires pour chacun de ces rôles.

Objectifs

À la fin de ce travail, vous devez :

  1. Connaître des commandes permettant de chiffrer des mots de passe.
  2. Connaître une commande pour calculer l’empreinte d’un fichier.
  3. Connaître la différence entre chiffrer un mot de passe et calculer une empreinte, même si l’on utilise dans les deux cas, par exemple, l’algorithme sha512.
  4. Connaître des commandes permettant de chiffrer des fichiers.
  5. Connaître une commande permettant de connaître le type de fichier.
  6. Connaître une commande permettant d’afficher le contenu d’un fichier en hexadécimal.

Résultat attendu

  • Un système Linux configuré selon les instructions.
  • Les réponses aux questions.

Ressources

Matériel :

  • Un serveur Linux (Ubuntu 20.04 LTS) : svr-m164-$NUM-sql01.lab.epai-ict.ch. La variable « $NUM » est le numéro de votre réseau tel qu’il apparait dans les informations d’identification que vous avez reçues par courriel.

Tâche

SSH avec authentification à clé publique

Le SSH supporte l’authentification par clé publique qui évite d’avoir à saisir sans arrêt un mot de passe et qui est beaucoup plus résistant aux attaques par force brute que l’authentification par mot de passe.

Pour cela, nous avons besoin d’une paire de clés pour effectuer des signatures numériques (typiquement RSA ou Ed25519). Voyons comment faire cela.

Ouvrez une fenêtre de terminal, et assurez-vous qu’un répertoire .ssh existe dans votre répertoire personnel sur votre PC. Si ce n’est pas le cas, créez ce répertoire avec la commande mkdir .ssh. On rappelle que sous Linux, les fichiers et les répertoires dont le nom commence par un point sont cachés.

Lorsque c’est fait, utilisez la commande ssh-keygen sur votre machine locale, pour générer une clé ED25519, sans mot de passe, dans le fichier"$HOME/.ssh/id_ed25519 et avec votre adresse de courriel en commentaire. Le commentaire apparaît à côté de la clé publique pour vous aider à l’identifier plus facilement.

1
ssh-keygen -t ed25519 -C "moi@example.com"

Rendez-vous dans le répertoire $HOME/.ssh de votre PC, et listez les fichiers qui s’y trouvent. Vous devriez voir un fichier id_ed25519 et un fichier id_ed25519.pub. Ces deux fichiers sont deux fichiers de texte. Le premier contient la clé privée et le second, la clé publique. La clé privée est au format PEM (Privacy Enhanced Mail). La clé publique est dans un format spécifique à ssh. Affichez leur contenu pour voir à quoi il ressemble.

1
2
3
4
5
6
7
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACA6F1W6TC/+B9V2gdUy6auGJ8ucPnuDWGFvcza5n6pDtAAAAJiHkXldh5F5
XQAAAAtzc2gtZWQyNTUxOQAAACA6F1W6TC/+B9V2gdUy6auGJ8ucPnuDWGFvcza5n6pDtA
AAAEAgpP9nsUnBzsq0FxmU/9ofd2BrpdnOUGB5KckjTF/GAzoXVbpML/4H1XaB1TLpq4Yn
y5w+e4NYYW9zNrmfqkO0AAAAD21vaUBleGFtcGxlLmNvbQECAwQFBg==
-----END OPENSSH PRIVATE KEY-----
Fig. 1 – Fichier id_ed25519 (clé privée) au format PEM
1
SHA256:svTdaUvZD1zmC3V7s035wbaOijUkdjV9EN3C/66gJ8M moi@example.com
Fig. 2 – Fichier id_ed25519.pub (clé publique)

Copiez le contenu du fichier id_ed25519.pub et connectez-vous en ssh sur votre serveur. Sur votre serveur, copier votre clé publique à la fin du fichier ~/.ssh/authorized_keys avec la commandeecho et une redirection d’entrée-sortie.

1
echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE78/RysUtjvsRrcqwv1NoGbeTDXo5rL/YbW4ANT6fE7 frossardj@epai-ict.ch' > ~/.ssh/authorized_keys

Terminez la session ssh avec la commande exit.

Par défaut, le client ssh (plus précisément l’agent ssh) charge automatiquement toutes les clés dont le nom est id_<alog> (p. ex. id_rsa, id_ed25519, etc.) s’ils n’ont pas de mot de passe. Pour charger une clé privée avec un autre nom de fichier ou une clé privée avec un mot de passe, on utilise la commande ssh-add <chemin du fichier>.

Pour ouvrir une session, le client envoie le nom du compte d’utilisateur·rice (p. ex. admin@...) au serveur et l’informe qu’il supporte l’authentification par clé publique. Le serveur répond en envoyant un challenge. Le client renvoie les données du challenge en les chiffrant avec la première clé privée chargée. Le serveur essaie de déchiffrer les données avec l’une des clés plubliques qui se trouve dans le fichier ~/.ssh/authorized_keys du compte de l’utilisateur·rice. S’il y parvient, la session est authentifiée, sinon il informe de l’échec. Le processus se répète jusqu’à ce que la session soit authentifiée ou que toutes les clés privées aient été essayées sans succès. Si l’authentification par clé publique a échoué et que le serveur supporte l’authentification par mot de passe, le client ssh vous demande alors votre mot de passe.

Questions :

  1. Pour que l’authentification par clé publique fonctionne, les permissions du répertoire .ssh doivent être 700 et celles du fichier authorized_keys doivent être 600. Sur la base de ce que l’on a vu en cours, expliquez pourquoi le sshd exige ces permissions.
  2. Si l’on protège la clé privée avec une passphrase ou si l’on donne un nom non standard aux fichiers contenant la paire de clés, quelle commande doit-on utiliser pour charger ces clés ?
  3. Sur quelle hypothèse repose la sécurité de l’authentification par clé publique ?
  4. Avec le protocole ssh, la première fois que l’on se connecte à un serveur, le client nous demande de vérifier que la clé publique du serveur est effectivement celle du serveur. Pourquoi nous demande-t-il cela ? ? Pourquoi n’a-t-on pas à répondre à une telle question dans le web avec HTTPS ?

Chiffrer des mots de passe avec OpenSSL

OpenSSL est une implémentation libre du TLS.

L’utilitaire en ligne de commande openssl permet, entre autres choses, de chiffrer des fichiers, de chiffrer des mots de passe, ou de calculer des empreintes.

Connectez-vous à votre serveur, puis utilisez la commande openssl passwd pour chiffrer un mot de passe avec l’algorithme SHA-512.

1
echo -n "monmotdepasse" | openssl passwd -6 -stdin

Pour chiffrer un mot de passe, on veut que le chiffrement prenne beaucoup de temps pour rendre plus difficiles les attaques par force brute. Pour cela, on effectue généralement plus «tours» (rounds) : on calcule l’empreinte du mot de passe, puis l’empreinte du résultat, puis l’empreinte du nouveau résultat, etc. La commande openssl passwd ne permet pas de spécifier le nombre de tours. Par défaut, elle effectue 5000 tours pour les algorithmes 5 (sha256) et 6 (sha512). Pour augmenter le coût, on peut utiliser la commande mkpasswd.

1
echo -n "monmotdepasse" | mkpasswd --method=sha-512 --rounds=100000 --stdin

Questions :

  1. Pourquoi l’option -n est-elle indispensable? Est-ce que la commande ajoute un sel (salt) au mot de passe avant de le chiffrer ?
  2. Pouvez-vous le déterminer sans rechercher dans la documentation ?
  3. Qu’est-ce que le nombre de tours ? Pourquoi est-ce important pour le chiffrement des mots de passe ? Est-ce que le nombre de tours est codé dans le mot de passe chiffré ?
  4. Peut-on spécifier un sel ? Pourquoi est-ce important pour le chiffrement des mots de passe ?
  5. OpenSSL ne supporte pas les algorithmes de chiffrement de mot de passe comme bcrypt ou yescript. Connaissez-vous une commande qui permet de faire cela ?
  6. Si vous regardez le résultat de la commande, vous remarquez que ce n’est pas de l’hexadécimal (0-9, a-f). Comment s’appelle le codage utilisé ? (a-z, A-Z, 0-9, +, /)

Calcul d’une empreinte avec OpenSSL

OpenSSL a également une commande openssl dgst (digest) pour calculer l’empreinte (hash) sha256 ou sha512 d’un fichier (ici ./fichier.txt) et renvoyer le résultat en hexadécimal (0-9, a-f).

Connectez-vous à votre serveur, créez un fichier nommé fichier.txt dans le répertoire personnel, puis lancez la commande suivante.

1
openssl dgst -sha512 ./fichier.txt

Essayez de changer un caractère du fichier (p. ex. ajouter une espace) et observez le résultat sur l’empreinte.

Chiffrer et déchiffrer des fichiers avec OpenSSL

Nous allons maintenant utiliser la commande openssl enc pour chiffrer un fichier avec les algorithmes AES256 CBC et PBKDF2 pour la dérivation de clé.

Pour cela, lancez la commande suivante et saisissez un mot de passe lorsque vous y êtes invité :

1
openssl enc -aes-256-cbc -salt -pbkdf2 -in fichier.txt -out fichier.txt.enc

Si on affiche le fichier chiffré avec la commande cat, on remarque que le contenu n’est pas lisible. On peut visualiser son contenu en hexadécimal avec la commande hexdump.

1
hexdump -C fichier.txt.enc

On peut également essayer de déterminer le type de fichier avec la commande file.

1
file fichier.txt.enc

On peut ensuite déchiffrer le fichier avec la commande suivante :

1
openssl enc -aes-256-cbc -d -salt -pbkdf2 -in fichier.txt.enc -out fichier_dechiffre.txt

Enfin, on peut utiliser la commande diff pour nous assurer que le fichier original et le fichier déchiffré sont identiques.

Questions :

  1. Que fait l’algorithme PBKDF2 ?
  2. Pour le chiffrement, la commande à une option -salt. À quoi sert cette option et pourquoi est-il important de l’utiliser ?

Chiffrement avec GPG (GNU Privacy Guard)

L’utilitaire en ligne de commande gpg permet également de chiffrer des documents.

Chiffrez et déchiffrez un document de la même manière que précédemment, mais cette fois avec la commande gpg.

1
2
gpg --symmetric --cipher-algo AES256 --output fichier.txt.gpg fichier.txt
gpg --decrypt --output fichier_dechiffre.txt fichier.txt.gpgs

Attention : Le chiffrement et le déchiffrement doivent être réalisés avec le même utilitaire. On ne peut pas chiffrer avec openssl et déchiffrer avec gpg, ou inversement.

Question :

  1. Si je ne suis pas certain de connaitre la commande qui a été utilisée pour chiffrer le fichier, comment puis-je essayer de le déterminer ?