wiki/HowtoLUKS.md

212 lines
6.2 KiB
Markdown
Raw Permalink Normal View History

2017-06-23 01:12:52 +02:00
---
categories: securité
title: Howto Chiffrement avec LUKS
...
2016-12-29 11:25:39 +01:00
2017-06-23 01:12:52 +02:00
* Documentation : <https://gitlab.com/cryptsetup/cryptsetup/wikis>
2016-12-29 11:25:39 +01:00
2017-06-23 01:14:51 +02:00
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/).
2016-12-29 11:25:39 +01:00
2017-06-23 01:12:52 +02:00
## Installation
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
# 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
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
## Création
2016-12-29 11:25:39 +01:00
2017-06-23 01:12:52 +02:00
On peut créer un volume chiffré LUKS en renseignant une passphrase ainsi :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup --verbose --verify-passphrase luksFormat /dev/sda7
2016-12-29 11:25:39 +01:00
WARNING!
========
This will overwrite data on /dev/sda7 irrevocably.
2016-12-29 11:25:39 +01:00
Are you sure? (Type uppercase yes): YES
2017-01-03 11:20:35 +01:00
Enter LUKS passphrase:
Verify passphrase:
2016-12-29 11:25:39 +01:00
Command successful.
# cryptsetup luksOpen /dev/sda7 crypt_sda7
2017-01-03 11:20:35 +01:00
Enter LUKS passphrase:
2016-12-29 11:25:39 +01:00
key slot 0 unlocked.
Command successful.
# mkfs.ext3 /dev/mapper/crypt_sda7
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
On peut aussi utiliser un fichier comme clé de chiffrement :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
# dd if=/dev/random of=/root/foo.key bs=1 count=256
# cryptsetup --verbose --key-size=256 luksFormat /dev/sda7 foo.key
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
## Utilisation
2016-12-29 11:25:39 +01:00
Voir si une partition est de type LUKS :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup isLuks /dev/sda7
# cryptsetup luksDump /dev/sda7
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
Déchiffrer une partition LUKS :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup luksOpen /dev/mapper/vol1-crypto_test crypto_test
# cryptsetup luksOpen /dev/sda7 sda7_crypt
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
Si la partition LUKS est protégée par un fichier :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup luksOpen --key-file /root/.keyfile /dev/sda7 supersecretdata
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
Informations sur la partition chiffrée :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup status crypto_test
~~~
2017-06-23 01:12:52 +02:00
Stopper le déchiffrement d'une partition LUKS :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup luksClose crypto_test
~~~
2017-06-23 01:12:52 +02:00
## Gestion des passphrases
2016-12-29 11:25:39 +01:00
2017-06-23 01:12:52 +02:00
LUKS permet d'avoir plusieurs passphrases pour un même volume chiffré.
Pour ajouter une passphrase :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup luksAddKey /dev/sda7
2017-01-03 11:20:35 +01:00
Enter any LUKS passphrase:
2016-12-29 11:25:39 +01:00
key slot 1 unlocked.
2017-01-03 11:20:35 +01:00
Enter new passphrase for key slot:
Verify passphrase:
2016-12-29 11:25:39 +01:00
Command successful.
~~~
2017-06-23 09:46:10 +02:00
> *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>
2016-12-29 11:25:39 +01:00
2017-06-23 01:12:52 +02:00
Pour supprimer une passphrase, on note son numéro avec :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup luksDump /dev/sda7
2016-12-29 11:25:39 +01:00
~~~
Puis on la supprime avec la commande ( inscrire la passphrase à supprimer ):
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup luksRemoveKey /dev/sda7
Enter LUKS passphrase to be deleted:
2016-12-29 11:25:39 +01:00
~~~
2022-11-17 18:30:36 +01:00
Pour tester une _passphrase_:
~~~
# cryptsetup luksOpen --test-passphrase /dev/sda7
# echo $? # la commande naffiche rien en cas de succès
~~~
2017-06-23 01:12:52 +02:00
## Sauvegarde
Si l'entête du conteneur LUKS est corrompu, ceci rend la partition inutilisable.
2016-12-29 11:25:39 +01:00
2017-06-23 01:12:52 +02:00
On peut sauvegarde l'entête d'un conteneur LUKS ainsi :
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup luksHeaderBackup --header-backup-file backup.txt /dev/sda7
2016-12-29 11:25:39 +01:00
~~~
Pour Restaurer l'entête :
~~~
# cryptsetup luksHeaderRestore --header-backup-file backup.txt /dev/sda7
2016-12-29 11:25:39 +01:00
~~~
## FAQ
2017-06-23 15:14:55 +02:00
### Command failed: Failed to setup dm-crypt key mapping
2017-06-23 01:12:52 +02:00
Si vous obtenez un message de ce type :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
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
2016-12-29 11:25:39 +01:00
~~~
2017-01-03 11:20:35 +01:00
2017-06-23 01:12:52 +02:00
Cela signifie probablement que le module noyau *Device Mapper* n'est pas chargé :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# modprobe dm-mod
~~~
2017-06-23 15:14:55 +02:00
### Notes sur les algorithmes de chiffrement
2016-12-29 11:25:39 +01:00
Pour utiliser un algorithme de chiffrement spécifique, il faut le préciser au moment de la création de la partition :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
# cryptsetup --verbose --cipher=aes-cbc-essiv:sha256 --verify-passphrase luksFormat /dev/sda7
2016-12-29 11:25:39 +01:00
~~~
2017-06-23 01:12:52 +02:00
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)>
2016-12-29 11:25:39 +01:00
2017-06-23 01:12:52 +02:00
Les autres algorithmes dignes dintérêt sont _twofish_ et _serpent_, deux compétiteurs de l'AES face à Rijndael.
2017-06-23 09:46:10 +02:00
2017-06-23 15:14:55 +02:00
### Benchmark
2017-06-23 09:46:10 +02:00
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
~~~
2017-06-23 15:14:55 +02:00
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
~~~
2017-06-23 15:14:55 +02:00
~~~