~rom1v/blog { un blog libre }

Chiffrer un disque dur externe (ou une clé USB) avec LUKS

Un disque dur externe contenant vos données n’a pas de raisons de ne pas être chiffré. Voici quelques commandes utiles pour l’utilisation de LUKS.

Prérequis

Le paquet cryptsetup doit être installé :

sudo apt-get install cryptsetup

Initialisation

Trouver le disque

Tout d’abord, il faut déterminer l’emplacement du disque dur dans /dev. Pour cela, avant de le brancher, exécuter la commande :

sudo tail -f /var/log/messages

Lors du branchement du disque, plusieurs lignes similaires à celles-ci doivent apparaître :

Jul 20 21:25:29 pc kernel: [  678.139988] sd 7:0:0:0: [sdb] 976754645 4096-byte logical blocks: (4.00 TB/3.63 TiB)

Ici, [sdb] signifie que l’emplacement est /dev/sdb. Dans la suite, je noterai cet emplacement /dev/XXX.

Il est très important de ne pas se tromper d’emplacement, afin de ne pas formater un autre disque…

Effacer le disque

Si des données étaient présentes sur ce disque, il est plus sûr de tout supprimer physiquement :

sudo dd if=/dev/zero of=/dev/XXX bs=4K

Cette commande peut prendre beaucoup de temps, puisqu’elle consiste à réécrire physiquement tous les octets du disque dur.

Créer la partition chiffrée

Pour initialiser la partition chiffrée :

sudo cryptsetup luksFormat -h sha256 /dev/XXX

La passphrase de déchiffrement sera demandée.

Maintenant que nous avons une partition chiffrée, ouvrons-la :

sudo cryptsetup luksOpen /dev/XXX lenomquevousvoulez

Cette commande crée un nouveau device dans /dev/mapper/lenomquevousvoulez, contenant la version déchiffrée (en direct).

Formater

Pour formater cette partition en ext4 :

sudo mkfs.ext4 /dev/mapper/lenomquevousvoulez -L unlabel

Pour l’initialisation, c’est fini, nous pouvons fermer la vue déchiffrée :

sudo cryptsetup luksClose lenomquevousvoulez

Montage manuel

Il est possible de déchiffrer et monter la partition manuellement en ligne de commande :

sudo cryptsetup luksOpen /dev/XXX lenomquevousvoulez
sudo mkdir -p /media/mydisk
sudo mount -t ext4 /dev/mapper/lenomquevousvoulez /media/mydisk

Le contenu est alors accessible dans /media/mydisk.

Pour démonter et fermer, c’est le contraire :

sudo umount /media/mydisk
sudo cryptsetup luksClose /dev/XXX lenomquevousvoulez

Mais c’est un peu fastidieux. Et je n’ai pas trouvé de solution pour permettre le luksOpen par un utilisateur (non-root) en ligne de commande.

Montage semi-automatique

Les environnement de bureau permettent parfois de monter un disque dur chiffré simplement, avec la demande de la passphrase lors de l’ouverture du disque. Voici ce que j’obtiens avec XFCE :

luksOpen

Mais par défaut, le nom du point de montage est peu pratique : /media/rom/ae74bc79-9efe-4325-8b4d-63d1506fa928. Heureusement, il est possible de le changer. Pour cela, il faut déterminer le nom de la partition déchiffrée :

$ ls /dev/mapper/luks-*
/dev/mapper/luks-8b927433-4d4f-4636-8a76-06d18c09723e

Le nom très long correspond en fait à l’UUID du disque, qui peut aussi être récupéré grâce à :

sudo cryptsetup luksUUID /dev/XXX

ou encore :

sudo blkid /dev/XXX

L’emplacement désiré, ainsi que les options qui-vont-bien, doivent être rajoutés dans /etc/fstab :

/dev/mapper/luks-8b927433-4d4f-4636-8a76-06d18c09723e /media/mydisk ext4 user,noauto

Ainsi, le disque sera désormais monté dans /media/mydisk.

Si en plus, nous souhaitons spécifier un nom user-friendly pour la partition déchiffrée (celui dans /dev/mapper/), il faut ajouter une ligne dans /etc/crypttab (en adaptant l’UUID) :

mydisk UUID=8b927433-4d4f-4636-8a76-06d18c09723e none luks,noauto

Et utiliser celle-ci à la place dans /etc/fstab :

/dev/mapper/mydisk /media/mydisk ext4 user,noauto

Gestion des passphrases

Il est possible d’utiliser plusieurs passphrases (jusqu’à 8) pour déchiffrer le même disque.

Pour en ajouter une :

sudo cryptsetup luksAddKey /dev/XXX

Pour en supprimer une :

sudo cryptsetup luksRemoveKey /dev/XXX

Pour changer une unique passphrase, il suffit d’en ajouter une nouvelle puis de supprimer l’ancienne.

Ou alors d’utiliser :

sudo cryptsetup luksChangeKey /dev/XXX

mais man cryptsetup dit qu’il y a un risque.

État

Pour consulter l’état d’une partition LUKS :

sudo cryptsetup luksDump /dev/XXX

Gestion de l’en-tête

L’en-tête LUKS est écrit au début du disque. L’écraser empêche définivement le déchiffrement de la partition.

Il est possible d’en faire une sauvegarde dans un fichier :

cryptsetup luksHeaderBackup /dev/XXX --header-backup-file fichier

Et de les restaurer :

cryptsetup luksHeaderRestore /dev/XXX --header-backup-file fichier

Pour supprimer l’en-tête (et donc rendre les données définitivement inaccessibles s’il n’y a pas de backup) :

cryptsetup luksErase /dev/XXX

Conclusion

Une fois configuré la première fois, et après les quelques modifications pénibles pour choisir les noms pour le déchiffrement et le montage, l’utilisation au quotidien est vraiment très simple : il suffit de rentrer la passphrase directement à partir du navigateur de fichiers.

Commentaires

nicolas

Merci beaucoup

cela m’interesse vivement, j’ai cependant une question, j’utilise quotidiennement un logiciel pour synchroniser ma clef usb et certains dossiers sur mon disque dur, j’utilise synkron, est-il toujours possible de réaliser la synchronisation si la clef et les dossiers sur le disque dur sont chiffrés?

merci pour ta réponse. Cordialement

Snipe2004

Très intéressant, mais quid d’un branchement sur un PC Windows ? Mac accessoirement ? Le disque est-il lisible, déchiffrable?

®om

@nicolas

est-il toujours possible de réaliser la synchronisation si la clef et les dossiers sur le disque dur sont chiffrés?

Une fois déchiffré et monté dans un dossier (/media/mydisk ici), pour l’outil de synchronisation, tout se passe comme si le disque n’était pas chiffré.

@Snipe2004

Très intéressant, mais quid d’un branchement sur un PC Windows ? Mac accessoirement ? Le disque est-il lisible, déchiffrable?

Win-quoi ? MAC, comme l’adresse ? ;-)

Wikipedia dit qu’il y a des implémentations.

Mais je ne suis définitivement pas la bonne personne pour renseigner sur Windows ou MAC (le jour où j’utilise ça, c’est qu’il y a un gros problème).

Snipe2004

Oui, moi aussi, mais parfois mes données voyagent vers des gens moins exigeants que moi ^^ Merci cependant !

Et je n’ai pas trouvé de solution pour permettre le luksOpen par un utilisateur (non-root)

Pourquoi ne pas retenir Cryptkeeper, plus simple d’utilisation, ce qui est pratique avec une clé usb et pour qu’il puisse être utiliser sans les droits root :

adduser votre_user fuse

Accessoirement on peut l’utiliser avec Windows

http://blog-libre.org/post/2014/04/01/cryptkeeper-encfs-chiffrer-linux-windows-interface-graphique

®om

@cep

Pourquoi ne pas retenir Cryptkeeper, plus simple d’utilisation

Ici, dm-crypt effectue le chiffrement directement au niveau des blocs.

Visiblement, CryptKeeper est une interface pour encfs, qui effectue un chiffrement en espace utilisateur au-dessus du système de fichiers. C’est très pratique, mais les performances s’en ressentent.

Et il y a des effets de bord sur les stats des fichiers : il me semble qu’un rsync vers un répertoire chiffré avec encfs considère que tous les fichiers ont changé (pour l’éviter, il faut utiliser l’option -c, qui rend le processus beaucoup plus long car il calcule le checksum de chaque fichier).

Autre argument : une fois configuré, LUKS est très bien intégré au système, sans logiciel supplémentaire.

Oui, je suis tout à fait d’accord sur l’ensemble si l’on recherche avant tout la performance et, probablement, une meilleure sécurité.

En outre encfs a été retiré des dépôts Debian Jessie en raison de bugs non corrigés.

Cryptkeeper s’impose essentiellement pour son utilisation simple et la possibilité de l’utiliser avec windows.

Macaque

Sous gnome (en tout cas avec archlinux), on peut utiliser l’utilitaire graphique “Disques”.

Et avec le gnome-keyring on peut sauvegarder la passphrase pour que le montage soit complètement automatique sur ce poste.

Cascador

Hello,

Concernant “je n’ai pas trouvé de solution pour permettre le luksOpen par un utilisateur (non-root) en ligne de commande” : Tu ne veux pas le mettre dans /etc/sudoers (en passant par sudo visudo évidemment) ?

Concernant la ligne

sudo dd if=/dev/zero of=/dev/XXX bs=4k

tu peux remplacer bs=4k par bs=4M, ça ira plus vite.

®om

@Cascador

Tu ne veux pas le mettre dans /etc/sudoers ?

Je n’édite jamais ce fichier. Qu’écrirais-tu ?

Sinon, un script avec le bit setuid devrait fonctionner aussi.

Mais j’aimerais plutôt savoir comment fait Thunar pour monter le disque sans être root (et sans modifier sudoers), pour faire la même chose en ligne de commande.

@Cascador

tu peux remplacer bs=4k par bs=4M, ça ira plus vite.

En fait, je pense que non (j’ai remplacé 4k (4000) par 4K (4096)) :

$ time dd if=/dev/zero of=test bs=4K count=200000
200000+0 enregistrements lus
200000+0 enregistrements écrits
819200000 octets (819 MB) copiés, 13,1437 s, 62,3 MB/s

real    0m13.291s
user    0m0.024s
sys 0m0.992s

time dd if=/dev/zero of=test bs=4M count=200
200+0 enregistrements lus
200+0 enregistrements écrits
838860800 octets (839 MB) copiés, 13,054 s, 64,3 MB/s

real    0m13.232s
user    0m0.000s
sys 0m1.024s

Par contre, 4K, c’est mieux qu’une valeur inférieure :

$ time dd if=/dev/zero of=test bs=1K count=800000
800000+0 enregistrements lus
800000+0 enregistrements écrits
819200000 octets (819 MB) copiés, 13,7981 s, 59,4 MB/s

real    0m13.966s
user    0m0.052s
sys 0m1.820s

Sur mon système, si je regarde la valeur de _SC_PAGESIZE :

#include <stdio.h>
#include <unistd.h> /* sysconf(3) */

int main(void) {
    printf("The page size for this system is %ld bytes.\n",
           sysconf(_SC_PAGESIZE)); /* _SC_PAGE_SIZE is OK too. */
    return 0;
}

J’obtiens :

The page size for this system is 4096 bytes.

Ça change peut-être quelque chose sur d’autres architectures…

Cascador

La valeur de bs dépend de plusieurs facteurs dont ton disque dur (ou SSD), le noyau, la distribution etc.

Le meilleur moyen de connaître la valeur idéale est de faire des benchmarks bref intérêt limité mais si tu as 2 mn, testes avec des valeurs comme 2M et 4M pour voir.

Concernant le fichier /etc/sudoers, il s’édite avec sudo visudo mais si tu n’as pas l’habitude de faire des modifications dans ce fichier, je préfère éviter de donner des commandes à l’arrache car c’est un des fichiers les plus sensibles du système.

Un bon point de départ : http://ilostmynotes.blogspot.fr/2011/05/howto-mount-remote-luks-encrypted.html

Tu devrais effacer le disque après avoir fait le chiffrement plutôt que avant, de cette façon la totalité du disque à l’air de contenir des données aléatoires.

Avec ta solution, il possible de trouver les secteurs utilisés (même si ils reste chiffrés) et donc d’avoir une idée de la quantité de donnée.

Tout ça expliqué mieux que moi dans la FAQ de cryptsetup :-)

®om

@APLU Merci, la FAQ de cryptsetup est très intéressante. Je vais continuer de la lire.

En fait, je viens de comprendre que ça résout deux problèmes différents.

Dans la section 5.3, ils disent :

If you just create a filesystem on it, most of the old data will still be there. If the old data is sensitive, you should overwrite it before encrypting.

Pour protéger les anciennes données (en les supprimant), il faut écraser avant le chiffrement.

In any case, not initializing will leave the old data there until the specific sector gets written. That may enable an attacker to determine how much and where on the partition data was written. If you think this is a risk, you can prevent this by overwriting the encrypted device (here assumed to be named “e1”) with zeros…

Et pour protéger les futures données (ou au moins quelques informations, comme leur taille), il faut écraser après le chiffrement.

Ou alors, écrire /dev/urandom sur la partition non-chiffrée ?

Là où il peut y avoir un risque aussi (mais qu’on écrase avant ou après le chiffrement), c’est avec la gestion des secteurs défectueux (qui ne seront pas réécrits), ou pire les SSD qui écrivent où ils veulent.

Xanatos

Bonjour,

article intéressant et détaillé, je me demandais la chose suivante: quid de la cohabitation d’une partition chiffrée avec LUKS et d’autres systèmes de fichiers ? Il y a une méthodologie particulière à appliquer ?

®om

@Xanatos LUKS/cryptsetup et les systèmes de fichiers sont deux choses différentes.

LUKS te permet d’avoir une partition /dev/mapper/quelquechose qui se comporte comme une partition “normale” (non chiffrée), sauf que physiquement elle sera chiffrée. Dans celle-ci, tu mets le système de fichiers que tu veux.

true

Pourquoi ne pas, simplement, utiliser Truecrypt?

FrankiBoy

Merci pour ce tuto clair et concis !!! :D

les données sont chiffrés et si jamais je paume cette clé USB, le premier couillon venu (Windowsien donc) pourra pas lire les trucs qui sont dessus. Parfait !!!

Et pardessus le marché, Windows lui proposera d’office de formater la clé car EXT4, elle est pas belle la vie ? :-p

Les commentaires sont fermés.