---
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 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 <jana@saout.de>
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 : <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 :

~~~
# cryptsetup luksKillSlot /dev/sda7 <n°>
~~~

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
~~~
~~~
