--- categories: securité title: Howto Chiffrement avec LUKS ... * Documentation : 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 1.7.3 $ /sbin/modinfo dm_crypt filename: /lib/modules/4.9.0-3-amd64/kernel/drivers/md/dm-crypt.ko license: GPL description: device-mapper target for transparent encryption / decryption author: Jana Saout depends: dm-mod intree: Y vermagic: 4.9.0-3-amd64 SMP mod_unload modversions ~~~ ## 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 : Pour supprimer une passphrase, on note son numéro avec : ~~~ # cryptsetup luksDump /dev/sda7 ~~~ Puis on la supprime avec la commande : ~~~ # cryptsetup luksKillSlot /dev/sda7 ~~~ ## 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 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 ~~~ ~~~