219 lines
6.5 KiB
Markdown
219 lines
6.5 KiB
Markdown
---
|
||
categories: securité
|
||
title: Howto Chiffrement avec LUKS
|
||
...
|
||
|
||
* Documentation : <https://gitlab.com/cryptsetup/cryptsetup/wikis>
|
||
|
||
LUKS (Linux Unified Key Setup) est le standard pour le chiffrement de disque sous Linux. Il permet le chiffrement de disque ou de partitions grâce au module noyau [DM-CRYPT](https://gitlab.com/cryptsetup/cryptsetup/wikis/DMCrypt) et l'outil [crypsetup](https://gitlab.com/cryptsetup/).
|
||
|
||
## Installation
|
||
|
||
~~~
|
||
# apt install cryptsetup
|
||
|
||
$ /usr/sbin/cryptsetup --version
|
||
cryptsetup 2.6.1 flags: UDEV BLKID KEYRING KERNEL_CAPI
|
||
|
||
$ /sbin/modinfo dm_crypt
|
||
filename: /lib/modules/6.1.0-20-amd64/kernel/drivers/md/dm-crypt.ko
|
||
license: GPL
|
||
description: device-mapper target for transparent encryption / decryption
|
||
author: Jana Saout <jana@saout.de>
|
||
depends: dm-mod
|
||
retpoline: Y
|
||
intree: Y
|
||
name: dm_crypt
|
||
vermagic: 6.1.0-20-amd64 SMP preempt mod_unload modversions
|
||
sig_id: PKCS#7
|
||
signer: Debian Secure Boot CA
|
||
sig_key: 32:A0:28:7F:84:1A:03:6F:A3:93:C1:E0:65:C4:3A:E6:B2:42:26:43
|
||
sig_hashalgo: sha256
|
||
signature: […]
|
||
~~~
|
||
|
||
## Création
|
||
|
||
On peut créer un volume chiffré LUKS en renseignant une passphrase ainsi :
|
||
|
||
~~~
|
||
# cryptsetup --verbose --verify-passphrase luksFormat /dev/sda7
|
||
|
||
WARNING!
|
||
========
|
||
This will overwrite data on /dev/sda7 irrevocably.
|
||
|
||
Are you sure? (Type uppercase yes): YES
|
||
Enter LUKS passphrase:
|
||
Verify passphrase:
|
||
Command successful.
|
||
# cryptsetup luksOpen /dev/sda7 crypt_sda7
|
||
Enter LUKS passphrase:
|
||
key slot 0 unlocked.
|
||
Command successful.
|
||
# mkfs.ext3 /dev/mapper/crypt_sda7
|
||
~~~
|
||
|
||
On peut aussi utiliser un fichier comme clé de chiffrement :
|
||
|
||
~~~
|
||
# dd if=/dev/random of=/root/foo.key bs=1 count=256
|
||
# cryptsetup --verbose --key-size=256 luksFormat /dev/sda7 foo.key
|
||
~~~
|
||
|
||
## Utilisation
|
||
|
||
Voir si une partition est de type LUKS :
|
||
|
||
~~~
|
||
# cryptsetup isLuks /dev/sda7
|
||
# cryptsetup luksDump /dev/sda7
|
||
~~~
|
||
|
||
Déchiffrer une partition LUKS :
|
||
|
||
~~~
|
||
# cryptsetup luksOpen /dev/mapper/vol1-crypto_test crypto_test
|
||
# cryptsetup luksOpen /dev/sda7 sda7_crypt
|
||
~~~
|
||
|
||
Si la partition LUKS est protégée par un fichier :
|
||
|
||
~~~
|
||
# cryptsetup luksOpen --key-file /root/.keyfile /dev/sda7 supersecretdata
|
||
~~~
|
||
|
||
Informations sur la partition chiffrée :
|
||
|
||
~~~
|
||
# cryptsetup status crypto_test
|
||
~~~
|
||
|
||
Stopper le déchiffrement d'une partition LUKS :
|
||
|
||
~~~
|
||
# cryptsetup luksClose crypto_test
|
||
~~~
|
||
|
||
## Gestion des passphrases
|
||
|
||
LUKS permet d'avoir plusieurs passphrases pour un même volume chiffré.
|
||
|
||
Pour ajouter une passphrase :
|
||
|
||
~~~
|
||
# cryptsetup luksAddKey /dev/sda7
|
||
Enter any LUKS passphrase:
|
||
key slot 1 unlocked.
|
||
Enter new passphrase for key slot:
|
||
Verify passphrase:
|
||
Command successful.
|
||
~~~
|
||
|
||
> *Note* : sur d'anciennes versions de *cryptsetup*, il fallait avoir la partition non déchiffrée pour pouvoir ajouter une passphrase : <http://bugs.debian.org/460409>
|
||
|
||
Pour supprimer une passphrase, on note son numéro avec :
|
||
|
||
~~~
|
||
# cryptsetup luksDump /dev/sda7
|
||
~~~
|
||
|
||
Puis on la supprime avec la commande ( inscrire la passphrase à supprimer ):
|
||
|
||
~~~
|
||
# cryptsetup luksRemoveKey /dev/sda7
|
||
Enter LUKS passphrase to be deleted:
|
||
~~~
|
||
|
||
Pour tester une _passphrase_ :
|
||
|
||
~~~
|
||
# cryptsetup luksOpen --test-passphrase /dev/sda7
|
||
# echo $? # la commande n’affiche rien en cas de succès
|
||
~~~
|
||
|
||
## Sauvegarde
|
||
|
||
Si l'entête du conteneur LUKS est corrompu, ceci rend la partition inutilisable.
|
||
|
||
On peut sauvegarde l'entête d'un conteneur LUKS ainsi :
|
||
|
||
~~~
|
||
# cryptsetup luksHeaderBackup --header-backup-file backup.txt /dev/sda7
|
||
~~~
|
||
|
||
Pour Restaurer l'entête :
|
||
|
||
~~~
|
||
# cryptsetup luksHeaderRestore --header-backup-file backup.txt /dev/sda7
|
||
~~~
|
||
|
||
|
||
## FAQ
|
||
|
||
### Command failed: Failed to setup dm-crypt key mapping
|
||
|
||
Si vous obtenez un message de ce type :
|
||
|
||
~~~
|
||
Command failed: Failed to setup dm-crypt key mapping.
|
||
Check kernel for support for the aes-cbc-essiv:sha256 cipher spec and verify that /dev/sda1 contains at least 133 sectors
|
||
~~~
|
||
|
||
Cela signifie probablement que le module noyau *Device Mapper* n'est pas chargé :
|
||
|
||
~~~
|
||
# modprobe dm-mod
|
||
~~~
|
||
|
||
### Notes sur les algorithmes de chiffrement
|
||
|
||
Pour utiliser un algorithme de chiffrement spécifique, il faut le préciser au moment de la création de la partition :
|
||
|
||
~~~
|
||
# cryptsetup --verbose --cipher=aes-cbc-essiv:sha256 --verify-passphrase luksFormat /dev/sda7
|
||
~~~
|
||
|
||
Le chiffrement **aes-cbc-essiv** est le chiffrement par défaut de _cryptsetup_ pour les noyaux supérieurs au 2.6.10 car il corrige une vulnérabilité potentielle du chiffrement _aes-cbc-plain_. Une autre méthode de chiffrement utilisée avec l'algorithme AES (Rijndael) est le mode XTS, qui est réputé plus résistant aux attaques par watermarking, mais nécessite un module spécifique (judicieusement nommé _xts_) et une clef d'initialisation du double de la taille de la clef finale (voir <http://en.wikipedia.org/wiki/Disk_encryption_theory#XEX-based_tweaked-codebook_mode_with_ciphertext_stealing_.28XTS.29)>
|
||
|
||
Les autres algorithmes dignes d’intérêt sont _twofish_ et _serpent_, deux compétiteurs de l'AES face à Rijndael.
|
||
|
||
### Benchmark
|
||
|
||
On peut vérifier la capacité du processeur avec les différents algorithmes en utilisant `cryptsetup benchmark`. Exemple de sortie
|
||
|
||
~~~
|
||
# cryptsetup benchmark
|
||
# Tests are approximate using memory only (no storage IO).
|
||
PBKDF2-sha1 992969 iterations per second
|
||
PBKDF2-sha256 567411 iterations per second
|
||
PBKDF2-sha512 455111 iterations per second
|
||
PBKDF2-ripemd160 564965 iterations per second
|
||
PBKDF2-whirlpool 214169 iterations per second
|
||
# Algorithm | Key | Encryption | Decryption
|
||
aes-cbc 128b 564.0 MiB/s 2303.1 MiB/s
|
||
serpent-cbc 128b 68.2 MiB/s 447.8 MiB/s
|
||
twofish-cbc 128b 161.1 MiB/s 293.7 MiB/s
|
||
aes-cbc 256b 421.8 MiB/s 1716.7 MiB/s
|
||
serpent-cbc 256b 75.2 MiB/s 473.0 MiB/s
|
||
twofish-cbc 256b 149.4 MiB/s 275.1 MiB/s
|
||
aes-xts 256b 2025.6 MiB/s 2048.6 MiB/s
|
||
serpent-xts 256b 465.4 MiB/s 438.9 MiB/s
|
||
twofish-xts 256b 247.2 MiB/s 258.3 MiB/s
|
||
aes-xts 512b 1503.3 MiB/s 1573.4 MiB/s
|
||
serpent-xts 512b 491.9 MiB/s 396.5 MiB/s
|
||
twofish-xts 512b 241.4 MiB/s 228.3 MiB/s
|
||
~~~
|
||
|
||
Cela permet aussi de choisir le chiffrement le plus performant, dans cet exemple *aes-xts* avec une clé de 256 bits est le plus performant.
|
||
|
||
### /etc/crypttab
|
||
|
||
Grâce au fichier `/etc/crypttab` on peut déchiffrer des partitions au démarrage. Attention, il faudra alors être présent physiquement devant la machine donc le cas d'usage est surtout un ordinateur portable :
|
||
|
||
~~~
|
||
sda5_crypt UUID=b1fef975-514f-4f33-839c-8b0d4dfeaabe none luks,swap
|
||
sda7_crypt UUID=cd81744f-5254-5ff0-b649-3d0143827924 none luks
|
||
~~~
|
||
~~~
|