Crypto.me
$ apt-get install security privacy anonymity

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.