Afin de ne plus chercher partout « comment je m’y étais pris la dernière fois » pour fabriquer mon disque dur externe chiffré, je me suis fait un petit mémo. L’objectif est donc d’utiliser LUKS, et quelques lignes de commande.

J’avais un disque dur SATA de 500 Go, récupéré dans une de mes anciennes machines, que je voulais transformer en disque de sauvegarde. J’ai donc utilisé un dock USB, puis branché sur une machine Linux.

Toutes les commandes se font en root ou bien préfixées par sudo. Moi je suis plutôt root sur mes machines, surtout quand j’enchaîne les commandes à privilèges (quitte à faire un sudo /bin/bash…) Mais c’est un vieux troll poilu une autre histoire…

Première étape : le repartitionnement

Fdisk est votre ami.

Fdisk vous affiche les partitions d’un disque donné :

# fdisk -l /dev/sdb

Mais fdisk est avant-tout interactif. Voici ce que ça donne :

# fdisk /dev/sdb

Avec o (lettre o minuscule) : je crée une table des partitions vide, donc je vide en une fois toutes les partitions existantes.

Avec n : je crée une partition. En laissant les valeurs par défaut, la partition occupera l’espace maximal disponible.

Vous obtenez quelque chose de semblable à ceci :

Commande (m pour l'aide) : o
Disque /dev/sda : 8GiB, 8589934592 octets, 16777216 secteurs
Unités : secteur de 1 x 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x9974c975

Commande (m pour l'aide) : n
Type de partition
   p   primaire (0 primaire, 0 étendue, 4 libre)
   e   étendue (conteneur pour partitions logiques)
Sélectionnez (p par défaut) :

Utilisation de la réponse p par défaut.
Numéro de partition (1-4, 1 par défaut) :
Premier secteur (2048-16777215, 2048 par défaut) :
Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (2048-16777215, 16777215 par défaut) :

Une nouvelle partition 1 de type "Linux" et de taille 8 GiB a été créée.

Jusqu’à cet instant, on peut encore tout annuler en quittant avec q. Sinon, on quitte avec w :

Commande (m pour l'aide) : w
La table de partitions a été altérée.
Appel d'ioctl() pour relire la table de partitions.
Synchronisation des disques.

Là, c’est trop tard ! Les partitions sont perdues.

Deuxième étape : le chiffrement

Pour chiffrer la partition, on utilise la commande cryptsetup, à qui on indique la partition à chiffrer.

# cryptsetup luksFormat /dev/sdb1

WARNING!
========
Cette action écrasera définitivement les données sur /dev/sda2.
 
Are you sure? (Type uppercase yes): YES
Saisissez la phrase secrète : 
Vérifiez la phrase secrète :

N’oubliez pas de saisir une phrase de passe forte (on peut écrire une vrai phrase avec des espaces et de la ponctuation si on le souhaite !) Il n’existe aucun moyen connu à ce jour pour déchiffrer un disque si on perd cette phrase.

Le chiffrement est désormais effectif. On ne peut plus monter la partition directement. Il faut exploiter dm-crypt.

Troisième étape : « ouverture » de la partition

Il faut d’abord « ouvrir » le périphérique chiffré (le mapper avec le device-mapper et le module crypt) avant de pouvoir travailler sur la partition en clair.

# cryptsetup open /dev/sdb1 ma-partition
Saisissez la phrase secrète pour /dev/sdb1 :
# ls -l /dev/mapper/ma-partition
lrwxrwxrwx 1 root root 7 déc.  11 19:20 /dev/mapper/ma-partition -> ../dm-0

Quatrième étape : formatage

Selon vos besoins, vous pouvez choisir le mkfs qui vous convient. Ici, j’ai choisi de rester sur un système Ext4.

# mkfs.ext4 -L Mon-Volume /dev/mapper/ma-partition
mke2fs 1.42.12 (29-Aug-2014)
En train de créer un système de fichiers avec 2096384 4k blocs et 524288 i-noeuds.
UUID de système de fichiers=b806f5c4-1c1f-45f4-8b59-d144b7a894fb
Superblocs de secours stockés sur les blocs :
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocation des tables de groupe : complété
Écriture des tables d'i-noeuds : complété
Création du journal (32768 blocs) : complété
Écriture des superblocs et de l'information de compatibilité du système de fichiers : complété

Attention : vous devrez peut-être modifier le type de partition si vous choisissez un autre système de fichiers.

Cinquième étape : démontage

N’oubliez pas de fermer proprement votre partition chiffrée !

# cryptsetup close /dev/mapper/ma-partition

Recommandations

Je vous ai dit ici que mon disque avait contenu des données en clair. Si la table des partitions a été écrasée, si des informations sur le chiffrement ont été écrites pour la partition /dev/sdb1, si une fois ouvert dans un mappage virtuel arbitrairement appelé /dev/mapper/ma-partition je l’ai formaté en Ext4, certaines des anciennes données (voire la plupart) sont malgré tout encore présentes sur le disque. Et n’importe quel logiciel de récupération élémentaire se fera un plaisir de les retrouver.

D’abord, pour les anglophones souhaitant un document exhaustif, je vous suggère vivement de consulter cette page du Wiki d’Archlinux.

Sinon pour simplifier, je vous suggère trois solutions :

  1. Écraser vos données avant tout ce mémo :
# dd if=/dev/urandom of=/dev/sdb
  1. Générer du bruit avant le formatage (soit entre l’étape 3 et l’étape 4) :
# dd if=/dev/zero of=/dev/mapper/ma-partition
  1. Générer du bruit après le formatage (soit entre l’étape 4 et l’étape 5, et en rajoutant le montage) :

(si la partition est montée dans /mnt)

# cat /dev/zero > /mnt/zeros; sync; rm /mnt/zero

Considérations importante sur l’efficacité de ces moyens : ça ne marche correctement que pour des disques magnétiques ! Pour les SSD ou les mémoires flash comme les clés USB, afin de tenir compte du mécanisme de répartition d’usure, c’est beaucoup plus délicat que ça en a l’air. Et là pour le coup, je n’ai pas creusé l’affaire.

Même sur un disque magnétique, avec des outils spécifiques, on peut retrouver des données cachées. Typiquement, une simple passe, c’est-à-dire l’exécution une seule fois des commandes ci-dessus n’est pas efficace.

Concrètement, pour le premier cas, il vaudrait mieux faire trois passes…

# dd if=/dev/zero of=/dev/sdb
# dd if=/dev/urandom of=/dev/sdb
# dd if=/dev/zero of=/dev/sdb

… mais c’est trois fois plus long ! Et en plus, c’est variable selon la vitesse du générateur de nombres aléatoire caché derrière /dev/urandom !

Pour les autres cas, mettre des zéros sur une partition chiffré génèrera forcément du pseudo-aléatoire sur le disque physique.

Pour bien faire, il vaut mieux appliquer l’étape 1 en trois passes ET l’étape 2 en une passe. En effet, vous écrasez bien consciencieusement le disque avant le partitionnement, et une fois chiffré, vous le remplissez de « bruit ». Soit une passe à zéro, une passe aléatoire, une passe à zéro et une passe quasi-aléatoire.

Et là, ça commence à être pas mal !

Désormais, même si vous donnez ce disque dur à la NSA à un ami, vos données vont devenir très compliquées à récupérer, voire impossible pour le commun des mortels !