Niveau :      
Résumé : dm-crypt ; cryptsetup

Maintenant que vous savez tout sur device mapper, il y a une dernière fonctionnalité fournie en standard que vous allez vouloir utiliser: le chiffrement des partitions. Comme vous l'avez compris, il est possible de tout faire avec dmsetup, mais il y a mieux et c'est moins cher.

Chiffrement avec LUKS

Attention, ce que nous faisons ici écrit sur la partition, si vous ne voulez pas perdre vos données, regardez le dernier paragraphe.

La commande cryptsetup s'occupe de tout pour vous. Pour chiffrer une partition :

# pour préserver la résistance de votre partition à la cryptanalyse (des données apparemment chiffrées déjà sur le disque)
# on efface la partition avec des données aléatoires
$ dd if=/dev/urandom of=/dev/sda1
# il vous demandera simplement une passphrase
$ cryptsetup luksFormat /dev/sda1

Et maintenant pour l'utiliser :

# il vous demandera simplement une passphrase
$ cryptsetup luksOpen /dev/sda1 partoche

Et voila, votre partition est disponible dans /dev/mapper/partoche. Vous pouvez en faire ce que vous voulez, mettre une système de fichier dessus ou le redécouper avec lvm ou écrire directement dessus ...

Et si vous ne voulez plus utiliser la partition, fermez-là (la partition) pour ne pas qu'un autre tente d'en lire le contenu, on ne sait jamais :

$ cryptsetup luksClose partoche

Un peu plus loin

Cryptsetup permet d'autres formats de disque que LUKS, mais il n'est pas intéressant de les utiliser car luks est disponible un peu partout (même sous windows) et bien pensé

Luks permet entre autre quelques fantaisies comme la possibilité d'utiliser plusieurs clés, ce qui veut dire que vous pouvez partager un disque dur chiffré entre plusieurs personnes et que chacun ait sa clé pour lire et écrire dessus.

# ajoute une nouvelle clé (nouvel utilisateur ?)
$ cryptsetup luksAddKey /dev/sda1

Et donc vous pouvez révoquer une clé pour interdire à un des participants d'y revenir :

# liste les clés
$ cryptsetup luksDump /dev/sda1
# on en révoque une 
$ cryptsetup luksDelKey /dev/sda1 1

Attention si un des utilisateurs a eu accès aux méta-données de la partition, il a très bien pu les enregistrer, et comme il a du garder sa propre clé, il est dans ce cas toujours capable d'utiliser le disque.

Un autre usage des clés multiples est d'avoir une clé d'usage et une clé de secours imprimée et stockée dans un coffre pour usage en cas de perte de la première.

Types de chiffrement

Vous pouvez choisir le type de chiffrement utilisé au moment de la création de la partition. Par exemple si vous ne faites pas confiance au NIST, vous pourriez préférer la méthode twofish.

# connaître la liste des chiffrements disponibles (attention, tous ne sont pas des chiffrement)
$ cat /proc/crypto
# charger un type manquant
$ modprobe twofish
# utiliser le bon type
$ cryptsetup luksFormat --cipher twofish /dev/sda1

Encore plus loin

Il est même possible de chiffrer une partition sur elle même sans casser ce qui se trouve dessus. Seul problème, il faut qu'elle dispose d'un peu de place pour les en-têtes luks. Cette taille est variable, en fonction de la taille choisie pour la clé. Mais elle est de l'ordre de 500 ko avec les essiv, si besoin faites un test préalable.

Supposons qu'il y a un système de fichier (fort probable :)

# on démonte
$ umount /dev/sda1
# on réduit de 1Mo (ça devrait suffire dans la plupart des cas)
$ resize2fs /dev/sda1 9999M

On stocke dans un coin l'endroit ou sera notre en-tête

# 1Mo aussi 
$ dd if=/dev/sda1 of=/tmp/first bs=1M count=1

On fait notre partition chiffrée

# on prépare la partition
$ cryptsetup luksFormat /dev/sda1
# on la met en place
$ cryptsetup luksOpen /dev/sda1 crypto1

Et là, il y a plusieurs subtilités, on va recopier /dev/sda1 dans /dev/mapper/tmp. Ça fonctionne parce que ce qu'on va lire va être lu avant qu'on écrive au même endroit. Cet argument n'est pas tout à fait valable puisqu'on va recopier un peu plus loin qu'on ne va lire (header oblige). Donc la deuxième subtilité sera de recopier en commençant par la fin pour ne pas écraser les données qu'on va lire à la prochaine itération.

# on récupère le décalage a effectuer (unité le bloc (512o)
$ cryptsetup luksDump /dev/sda1 | grep Payload
> Payload offset: 1032
$ offset=$((1032*512))
# on récupère la taille de la partition : 
$ blockdev --getsize64 /dev/sa1
> 67108864
$ max=67108864

# et on fait la copie morceaux par morceaux en partant de la fin
$ i=$(($max/$offset))
$ while [ $i -gt 0 ]
 do
     dd if=/dev/sda1 of=/dev/mapper/crypto1 bs=$offset count=1 seek=$i skip=$i
     i=$(($i-1))
 done
# et on n'oublie pas notre premier morceau
$ dd if=/tmp/first of=/dev/mapper/crypto1

Ça y est, notre partition chiffrée /dev/mapper/crypto1 est prête à être utilisée comme avant

$ mount /dev/mapper/crypto1 /srv

Encore une victoire de canard !

Et pour plus de détails, le site sur dm-crypt et sur luks vous expliquera tout.