Lotharedon

Journal d'un apprenti-sorcier en Sciences Informatiques

Génération de nouveaux mots de passe en cas de perte des anciens pour des partitions LUKS.

Date 15/03/2015

Lors de l'installation d'une distribution GNU/Linux, il est souvent possible de choisir de créer des partitions chiffrées. Celles-ci seront impossible à lire sans posséder un des mots de passe configurés. Le standard utilisé pour le chiffrement est LUKS, et il permet d'avoir jusqu'à 8 mots de passe différent par partition. Seulement, lors de la perte de l'ensemble de ceux-ci, il devient alors impossible de lire les partitions chiffrées. Cependant, si elles sont toujours montées, il est possible de recréer de nouveaux mots de passe.


Vérification des mots de passe

Pour réaliser la vérification des mots de passe, il n'est pas utile de démonter les partitions chiffrées.

Avant de créer de nouveaux mots de passe, il se peut que vous ayez une vague idée de l'un d'entre eux, que vous souhaitez vérifier. Pour cela, nous pouvons utiliser la commande "cryptsetup" :
cryptsetup luksAddKey <chemin du volume chiffré>
Le chemin du volume chiffré est celui de la partition physique et ouverte par LUKS, et non celui du périphérique monté par le système. Par exemple, dans le cas d'une partition physique et chiffrée "/dev/sda1", et d'une partition "/dev/dm-0" montée sur "/", dont LUKS a un mappage interne de "sda1" sur "dm-0", il faudra indiquer "/dev/sda1". Lors de l'appel de cette commande, "cryptsetup" va tout d'abord demander un mot de passe valide avant de permettre l'ajout d'un nouveau. Si le mot de passe est invalide, cette commade va nous le signaler.


Mots de passe définitivement perdus

Si la vérification s'avère infructueuse, il reste possible de créer un nouveau mot de passe, à condition que la partition soit montée et déchiffrée. Si ce n'est pas le cas, les données peuvent être considérées comme perdues.
Pour cela, il faut tout d'abord trouver la correspondance entre les aprtitions physiques et les volumes LUKS, avant de pouvoir ajouter de nouveaux mots de passe en exploitant la clef maîtresse.


Trouver les correspondances entre les partitions physiques et les volumes LUKS

Lorsqu'on tape la commande "blkid", on peut voir les différentes partitions du système, leur étiquette, leur UUID et leur point de montage. Seulement les informations indiquées ne sont que celles vues par le système d'exploitation. Ainsi, par exemple, dans mon cas j'obtiens :
/dev/block/8:2: UUID="8XXX6" TYPE="crypto_LUKS" 
/dev/block/253:0: LABEL="Racine" UUID="1XXXX2" TYPE="xfs" 
/dev/block/8:1: LABEL="Boot" UUID="9XXXXd" TYPE="ext2" 
/dev/block/253:1: LABEL="Swap" UUID="6XXXXd" TYPE="swap" 
/dev/block/8:3: UUID="9XXXX1" TYPE="crypto_LUKS" 
/dev/sda3: UUID="9XXXX1" TYPE="crypto_LUKS" 
/dev/sda2: UUID="8XXXX6" TYPE="crypto_LUKS" 
/dev/dm-0: LABEL="Racine" UUID="1XXXX2" TYPE="xfs" 
/dev/sda1: LABEL="Boot" UUID="9XXXXd" TYPE="ext2" 
/dev/dm-1: LABEL="Swap" UUID="6XXXXd" TYPE="swap" 
Les partitions physiques sont celles du types "/dev/sdaX" et les volumes LUKS sont ceeux du type "/dev/dm-X".

À côté, parmi les outils fournis par LUKS, nous avont "dmsetup" qui peut fournir des informations sur notre table LUKS. Ainsi, pour avoir l'association entre les partitions physiques et LUKS, nous pouvons utiliser la commande "dmsetup info" :
Name:              luks-9XXXX1
State:             ACTIVE
Read Ahead:        8192
Tables present:    LIVE
Open count:        2
Event number:      0
Major, minor:      253, 1
Number of targets: 1
UUID: CRYPT-LUKS1-9XXXX1-luks-9XXXX1

Name:              luks-8XXXX6
State:             ACTIVE
Read Ahead:        8192
Tables present:    LIVE
Open count:        1
Event number:      0
Major, minor:      253, 0
Number of targets: 1
UUID: CRYPT-LUKS1-8XXXX6-luks-8XXXX6
Ici, les lignes qui nous intéressent sont les lignes "Name", "Major, minor", et éventuellement "UUID". Seulement nous pouvons voir que les lignes "UUID" sont du type "CRYPT-LUKS-<uuid du volume>-<nom du volume disponible à la ligne "Name">". Or ici, la ligne "Name" contient déjà l'uuid du volume, donc la ligne "UUID" n'apporte rien de plus.

Donc, en ne reprenant que les informations utiles, nous avons ici :
Name:              luks-9XXXX1
Major, minor:      253, 1

Name:              luks-8XXXX6
Major, minor:      253, 0
Ces informations nous permettent déjà de faire le lien entre les partitions physiques et les volumes LUKS grâce aux volumes de "/dev/block". En effet, la ligne "Major, minor" indique un volume block qui n'est qu'un lien symbolique vers un volume chiffré, et l'uuid associé est celui d'une partition physique.
Dans le cas où ces volumes block ne sont pas présents sur votre système, vous pouvez appeler la commande "dmsetup info" en lui précisant un volume chiffré. Ainsi "dmsetup info /dev/dm-0" nous retournera :
Name:              luks-8XXXX6
State:             ACTIVE
Read Ahead:        8192
Tables present:    LIVE
Open count:        1
Event number:      0
Major, minor:      253, 0
Number of targets: 1
UUID: CRYPT-LUKS1-8XXXX6-luks-8XXXX6
Nous avons ainsi l'uuid de la partition physique correspondante, qui est donc ici "/dev/sda2".

Ce dernier raisonnement peut également être appliqué avec la commande "dmsetup table <volume chiffré>". Nous allons obtenir une série de valeur que nous pourrons comparer à la sortie de cette commande sans préciser de volume cette fois, qui affiche les mêmes informations pour l'ensemble des volumes, mais en y ajoutant également les noms qui contiennent les uuid.


Création des nouveaux mots de passe

À présent, nous avons donc l'association entre nos partitions physiques et les volumes lus par le système d'exploitation. Nous pouvons donc générer les nouveaux mots de passe à partir de la clef maîtresse.

Chacun des volumes a une clef maîtresse qui permet de le déverouiller. Pour ceux qui sont lisibles, il est possible de récupérer cette clef grâce à la commande "dmsetup table --showkeys". Elle se trouve dans le cinquième champ au format décimal. Pour l'exploiter il faut la récupérer, mais également la convertir au format binaire. Pour cela, nous allons exploiter awk, mais aussi xxd pour la convertion, qui fait parti de l'installation de Vim. Ainsi la commande pour extraire la clef maîtresse de "dm-1" sera :
dmsetup table --showkeys /dev/dm-1 | awk '{ print $5 }' | xxd -r -p

Pour ajouter une nouvelle clef, nous allons utiliser la commande "cryptsetup luksAddKey" avec le paramètre "--master-key-file" qui va nous permettre de donner la clef maîtresse extraite grâce à la commande précédente. Au lieu de la copier-coller, nous allons tout simplement utiliser un pipe. Par exemple, cette commande appliqués à "sda3", qui est la partition correspondant à "dm-1" comme vu précédement, sera :
cryptsetup luksAddKey /dev/sda3 --master-key-file <(dmsetup table --showkeys /dev/dm-1 | awk '{ print $5 }' | xxd -r -p)
On y retrouve au début notre partition physique, et entre parenthèses le volume utilisé par le système d'exploitation.

Une fois cela fait, nous pouvons vérifier la validité des mots de passe avec la méthode vu dans la section précédente.


Sources

Tags Tags de l'article :

1 commentaire

tutoriel_linux - 07/07/2015 à 09:37:05

Il est vrai que la perte de mot de passe cause énormément de soucis. Ce type de rappel aide à être plus prudent. Cela confirme qu'il vaut mieux noter les codes dans un coin pour éviter les mauvaises surprises.

@répondre #lien

Comment RSS feed Flux RSS des commentaires de cet article