LUKS

TODO: Relire et remettre de l'ordre.

On peut facilement configurer le chiffrement avec LUKS lors de l'installation d'une distribution GNU/Linux. Mais si on veut chiffrer un éventuel deuxième disque dur , il faut le faire à la main.

Une fois le disque identifié (avec fdisk, comme plus bas), on peut le chiffrer :

# cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha256 /dev/sda1
 
WARNING!
========
Cette action écrasera définitivement les données sur /dev/sda1.
 
Are you sure? (Type uppercase yes): YES
Saisissez la phrase secrète : 
Vérifiez la phrase secrète : 

Vérification :

# cryptsetup luksDump /dev/sda1
LUKS header information for /dev/sda1
 
Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha256
Payload offset:	4096
MK bits:       	512
MK digest:     	0a 16 95 1f 9c 18 26 62 95 87 69 fb 9d 32 d5 00 89 21 a9 36 
MK salt:       	3f fd 91 5f c6 02 e8 8e 38 b8 05 bc 83 a7 e2 26 
               	65 0a 07 88 02 38 da 73 db cb 0c 8e ba c8 8c b9 
MK iterations: 	173750
UUID:          	cff610dd-3207-472f-bdd9-dbaf102958a9
 
Key Slot 0: ENABLED
	Iterations:         	1406591
	Salt:               	1f 0b 0c c5 21 0e d3 e8 05 8c 81 3b 81 fb e9 99 
	                      	15 d1 65 c8 c6 70 b2 1d c4 39 94 fb 62 26 85 80 
	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

Il faut maintenant créer une partition :

# cryptsetup luksOpen /dev/sda1 data
Saisissez la phrase secrète pour /dev/sda1 : 
 
# ls -l /dev/mapper/
total 0
lrwxrwxrwx 1 root root       7 nov  2 21:42 alt--simon--vg-home -> ../dm-3
lrwxrwxrwx 1 root root       7 nov  2 21:42 alt--simon--vg-root -> ../dm-1
lrwxrwxrwx 1 root root       7 nov  2 21:42 alt--simon--vg-swap_1 -> ../dm-2
crw------- 1 root root 10, 236 nov  2 21:42 control
lrwxrwxrwx 1 root root       7 nov  2 22:28 data -> ../dm-4
lrwxrwxrwx 1 root root       7 nov  2 21:42 nvme0n1p3_crypt -> ../dm-0
# mkfs.ext4 -m 0 -L data /dev/mapper/data 
mke2fs 1.43.4 (31-Jan-2017)
En train de créer un système de fichiers avec 122095616 4k blocs et 30531584 i-noeuds.
UUID de système de fichiers=33ac1c64-3173-457e-a7c1-25c7ad35e161
Superblocs de secours stockés sur les blocs : 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000
 
Allocation des tables de groupe : complété                        
Écriture des tables d'i-noeuds : complété                        
Création du journal (262144 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété 

Créer le point de montage et monter le disque :

# mkdir /mnt/data
 
# mount -t ext4 -o noatime /dev/mapper/data /mnt/data

On repère le disque avec fdisk :

$ sudo fdisk -l
(...)
Disque /dev/sdc : 1,8 TiB, 2000365289472 octets, 3906963456 secteurs
Unités : secteur de 1 × 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 : gpt
Identifiant de disque : 0B31EF05-5462-40FF-B947-C7423EFAB8D2
 
Périphérique Début        Fin   Secteurs Taille Type
/dev/sdc1     2048 3906961407 3906959360   1,8T Données de base Microsoft

Chiffrer le disque dur :

# cryptsetup luksFormat /dev/sdc1

J'ai voulu faire ça mais il y a des WARNINGS :

# cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha256 /dev/sdc1
WARNING: Device /dev/sdc1 already contains a 'ntfs' superblock signature.
WARNING: Device /dev/sdc1 already contains a 'atari' partition signature.
 
WARNING!
========
Cette action écrasera définitivement les données sur /dev/sdc1.
 
Are you sure? (Type uppercase yes): no 
Opération interrompue.

J'ai fait un formatage un peu “brutal” à grand coups de dd (attention, ça a duré 200 000 secondes!):

$ sudo dd if=/dev/zero of=/dev/sdc iflag=nocache oflag=direct bs=4096
488370433+0 enregistrements lus
488370432+0 enregistrements écrits
2000365289472 octets (2,0 TB, 1,8 TiB) copiés, 199997 s, 10,0 MB/s
$ sudo fdisk -l
Disque /dev/sdc : 1,8 TiB, 2000365289472 octets, 3906963456 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
$ sudo lsblk 
NAME                 MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
(...)
sdc                    8:32   0   1,8T  0 disk 

Création d'une nouvelle partition :

$ sudo fdisk /dev/sdc
 
Bienvenue dans fdisk (util-linux 2.32.1).
Les modifications resteront en mémoire jusqu'à écriture.
Soyez prudent avant d'utiliser la commande d'écriture.
 
Le périphérique ne contient pas de table de partitions reconnue.
Création d'une nouvelle étiquette pour disque de type DOS avec identifiant de disque 0xff8426b0.
 
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) : p
Numéro de partition (1-4, 1 par défaut) : 1
Premier secteur (2048-3906963455, 2048 par défaut) : 
Dernier secteur, +secteurs ou +taille{K,M,G,T,P} (2048-3906963455, 3906963455 par défaut) : 
 
Une nouvelle partition 1 de type « Linux » et de taille 1,8 TiB a été créée.
 
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.

Vérification:

$ sudo lsblk
(...)
sdc                    8:32   0   1,8T  0 disk  
└─sdc1                 8:33   0   1,8T  0 part 

Chiffrer la partition sdc1 :

$ sudo cryptsetup -v -y -c aes-xts-plain64 -s 512 -h sha512 -i 5000 --use-random luksFormat /dev/sdc1
 
WARNING!
========
Cette action écrasera définitivement les données sur /dev/sdc1.
 
Are you sure? (Type uppercase yes): YES
Saisissez la phrase secrète pour /dev/sdc1 : 
Vérifiez la phrase secrète : 
Key slot 0 created.
Opération réussie.

Vérification:

$ sudo cryptsetup luksDump /dev/sdc1
LUKS header information for /dev/sdc1
 
Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha512
Payload offset:	4096
MK bits:       	512
MK digest:     	6e c5 4d 4a 3c b6 bf d4 4b bb 1b 18 8a 24 a9 74 57 7c f1 5a 
MK salt:       	94 97 d0 42 34 f3 20 eb f0 72 76 3d 90 00 72 2b 
               	d2 29 18 aa 36 fd 22 95 b0 0f 0c 00 2a cd d7 b8 
MK iterations: 	112027
UUID:          	a329d451-fbd0-4a40-9270-896e64472208
 
Key Slot 0: ENABLED
	Iterations:         	4607100
	Salt:               	28 2a 94 33 a1 4d 2b b0 83 9f 9f 09 0d e3 24 86 
	                      	b6 ec e4 97 27 83 f0 71 b8 d0 68 a4 99 58 f3 11 
	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

Backup du header (explications sur loganmarchione.com) :

$ sudo cryptsetup luksHeaderBackup --header-backup-file /home/simon/header_backup.img /dev/sdc1

Ouvrir le container LUKS :

$ sudo cryptsetup luksOpen /dev/sdc1 ddexterne
Saisissez la phrase secrète pour /dev/sdc1 : 

Créer une partition :

$ sudo mkfs.ext4 /dev/mapper/ddexterne 
mke2fs 1.44.4 (18-Aug-2018)
En train de créer un système de fichiers avec 488369664 4k blocs et 122093568 i-noeuds.
UUID de système de fichiers=7a5beb6b-7fc6-41bd-9767-1b3861718fe6
Superblocs de secours stockés sur les blocs : 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
	102400000, 214990848
 
Allocation des tables de groupe : complété                        
Écriture des tables d'i-noeuds : complété                        
Création du journal (262144 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Utilisation

Déchiffrer et monter le disque :

$ sudo lsblk
NAME                 MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
(...)
sdd                    8:48   0   1,8T  0 disk  
└─sdd1                 8:49   0   1,8T  0 part <= C'est cette partition-ci, de 1,8To!!  
 
$ sudo cryptsetup luksOpen /dev/sdd1 ddexterne
Saisissez la phrase secrète pour /dev/sdd1 : 
 
$ sudo mount /dev/mapper/ddexterne /mnt/ddexterne/

On travaille dedans et puis on referme/démonte :

$ sudo umount /mnt/ddexterne
 
$ sudo cryptsetup luksClose /dev/mapper/ddexterne

Sources:

Si le premier disque dur principal est déjà chiffré, nous pouvons stocker sur celui-ci un fichier qui servira de clé pour déchiffrer le deuxième disque dur. (Ce qui évite de taper deux mots de passe au démarrage!)

Création du fichier :

# dd if=/dev/random of=/mnt/.datakey bs=1 count=256
256+0 enregistrements lus
256+0 enregistrements écrits
256 bytes copied, 0,00285662 s, 89,6 kB/s
 
# ls -al /mnt/
total 16
drwxr-xr-x  3 root root 4096 nov  2 22:43 .
drwxr-xr-x 23 root root 4096 nov  2 21:40 ..
drwxr-xr-x  3 root root 4096 nov  2 22:34 data
-rw-r--r--  1 root root  256 nov  2 22:43 .datakey

On ajoute la clé dans les “slot” qui permettent de déchiffrer le disque :

# cryptsetup luksAddKey /dev/sda1 /mnt/.datakey 
Entrez une phrase secrète existante : 

On vérifie :

# cryptsetup luksDump /dev/sda1
LUKS header information for /dev/sda1
 
Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha256
Payload offset:	4096
MK bits:       	512
MK digest:     	0a 16 95 1f 9c 18 26 62 95 87 69 fb 9d 32 d5 00 89 21 a9 36 
MK salt:       	3f fd 91 5f c6 02 e8 8e 38 b8 05 bc 83 a7 e2 26 
               	65 0a 07 88 02 38 da 73 db cb 0c 8e ba c8 8c b9 
MK iterations: 	173750
UUID:          	cff610dd-3207-472f-bdd9-dbaf102958a9
 
Key Slot 0: ENABLED
	Iterations:         	1406591
	Salt:               	1f 0b 0c c5 21 0e d3 e8 05 8c 81 3b 81 fb e9 99 
	                      	15 d1 65 c8 c6 70 b2 1d c4 39 94 fb 62 26 85 80 
	Key material offset:	8
	AF stripes:            	4000
Key Slot 1: ENABLED
	Iterations:         	1391302
	Salt:               	73 ec 5a 9e 2e a9 51 1f 17 53 79 e3 27 01 09 56 
	                      	eb 6f b2 19 be 44 1c e2 87 05 58 7d 5b 27 38 ce 
	Key material offset:	512
	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

Démontage :

# umount /mnt/data/
# cryptsetup luksClose /dev/mapper/data

Montage :

# cryptsetup luksOpen /dev/sda1 data
Saisissez la phrase secrète pour /dev/sda1 : 
 
# mount -t ext4 -o noatime /dev/mapper/data /mnt/data

On doit maintenant modifier les fichiers /etc/fstab et /etc/crypttab :

# nvim /etc/crypttab
 
# cat /etc/crypttab 
# <target name>		<source device>					<key file>	<options>
nvme0n1p3_crypt		UUID=8fb1b94f-db06-4d28-bb8a-abc1a30d2126	none		luks
data			/dev/sda1					/mnt/.datakey	luks,keyscript=/lib/cryptsetup/scripts/passdev
 
# nvim /etc/fstab 
 
# cat /etc/fstab 
# <file system>                    <mount point>   <type>  <options>         <dump>  <pass>
  /dev/mapper/alt--simon--vg-root  /               ext4    errors=remount-ro 0       1
# /boot was on /dev/nvme0n1p2 during installation
  UUID=c3829ece-82e0-4e83-9a79-ae6c444b42d7 /boot  ext2    defaults          0       2
# /boot/efi was on /dev/nvme0n1p1 during installation
  UUID=B013-E763                   /boot/efi       vfat    umask=0077        0       1
  /dev/mapper/alt--simon--vg-home  /home           ext4    defaults          0       2
  /dev/mapper/alt--simon--vg-swap_1 none           swap    sw                0       0
  /dev/sr0                         /media/cdrom0   udf,iso9660 user,noauto   0       0
 
#SLF: Deuxième disque dur (/dev/mapper/data)
  UUID=33ac1c64-3173-457e-a7c1-25c7ad35e161   /mnt/data	   ext4    defaults          0       1

TODO: Terminer la configuration pour permettre à l'utilisateur courant de (dé)monter le deuxième disque et d'y écrire.

Bonus, pour ouvrir un disque chiffré avec Luks et avec un fichier-clé :

# cryptsetup --key-file=/etc/keys/sdb1_key luksOpen /dev/sdb1 sdb1_crypt

(source: keyfile-based luks encryption in Debian)

Suite à une intallation d'une Debian avec le disque chiffré, je souhaite pouvoir rajouter une clé pour déchiffrer le disque dur, en plus de celle configurée au départ.

On identifie tout d'abord les partitions :

# fdisk -l
Disque /dev/nvme0n1 : 238,5 GiB, 256060514304 octets, 500118192 secteurs
Unités : secteur de 1 × 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 : gpt
Identifiant de disque : FB187D7A-0D33-4743-889D-5441E424852D
 
Périphérique     Début       Fin  Secteurs Taille Type
/dev/nvme0n1p1    2048   1050623   1048576   512M Système EFI
/dev/nvme0n1p2 1050624   1550335    499712   244M Système de fichiers Linux
/dev/nvme0n1p3 1550336 500117503 498567168 237,8G Système de fichiers Linux
 
 
Disque /dev/sda : 465,8 GiB, 500107862016 octets, 976773168 secteurs
Unités : secteur de 1 × 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 : 0x6ee5e36e
 
Périphérique Amorçage Début       Fin  Secteurs Taille Id Type
/dev/sda1    *         2048 976771071 976769024 465,8G  7 HPFS/NTFS/exFAT
 
 
 
 
Disque /dev/mapper/nvme0n1p3_crypt : 237,8 GiB, 255264292864 octets, 498563072 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
 
 
Disque /dev/mapper/alt--simon--vg-root : 28 GiB, 29997662208 octets, 58589184 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
 
 
Disque /dev/mapper/alt--simon--vg-swap_1 : 15,9 GiB, 17075011584 octets, 33349632 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
 
 
Disque /dev/mapper/alt--simon--vg-home : 193,9 GiB, 208188473344 octets, 406618112 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
# cryptsetup luksDump /dev/nvme0n1p3
LUKS header information for /dev/nvme0n1p3
 
Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha256
Payload offset:	4096
MK bits:       	512
MK digest:     	6f c0 da 10 e2 67 96 91 e3 d1 61 49 7a ef 5b f0 2b f2 94 9a 
MK salt:       	2a 58 19 02 dd 6a ca 3e d4 ba ac 6d 34 c3 0e 4b 
               	b4 45 61 69 58 6d 41 1b e3 ed 08 d7 08 a1 b9 05 
MK iterations: 	174750
UUID:          	8fb1b94f-db06-4d28-bb8a-abc1a30d2126
 
Key Slot 0: ENABLED
	Iterations:         	1391302
	Salt:               	ef 73 48 b9 05 36 24 ec 7c 0a 9b ca 63 fd d0 fa 
	                      	e6 c6 c1 aa f1 56 d9 13 f7 50 14 cc d1 3c 22 2c 
	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

On voit qu'il reste 7 slots disponibles. On ajoute :

# cryptsetup luksAddKey /dev/nvme0n1p3
Entrez une phrase secrète existante : 
Entrez une nouvelle phrase secrète pour l'emplacement de clé : 
Vérifiez la phrase secrète : 

On vérifie :

# cryptsetup luksDump /dev/nvme0n1p3
LUKS header information for /dev/nvme0n1p3
 
Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha256
Payload offset:	4096
MK bits:       	512
MK digest:     	6f c0 da 10 e2 67 96 91 e3 d1 61 49 7a ef 5b f0 2b f2 94 9a 
MK salt:       	2a 58 19 02 dd 6a ca 3e d4 ba ac 6d 34 c3 0e 4b 
               	b4 45 61 69 58 6d 41 1b e3 ed 08 d7 08 a1 b9 05 
MK iterations: 	174750
UUID:          	8fb1b94f-db06-4d28-bb8a-abc1a30d2126
 
Key Slot 0: ENABLED
	Iterations:         	1391302
	Salt:               	ef 73 48 b9 05 36 24 ec 7c 0a 9b ca 63 fd d0 fa 
	                      	e6 c6 c1 aa f1 56 d9 13 f7 50 14 cc d1 3c 22 2c 
	Key material offset:	8
	AF stripes:            	4000
Key Slot 1: ENABLED
	Iterations:         	1398906
	Salt:               	d1 cf 7f 08 e8 bb 57 0c f4 e5 27 fb fd c7 a3 66 
	                      	c7 1c 85 7f b6 be 79 50 fa f0 60 ab 0c bd c8 44 
	Key material offset:	512
	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

Cette fois, deux emplacements sont bien utilisés.

Comme expliqué dans cet article sur loganmarchione.com, il est très important de sauvegarder le header de LUKS.

$ sudo cryptsetup luksHeaderBackup --header-backup-file /home/simon/header_backup.img /dev/sdc1

Il faut évidemment stocker ce header sur un autre support chiffré…

  • luks.txt
  • Dernière modification: 2018/10/05 14:42
  • par simon