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 et l’outil crypsetup.
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 /root/.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/.foo.key /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
Pour « resizer » une partition LUKS (il faudra au préalable avoir agrandi la partition) :
# cryptsetup resize 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
Il est aussi possible d’indiquer un fichier de clé pour déchiffrer automatiquement la partition au démarrage :
sda7_crypt UUID=12345678-1234-5678-123456789abc /root/.foo.key luks