Page 1 sur 1

["TUTO" chiffrement Linux (LUKS)]

Publié : mar. 11 juin 2019 13:22
par Ryu_wm
Bonjour.

Parce que j'ai eu un besoin de chiffrer des données il y a peu, je vais rapidement faire un "tuto" synthétique car cela peut servir à d'autres.

Dans mon cas il s'agissait de chiffrer un disque dur interne rajouté sur un OS déjà "complètement chiffré" (sauf le /boot). Je vais adapter ma sauce mais faites en autant.
Bien que je dispose d'un /home chiffré, j'ai souhaité utiliser une clé USB comme moyen de déchiffrement du nouveau disque dur.

Postulat de départ :

- OS installé = Ubuntu >=16.04<18.04 ;
- besoin en chiffrement d'un nouveau disque dur dans le PC ou d'un média externe ;
- avoir soit un /home et un /swap déja chiffré ;
- je travaille sous root (marre des sudo) ;

Tout d'abord vous pouvez mettre à jour le système de chiffrement

Code : Tout sélectionner

apt-get upgrade cryptsetup
ou l'installer si vous ne l'avez pas :

Code : Tout sélectionner

apt-get install cryptsetup
apt install cryptsetup
afin de voir si tout fonctionne correctement je vous invite à faire un bench,
cela aura également pour fonction de vous renseigner sur les possibilités de chiffrement qu'offrent votre hardware et votre OS:

Code : Tout sélectionner

 cryptsetup benchmark
vous vous retrouvez plus ou moins avec un résultat de ce genre :
# Tests approximatifs en utilisant uniquement la mémoire (pas de stockage E/S).
PBKDF2-sha1 686240 iterations per second
PBKDF2-sha256 425558 iterations per second
PBKDF2-sha512 318135 iterations per second
PBKDF2-ripemd160 448876 iterations per second
PBKDF2-whirlpool 138847 iterations per second

# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 139,3 MiB/s 163,2 MiB/s
serpent-cbc 128b 47,8 MiB/s 196,7 MiB/s
twofish-cbc 128b 137,3 MiB/s 180,4 MiB/s
aes-cbc 256b 109,9 MiB/s 123,2 MiB/s
serpent-cbc 256b 53,9 MiB/s 196,7 MiB/s
twofish-cbc 256b 137,2 MiB/s 180,4 MiB/s
aes-xts 256b 162,4 MiB/s 162,8 MiB/s
serpent-xts 256b 176,7 MiB/s 185,5 MiB/s
twofish-xts 256b 166,6 MiB/s 168,1 MiB/s

aes-xts 512b 122,8 MiB/s 122,3 MiB/s
serpent-xts 512b 177,0 MiB/s 185,6 MiB/s
twofish-xts 512b 166,6 MiB/s 168,0 MiB/s

J'ai fait le choix de choisir un moyen qui offre des résultats équivalents en chiffrement ET déchiffrement. Les résultats cités sont à peu près symétriques mais des fois on peut avoir de grosses différences.En toute logique le 'serpent-xts' mais comme il ne passait pas (erreur explicite de cryptsetup) je me suis rabattu sur le twofish-xts.

Avant de commencer à chiffrer il faut choisir si vous souhaitez que la clé de déchiffrement soit stockée en local ou qu'elle soit ailleurs.
Je rappelle que j'ai choisi de ne pas stocker localement ce qui implique de spécifier où sera la clé via l'option
--key-file=
Je vais donc commencer par chiffrer la clé USB qui contiendra la clé de déchiffrement du disque dur. Pour ce faire, aucune subtilité, je choisis de chiffrer rapidement.
Seule particularité : la clé USB que j'utilise va sur différents systèmes dont du Windows, aussi je créé une petite partition Linux de quelques Mo (6 ici), le reste de la clé sera NTFS.

Je connecte la clé, fdisk -l me renseigne et m'indique qu'il s'agit de /dev/sdc1 pour la partition Linux.

je vais donc chiffrer très rapidement sdc1 :

Code : Tout sélectionner

cryptsetup -v -y luksFormat /dev/sdc1
Il vous est alors demandé en premier lieu de CONFIRMER que vous voulez effacer les données de cette partition en tapant Y E S (et non pas un simple 'y' comme moi au début)
Ensuite il vous est demandé un mot de passe : notez le quelque part !
voilà, la partition de la clé USB est chiffrée, certes en SHA1 "assez faible" mais tant pis.

Quand un "conteneur" est chiffré via cryptsetup/Luks il faut l'exploiter en "mappant" et surtout pas en "montant" ce conteneur; je choisis un "label" pour ce conteneur, disons "clé_usb".

Code : Tout sélectionner

cryptsetup luksOpen /dev/sdc1 clé_usb
saisir le mot de passe précédemment noté ;)

si vous souhaitez blanchir ce conteneur vous pouvez le faire (sur une clé USB ok sur un disque dur choisir une taille de bloc relativement grande si vous ne voulez pas y passer des jours)

Code : Tout sélectionner

dd if/dev/zero of=/dev/mapper/clé_usb status=progress
ou passer directement au formatage (ici ext2)

Code : Tout sélectionner

mkfs.ext2 /dev/mapper/clé_usb
remarquez qu'il faut bien travailler sur le conteneur /dev/mapper et surtout pas sur le /dev/sdc1, sinon vous supprimez le conteneur chiffré. Parfois les habitudes allant plus vite que la pensée ...

nous voici donc avec une partition de clé USB chiffrée et formatée.
il faut la monter. Vous aurez au préalable créé un point de montage, pour moi il s'agira de /media/dec

Code : Tout sélectionner

mount -v /dev/mapper/clé_usb /media/dec
Je vais créer un fichier contenant de l'aléatoire qui sera la clé de déchiffrement du disque dur.

Code : Tout sélectionner

dd if/dev/random of=/media/dec/.maclé bs=4 count=1024
(de façon évidente on ne prendra pas un nom aussi évocateur)

Tout de suite je vous invite à garder une ou des copie(s) de sauvegarde de ce fichier clé !
Ensuite, perso je choisis de le protéger contre toute fausse manip : je repasse sous l'utilisateur qui manipulera ce fichier (là je suis root pour rappel)
et je protège contre les bêtises

Code : Tout sélectionner

chattr +i /media/dec/.maclé
puis je repasse root.


Etape 1 terminée : nous avons une clé USB avec une partition chiffrée ext2/sha1 qui contient un fichier de 4Mo qui contient de l'aléatoire et qui est une clé de déchiffrement.

Nous pouvons passer au chiffrement du disque dur.
fdisk -l m'indique qu'il s'agit de /dev/sdb1.
Je vais cette fois-ci le chiffrer avec un moyen de chiffrement/déchiffrement (cf. benchmark) plus fort en utilisant le fichier random sur la clé USB.

chiffrer le conteneur :

Code : Tout sélectionner

cryptsetup --cipher=twofish-xts-essiv:sha256 --key-file=/media/dec/.maclé luksFormat /dev/sdb1
là encore une alerte sur le fait que vous allez tout effacer -> YES
cependant vous ne DEVEZ PAS avoir d'invite de saisie de mot de passe, ou alors quelque chose ne se passe pas correctement (chemin vers la clé de chiffrement erroné par exemple).

Par la suite il vous suffit d'ouvrir ce conteneur chiffré, le formater, le monter pour y avoir accès

Code : Tout sélectionner

cryptsetup --key-file=/media/dec/.maclé luksOpen /dev/sdb1 2to
mkfs.ext4 /dev/mapper/2to
mkdir /media/2to_c
mount -v /dev/mapper/2to /media/2to_c
voilà, ça doit normalement fonctionner.
on va tout démonter et remonter pour voir

démonter :

Code : Tout sélectionner

umount /media/2to_c
umount /media/dec
cryptsetup luksClose /dev/mapper/2to
cryptsetup luksClose /dev/mapper/clé_usb
je quitte root, je repasse utilisateur, je me positionne dans mon /home chiffré et je fais un petit script pour tout monter en un seul appel SUDO:

Code : Tout sélectionner

cryptsetup luksOpen /dev/sdc1 clé_usb
mount -v /dev/mapper/clé_usb /media/dec
cryptsetup --key-file=/media/dec/.maclé luksOpen /dev/sdb1 2to
mount -v /dev/mapper/2to /media/2to_c
Selon votre cas il y aura peut etre du chown et/ou du chmod à faire.
Dans mon cas je sers cette partition via un serveur SMB.

Se souvenir de bien noter le mot de passe pour la clé USB
Bien sauvegarder le fichier clé pour le disque dur.
Penser à sauvegarder très régulièrement les headers du disque dur chiffré car c'est très sensible
(cf : cryptsetup luksHeaderBackup)

En cas de figeage du procédé de chiffrement/déchiffrement, regardez le syslog (ou dmesg) ça donne des alerte i/o, ça me l'a fait sur un disque dur avec des secteurs défecteux et là c'est la cata.
Lire le man de cryptsetup, ça fait énormément de choses.

/!\ ATTENTION : j'avais tout mis en place sur une Ubuntu 16.04 et quelques jours après la maj pour la 18.04 est sortie, je l'ai appliquée et le système est passé sous LUKS 2, la plupart des commandes sont incompatibles
(je ne pouvais plus monter ma partition chiffrée, un réel plaisir).

Chiffrer une partition c'est bien, mais si vous êtes vraiment parano je vous invite à avoir au minimum un os chiffré et pour aller plus loin protéger votre /boot pour ne pas qu'il soit chrootable)
J'ai fait le choix d'avoir ma clé de déchiffrement sur un media amovible, ça limite les risques tout de même puisqu'il faut un accès physique à la clé.

Pour un peu de lecture je vous propose les mots clés suivants :
- random
- urandom
- tails