Modification de phrase de passe pour disque chiffré LUKS

Une phrase de passe complexe, longue et difficile à deviner c’est bien. La changer régulièrement c’est mieux. On peut également avoir besoin de plusieurs phrases de passe (si on veut confier son ancien lappy à une voisine dans le besoin, par exemple).

Les disques chiffrés avec Cryptsetup/LUKS sont de petites merveilles. LUKS supporte, en effet, plusieurs phrases de passe stockée dans les slots. On peut, à loisir, ajouter et supprimer des phrases de passe (jusqu’à 8). Facile alors de fournir une phrase de passe temporaire le temps d’un prêt.

Lister les infos :
% cryptsetup luksDump /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1
LUKS header information for /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 1032
MK bits:        128
MK digest:      08 fc d8 1c f8 49 a9 a1 8e 47 8e b4 32 11 64 4a 5e ca 14 26
MK salt:        0a 24 2a 6e 90 68 a0 8e d3 06 bd 25 f5 c3 7e af
                d3 e9 0b 54 3a d3 f3 a3 b2 bd 4a 63 4a 54 63 c4
MK iterations:  10
UUID:           8702329c-0242-4d20-ad8c-1a5986d0ea82

Key Slot 0: ENABLED
        Iterations:             178684
        Salt:                   d5 76 c0 bc 93 55 76 31 15 75 10 65 76 ef 0e 32
                                02 6a 88 5c 95 b4 83 c2 dd 3b d1 36 de 58 b0 55
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Nous avons un slot (le 0) d’utilisé. C’est celui de la phrase de passe utilisé lors de la création du disque chiffré. Nous pouvons en ajouter une avec :
% cryptsetup luksAddKey /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1
Enter any LUKS passphrase:
key slot 0 unlocked.
Enter new passphrase for key slot:
Verify passphrase:
Command successful.
On entre la phrase de passe existante pour débloquer le périphérique LUKS, puis la nouvelle, deux fois. On vérifiera le bon déroulement de l’opération avec un nouvel appel à la demande d’information :
Key Slot 0: ENABLED
        Iterations:             178684
        Salt:                   d5 76 c0 bc 93 55 76 31 15 75 10 65 76 ef 0e 32
                                02 6a 88 5c 95 b4 83 c2 dd 3b d1 36 de 58 b0 55
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: ENABLED
        Iterations:             182347
        Salt:                   43 e8 e2 ee d3 be bc 4d 51 3f cc c8 16 4e 80 9b
                                83 60 28 cc 28 c9 91 32 eb 48 2d 21 5f 92 c7 74
        Key material offset:    136
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Le slot 1 est maintenant utilisé. On utilise ensuite la configuration habituelle pour tester (via le script d’init).
% /etc/init.d/cryptdisks start
Starting remaining crypto disks… satahitachi (starting)Enter LUKS passphrase:
key slot 1 unlocked.
Command successful.
 satahitachi (started)done.
Ça marche (bien sûr). On voit dans la sortie que c’est la clef sur le slot 1 qui a été utilisée.

Pour retirer une phrase de passe, c’est :
% cryptsetup luksDelKey /dev/disk/by-id/scsi-SATA_Hitachi_HDS7216_PVF904Z23V7KLN-part1 1
Enter any remaining LUKS passphrase:
key slot 0 unlocked.
Command successful.
On utilise alors l’une des phrase de passe stockée dans l’un des slot restant (ici 0). Un chagement de phrase de passe revient à ajouter la nouvelle et supprimer l’ancienne, tout simplement. C’est tout.

Changement de disque LVM2 + Crypto et migration des données

Oh ! Le beau titre. Le disque dur de mon beau x31 montrait des faibles depuis quelques temps déjà. Le démon smartd m’informait régulièrement qu’un secteur défectueux avait été trouvé. On le sait tous, ça commence par un secteur et un beau jour on fini par perdre tout le disque. Il fallait réagir. Mais le disque est chiffré avec LUKS et LVM2. Comment migrer tout cela ? Procédure pas-à-pas…Comme détaillé dans un précédent billet, le démontage du disque et sa lecture une fois connecté sur une autre machine via USB n’est pas un problème.

Ouverture du disque chiffré
% cryptsetup luksOpen /dev/sde5 plop
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.
Recherche des informations LVM2
% pvscan
PV /dev/dm-1 VG x31 lvm2 [37.02 GB / 0 free]
Total: 1 [37.02 GB] / in use: 1 [37.02 GB] / in no VG: 0 [0 ]

% vgscan
Reading all physical volumes. This may take a while…
Found volume group « x31 » using metadata type lvm2

% lvscan
inactive ‘/dev/x31/root’ [35.46 GB] inherit
inactive ‘/dev/x31/swap_1’ [1.56 GB] inherit

% lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
root x31 -wi— 35.46G
swap_1 x31 -wi— 1.56G
Activation des volumes logiques pour accès depuis /dev/x31/*
% vgchange -a y x31
2 logical volume(s) in volume group « x31 » now active
% ls /dev/x31/
root swap_1
Montage des FS (/ chiffré et /boot classique)
% mount -oro /dev/x31/root /mnt/X/root
% mount -oro /dev/sde1 /mnt/X/boot
Copie des données
% mkdir /mnt/mega20/x31/root
% mkdir /mnt/mega20/x31/boot

% cd /mnt/X/boot
% find . -xdev | cpio -pm /mnt/mega20/x31/boot

% cd /mnt/X/root
% find . -xdev | cpio -pm /mnt/mega20/x31/root
Démontage, désactivation LVM et fermeture LUKS
% umount /mnt/X/root
% umount /mnt/X/boot

% vgchange -a n x31
0 logical volume(s) in volume group « x31 » now active

% cryptsetup luksClose plop

Nouveau disque

Partitionnement
% fdisk /dev/sde
Command (m for help): p

Disk /dev/sde: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sde1 1 9729 78148161 b W95 FAT32

Command (m for help): d
Selected partition 1

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-9729, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-9729, default 9729): 31

Command (m for help): p

Disk /dev/sde: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sde1 1 31 248976 83 Linux

Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Partition number (1-4): 2
First cylinder (32-9729, default 32):
Using default value 32
Last cylinder or +size or +sizeM or +sizeK (32-9729, default 9729):
Using default value 9729

Command (m for help): p

Disk /dev/sde: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sde1 1 31 248976 83 Linux
/dev/sde2 32 9729 77899185 5 Extended

Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (32-9729, default 32):
Using default value 32
Last cylinder or +size or +sizeM or +sizeK (32-9729, default 9729):
Using default value 9729

Command (m for help): p

Disk /dev/sde: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sde1 1 31 248976 83 Linux
/dev/sde2 32 9729 77899185 5 Extended
/dev/sde5 32 9729 77899153+ 83 Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
Création FS pour /boot, montage et copie
% mke2fs /dev/sde1
% mount /dev/sde1 /mnt/X/boot/
% cd /mnt/mega20/x31/boot
% find . -xdev | cpio -pm /mnt/X/boot
Création LUKS
% cryptsetup –verbose –verify-passphrase luksFormat /dev/sde5
WARNING!
========
This will overwrite data on /dev/sde5 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.
Ouverture LUKS
% cryptsetup luksOpen /dev/sde5 plop
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.
Création du volume physique
% pvcreate /dev/mapper/plop
Physical volume « /dev/mapper/plop » successfully created
Création du groupe x31
% vgcreate x31 /dev/mapper/plop
Volume group « x31 » successfully created

% pvscan
PV /dev/mapper/plop VG x31 lvm2 [74,29 GB / 74,29 GB free]
Total: 1 [74,29 GB] / in use: 1 [74,29 GB] / in no VG: 0 [0 ]
Création des volumes logiques
% lvcreate -L 1560M -n swap_1 x31
Logical volume « swap_1 » created
% lvcreate -l 100%FREE -n root x31
Logical volume « root » created

% lvscan
ACTIVE ‘/dev/x31/swap_1’ [1,52 GB] inherit
ACTIVE ‘/dev/x31/root’ [72,77 GB] inherit
Les volumes sont automatiquement actifs. Création du SWAP
% mkswap /dev/x31/swap_1
Setting up swapspace version 1, size = 1635774 kB
no label, UUID=989ba8ea-aab4-4b81-af31-06112abc66e1
Création FS racine et copie
% mke2fs -j /dev/x31/root
% mount /dev/mapper/x31-root /mnt/X/root/

% cd /mnt/mega20/x31/root
% find . -xdev | cpio -pm /mnt/X/root
Démontage, désactivation et fermeture LUKS
% umount /mnt/X/root
% umount /mnt/X/boot

% vgchange -a n x31
0 logical volume(s) in volume group « x31 » now active

% cryptsetup luksClose plop

Bootloader Grub
On install GRUB sur le disque USB hd2. stage2 est pointé sur hd2 mais par défaut il est cherché sur le même disque que stage1 (secteur de boot). menu.lst est bien pointé sur le futur hd0 seul disque du lappy

% grub
grub> install (hd2,0)/grub/stage1 (hd2) (hd2,0)/grub/stage2 (hd0,0)/grub/menu/lst
^D

Lecture d'un disque LVM2+crypto d'un lappy x31

Chiffrer et utiliser des volumes logique sur un portable/lappy c’est bien. Debian propose une installation directe avec LVM2 et LUKS. Mais comment lire les données et récupérer les info lorsqu’on sort le disque du lappy qui donne des signes de faiblesse et qu’on le branche en USB sur un autre système ?

Le Thinkpad x31 est un amour. Non seulement c’est configurable à souhait avec GNU/Linux mais, en plus, c’est du très bon matériel et il est bourré de petites choses qui font la différence avec du lappy bas de gamme. L’une de ces petites choses est la facilité avec laquelle on peut changer de disque dur. On retire une simple vis et on glisse le disque hors du boîtier. Le disque est, en effet, placé dans un petit berceau tout mignon. Ne reste, ensuite, qu’à utiliser un adaptateur IDE/ATA en USB2 et par ici les données…

Le reste est logiciel.

Connexion du disque en USB :
usb-storage: device found at 31
usb-storage: waiting for device to settle before scanning
usb-storage: device scan complete
scsi 29:0:0:0: Direct-Access Generic USB Disk 9.02 PQ: 0 ANSI: 2
sd 29:0:0:0: [sdf] 78140160 512-byte hardware sectors (40008 MB)
sd 29:0:0:0: [sdf] Write Protect is off
sd 29:0:0:0: [sdf] Mode Sense: 03 00 00 00
sd 29:0:0:0: [sdf] Assuming drive cache: write through
sd 29:0:0:0: [sdf] 78140160 512-byte hardware sectors (40008 MB)
sd 29:0:0:0: [sdf] Write Protect is off
sd 29:0:0:0: [sdf] Mode Sense: 03 00 00 00
sd 29:0:0:0: [sdf] Assuming drive cache: write through
sdf: sdf1 sdf2 < sdf5 >
On retrouve les deux partitions de base, la première pour /boot, non chiffrée et la seconde chiffrée. On utilise ensuite cryptsetup pour « ouvrir » de périphérique bloc avec LUKS :
% cryptsetup luksOpen /dev/sdf5 plop
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.
On se retrouve avec un /dev/mapper/plop qui est le périphérique bloc déchiffré. Seconde phase, trouver les données LVM2. C’est facile :
Volume physique :

% pvscan
PV /dev/dm-1 VG x31 lvm2 [37.02 GB / 0 free]
Total: 1 [37.02 GB] / in use: 1 [37.02 GB] / in no VG: 0 [0 ]
Groupe de volumes :

% vgscan
Reading all physical volumes. This may take a while…
Found volume group « x31 » using metadata type lvm2
Volumes logiques :

% lvscan
inactive ‘/dev/x31/root’ [35.46 GB] inherit
inactive ‘/dev/x31/swap_1’ [1.56 GB] inherit
% lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
root x31 -wi— 35.46G
swap_1 x31 -wi— 1.56G
Bien ! On retrouve nos petits. Il suffit ensuite d’activer les volumes pour pouvoir y accéder depuis /dev :
% vgchange -a y x31
2 logical volume(s) in volume group « x31 » now active
% ls /dev/x31/
root swap_1
Ne reste plus qu’à monter tout cela :
% mount -oro /dev/x31/root /mnt/loo/
% ls /mnt/loo/
bin home media sbin usr
boot initrd mnt selinux var
cdrom initrd.img opt srv vmlinuz
dev lib proc sys
etc lost+found root tmp
Et voilà, y’a plus qu’à…

Ensuite, démontage et déconnexion :
% umount /mnt/loo
% vgchange -a n x31
0 logical volume(s) in volume group « x31 » now active
% cryptsetup luksClose plop
Fini !

PS : il ne manque qu’une chose au x31, une séquence de touches magique permettant, comme sur un Mac, de démarrer le matériel en le transformant en périphérique USB Mass Storage… Je sais j’en demande beaucoups… mais ça manque…

Chiffrement de disque facile avec Debian

Je viens tout juste de me rendre compte à quel point il est facile aujourd’hui de chiffrer un disque avec Debian. Voici la, courte, description de la manipulation.

Soit un disque contenant une seule partition, /dev/sda1. On commence par installer ce qu’il faut :
% aptitude install cryptsetup hashalot
On chiffre ensuite le périphérique avec cryptsetup en LUKS. Choisissez une phrase de passe longue et complexe :
% cryptsetup –verbose –verify-passphrase luksFormat /dev/sda1
Mappez le périphérique pour obtenir un /dev/mapper/cryptodisk utilisable :
% cryptsetup luksOpen /dev/sda1 cryptodisk
% ls /dev/mapper/cryptodisk
Créez le système de fichiers :
% mkfs.ext3 -j /dev/mapper/cryptodisk
Ajoutez un point de montage et montez le système de fichiers. Tout marche. Démontez :
% mkdir /mnt/cryptodisk
% mount /dev/mapper/cryptodisk /mnt/cryptodisk
% umount /mnt/cryptodisk
Ajoutez le périphérique au fichier crypttab pour automatiser le montage. Ici, on ne supporte qu’un seul essai et un temps limite pour la saisie de la phrase de passe de 10 secondes. Ainsi, on ne bloque pas le démarrage du système si personne n’est présent pour saisir la phrase (reboot, coupure, etc) :
% cat /etc/crypttab
cryptodisk /dev/sda1 none luks,tries=1,timeout=10
Redémarrez le service et entrez la phrase :
% /etc/init.d/cryptdisks restart
Modifiez votre fstab pour pouvoir monter le système de fichiers facilement :
% cat /etc/fstab
/dev/mapper/cryptodisk /mnt/cryptodisk auto user,noauto 0 0
Montez le système de fichiers et rendez-le utilisable pour l’utilisateur lambda :
% mount /mnt/cryptodisk
% sudo chown -R user.user /mnt/cryptodisk
Et voilà, c’est tout.

Petite astuce au passage : l’entrée dans /dev pour votre périphérique peut être changeante en fonction de la présence d’autres périphériques. Pour pouvoir facilement vous y retrouvez, utilisez simplement l’entrée correspondante dans /dev/disk/by-id. Ceci s’avère d’autant plus pratique avec les disques USB.