LUKS
Présentation
LUKS est un système de chiffrement des disques durs, intégré depuis longtemps directement dans le noyau Linux (via DM-Crypt pour la partie noyau et cryptsetup pour la partie utilisateur). Il propose en standard toute une gamme d'algorithmes de chiffrement (AES, Serpent, Twofish) et de hashage (SHA, RIPEMD, WHIRLPOOL).
LUKS permet de chiffrer de manière sûre vos disques durs. Ainsi, même perdu ou volé, votre ordinateur ne révèlera rien de vos données, y compris si on lui extrait son disque dur pour analyse.
Performances et sécurités
Comme toutes vos données vont être stockées de manière chiffrée sur le disque dur, votre machine va devoir faire le chiffrement et le déchiffrement à la volée dès que vous devrez accéder à ces données. Ces calculs ont un coût sur les performances générales de votre machine, mais relativement peu important pour les machines récentes.
Cryptsetup est fourni avec un utilitaire de calcul des performances en fonction de chaque possibilité de chiffrement.
Il s'utilise directement en ligne de commande : cryptsetup benchmark
.
Les résultats suivants sont obtenus sur un PC portable avec un processeur i5 :
PBKDF2-sha1 404543 iterations per second
PBKDF2-sha256 242725 iterations per second
PBKDF2-sha512 159067 iterations per second
PBKDF2-ripemd160 352344 iterations per second
PBKDF2-whirlpool 196215 iterations per second
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 543,0 MiB/s 1869,0 MiB/s
serpent-cbc 128b 68,7 MiB/s 263,9 MiB/s
twofish-cbc 128b 149,0 MiB/s 279,0 MiB/s
aes-cbc 256b 382,5 MiB/s 1287,0 MiB/s
serpent-cbc 256b 64,2 MiB/s 257,0 MiB/s
twofish-cbc 256b 150,4 MiB/s 273,0 MiB/s
aes-xts 256b 1559,0 MiB/s 1447,0 MiB/s
serpent-xts 256b 272,0 MiB/s 257,0 MiB/s
twofish-xts 256b 278,0 MiB/s 273,0 MiB/s
aes-xts 512b 1092,0 MiB/s 1265,0 MiB/s
serpent-xts 512b 277,0 MiB/s 262,0 MiB/s
twofish-xts 512b 270,0 MiB/s 278,0 MiB/s
On remarque bien que plus la sécurité est importante, plus l'algorithme de chiffrement est long et donc moins les performances sont bonnes. Il faut donc trouver un compromis entre sécurité et vitesse. On note aussi que AES profite à plein des extensions AES intégrées aux processeurs Intel, en étant presque 4× plus performants que les autres.
Pour un usage courant mais tout de même sécurisé, on peut donc choisir un chiffrement en aes-xts-256 + sha-256 sans trop ralentir les performances globales. Si vous avez réellement des données critiques, vous pouvez monter jusqu'à du aes-xts-512 + sha-512.
Utilisation
À l'installation
L'idéal pour chiffrer son disque dur est de le faire dès la phase d'installation de votre système GNU/Linux. La plupart des distributions courantes propose cette option.
Le plus simple (et le plus sécurisé) est de tout chiffrer, sauf ce qui ne peut pas l'être (à savoir votre partition de boot). En particulier, il est important de chiffrer l'espace d'échange (swap) si vous voulez pouvoir mettre votre machine en hibernation sur disque sans exposer vos données en clair.
Si vous souhaitez chiffrer l'intégralité de votre disque dès l'installation, un tutoriel est disponible ici.
En ligne de commande
Pour voir comment fonctionne réellement LUKS sans passer par des boîtes de dialoge et du clicodrôme,
LUKS peut être utilisé directement en ligne de commande pour créer un conteneur chiffré.
Pour installer cryptsetup sous Debian, un simple apt-get install cryptsetup
suffit.
Pour cette démonstration, on va utiliser un simple fichier crypt stocké sur le disque comme conteneur, mais on peut parfaitement utiliser le même procédé pour chiffrer une partition ou une clef USB. La création du fichier se fait via
# fallocate -l 1G crypt
On obtient ainsi un joli fichier de 1Go rempli de 0, comme le montre hexdump
# hexdump crypt
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
40000000
Par mesure de sécurité, on remplit tout ça avec des données bien aléatoires. Cette phase est nécessaire pour qu'un attaquant ne puisse pas faire la différence entre les données chiffrées et l'espace vierge du conteneur. Après chiffrement, l'intégralité du conteneur ne sera plus qu'un tas de bits totalement aléatoires, au lieu de laisser transparaître des 0 sur les zones inutilisées, ce qui pourrait donner des informations sur la taille des données stockées.
# dd if=/dev/urandom of=crypt bs=1M count=1024 iflag=fullblock
1024+0 enregistrements lus
1024+0 enregistrements écrits
1073741824 octets (1,1 GB) copiés, 64,9798 s, 16,5 MB/s
# hexdump crypt
0000000 8310 a23a 83dc f3fd d5a2 d71c 7218 cd66
0000010 e161 16f9 d2bd a8b8 a87f 9437 c829 16dd
… juste un gros tas de trucs bien aléatoires …
3fffffe0 d43f 3190 0840 16b2 ce96 bdc0 6c86 68f9
3ffffff0 7ed0 1a78 29e1 3eaf 836f e498 acc3 ab9f
40000000
Cette partie peut-être particulièrement longue sur de gros disques durs (comptez une bonne journée pour un disque de 500Go). Certains ont trouvé des techniques pour accélérer l'effacement.
Ensuite, la mise-en-place du chiffrement proprement dit :
# cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 256 --hash sha256 --verify-passphrase crypt
WARNING!
========
Cette action écrasera définitivement les données sur crypt.
Are you sure? (Type uppercase yes): YES
Saisissez la phrase secrète :
Verify passphrase:
Opération réussie.
Un conteneur LUKS ne permet pas le déni plausible. En effet, on peut savoir immédiatement si un fichier ou un disque est un conteneur LUKS ou non :
# file crypt
crypt: LUKS encrypted file, ver 1 [aes, xts-plain64, sha256]
# cryptsetup luksDump crypt
LUKS header information for crypt
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha256
Payload offset: 4096
MK bits: 256
Comme d'habitude, la phrase de passe choisie doit être robuste et restée secrète.
Si vous voulez encore plus de sécurité, vous pouvez tout passer en 512 bits :
# cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 512 --hash sha512 --verify-passphrase crypt
Il suffit ensuite d'ouvrir le conteneur, de le formater convenablement et de le monter comme un disque classique :
# cryptsetup luksOpen crypt crypt
Saisissez la phrase secrète pour crypt :
# mkfs.ext4 /dev/mapper/crypt
# mkdir /mnt/crypt
# mount /dev/mapper/crypt /mnt/crypt
# ls /mnt/crypt
lost+found/
Quand on a fini, on démonte et on referme le tout :
# umount /mnt/crypt
# cryptsetup luksClose crypt
Un conteneur LUKS peut aussi être protégé par un fichier de clef, qu'on mettra à l'abris sur une clef USB et/ou chiffrée par GPG. Un fichier de clef est plus sûr qu'une phrase de passe, sous réserve de ne pas l'égarer, étant donné qu'il faut y avoir accès physiquement (authentification forte).
# dd if=/dev/urandom bs=512 count=1 iflag=fullblock | \
gpg --armor --encrypt --hidden-recipient A739893A > keyfile
# gpg --armor --decrypt keyfile | \
cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 512 --hash sha512 --key-file=- crypt
# gpg --armor --decrypt keyfile | cryptsetup luksOpen --key-file=- crypt crypt
Pour finir, on peut ajouter jusqu'à 8 phrases de passe ou fichiers de clef pour déverrouiller un conteneur :
# cryptsetup luksAddKey --verify-passphrase crypt
# cryptsetup luksAddKey crypt newkeyfile
Malheureusement, LUKS nécessite les droits root pour être utilisé. Cet outil est donc à réserver pour un usage sédentaire (ordinateur ou portable personnel). Pour un usage plus mobile (en déplacement, sur des machines tierces…), il vaut mieux se tourner vers TrueCrypt qui fonctionne avec les droits d'un simple utilisateur.