Login Logout

Howto Chiffrement avec LUKS

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