Stockage crypté avec LUKS, RAID et LVM2

Gazette Linux n°140 — Juillet 2007

René Pfeiffer

Adaptation française : Nicolas Provost

Relecture de la version française: Deny

Article paru dans le n°140 de la Gazette Linux de juillet 2007.

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Créer des périphériques RAID
Crypter des périphériques par blocs
Déverrouiller des périphériques par blocs
Regrouper des périphériques par blocs dans un volume logique
Monter et démonter des périphériques cryptés
Important : tester
Liens utiles

Dans certains cas, il est nécessaire de stocker des données de manière sécurisée. Parfois cela ne signifie pas seulement utiliser des disques redondants (et avoir une bonne politique de sauvegarde), mais aussi crypter les données. Par chance, le noyau Linux offre toutes les caractéristiques permettant d'utiliser des périphériques en RAID (Redundant Array of Inexpensive Disks, ou « matrice redondante de disques pas chers »), de les grouper en un volume logique et de crypter chaque bloc du système de fichiers. Evidemment, il ne faut pas oublier la phrase d'authentification !

Créer des périphériques RAID

La première étape concerne la création d'un périphérique Linux de type RAID logiciel. Pour simplifier, nous nous limiterons au RAID de niveau 1, c'est à dire la copie en miroir de deux disques ou de deux partitions. Le RAID de niveau 1 peut être obtenu à partir de deux (ou plus) parties d'un périphérique par blocs (block device) ayant la même taille. Habituellement, on configure ces partitions lors de l'installation du système. Les installateurs de la plupart des distributions GNU/Linux disposent d'un éditeur vous permettant de réaliser cela. Considérant que nous disposons déjà d'une installation, nous allons configurer quatre partitions formant deux périphériques RAID de niveau 1. Il sera simplement nécessaire d'éditer la table des partitions. Personnellement, j'utilise l'outil cfdisk pour cela.


osiris:~# cfdisk /dev/sdc

Préparez vos partitions et marquez les avec le code système FD. Ce code marque les partitions comme partitions Linux Raid Autodetect (partitions de type RAID à détection automatique) et permet au système de les activer au démarrage. Souvenez-vous que toutes ces partitions doivent en principe être de même taille.


osiris:~# cfdisk /dev/sdd

J'ai choisi /dev/sdc1 et /dev/sdd1. Créons maintenant le périphérique RAID à l'aide de l'outil mdadm.


osiris:~# mdadm --create /dev/md6 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1

Une fois cette ligne validée, le noyau crée le périphérique et commence à synchroniser les blocs. Vous pouvez contrôler l'état d'avancement de cette opération en listant /proc/mdstat. Ce fichier vous donne l'état de tous les périphériques RAID du système.


osiris:~# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sdb2[1] sda2[0]
      3903680 blocks [2/2] [UU]
      
md5 : active raid1 sdb3[1] sda3[0]
      4883648 blocks [2/2] [UU]
      
md2 : active raid1 sdb5[1] sda5[0]
      1951744 blocks [2/2] [UU]
      
md4 : active raid1 sdb7[1] sda7[0]
      297435328 blocks [2/2] [UU]
      
md6 : active raid1 sdd1[1] sdc1[0]
      488383936 blocks [2/2] [UU]
      
md0 : active raid1 sdb1[1] sda1[0]
      489856 blocks [2/2] [UU]
      
unused devices: 
osiris:~#

Si vous voyez quelque chose de ressemblant, alors les périphériques RAID sont dans un état cohérent. Le paquet mdadm fournit des utilitaires pour la surveillance de l'état des périphériques RAID. C'est très utile car sinon vous pourriez ne pas vous apercevoir que vos disques ou périphériques RAID sont défectueux.

Puis créez un autre périphérique RAID. J'utilise /dev/md4 sur la copie écran ci-dessus comme deuxième périphérique destiné à être inclu dans notre volume logique crypté.

Crypter des périphériques par blocs

Pour activer le cryptage de données, j'ai choisi l'outil cryptsetup. Avant d'utiliser un périphérique par blocs comme espace de stockage crypté, il est recommandé d'y écrire des motifs de bits aléatoires. La façon la plus simple de procéder est d'utiliser la commande dd.


osiris:~# dd if=/dev/urandom of=/dev/md4
osiris:~# dd if=/dev/urandom of=/dev/md6

Selon votre configuration matérielle, ces opérations peuvent prendre plusieurs heures. Prenez garde de ne pas utiliser /dev/random, sinon ces opérations dureront plusieurs jours ou semaines. Cette étape n'est pas obligatoire. Cependant, si vous laissez un motif identifiable sur votre périphérique, il est plus facile de repérer les blocs cryptés, et donc de focaliser les attaques visant à les décrypter sur ceux-ci.

Une fois que des données aléatoires ont été écrites sur vos disques, vous pouvez les crypter.

osiris:~# cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/md4
osiris:~# cryptsetup -c aes-cbc-essiv:sha256 -y -s 256 luksFormat /dev/md6

Faites bien attention de ne pas perdre votre phrase d'authentification ! Si vous l'oubliez, vos données seront assurement sécurisées et impossible à retrouver. Gardez à l'esprit que crypter des données et se débarrasser des clés de cryptage est la méthode industrielle courante pour détruire des données (si bien entendu de meilleurs méthodes de cryptage que ROT13 ou XOR sont utilisées). Nos périphériques par blocs sont maintenant prêts pour le cryptage.

Les commandes précédentes configurent les périphériques pour utiliser l'algorithme AES. La longueur de la clef est 256 bits, et nous utilisons une méthode appelée ESSIV ou encore E(Sector|Salt) *  pour éviter des failles lors du choix des valeurs initiales de l'algorithme de cryptage.

* [Note du traducteur] Ce qui signifie cryptage de blocs du type (données+sel) où « sel » (salt) désigne une suite de bits choisie pour une session de cryptage, que l'on agrège aux données pour « pimenter » (ou « saler », au choix) le cryptage afin de le rendre encore plus sûr.

Déverrouiller des périphériques par blocs

Chaque fois que vous souhaitez accéder à des périphériques par blocs cryptés vous devez les déverrouiller. Ce déverrouillage peut également être réalisé avec cryptsetup.

osiris:~# cryptsetup luksOpen /dev/md4 crypt1
osiris:~# cryptsetup luksOpen /dev/md6 crypt2

La phrase d'authentification va vous être demandée. Après déverrouillage, on peut accéder aux périphériques en utilisant /dev/mapper/crypt1 et /dev/mapper/crypt2. Remarquez que nous n'utilisons plus les périphériques RAID directement. Nous accédons à l'espace de stockage via une couche de cryptage. Les données contenues dans les blocs du périphérique RAID sont cryptées.

Regrouper des périphériques par blocs dans un volume logique

Le gestionnaire de volumes logiques (LVM) est un outil pour regrouper plusieurs périphériques physiques par blocs en groupes de volumes, et pour créer des volumes logiques parmi eux. Un guide pratique (« HOWTO ») est disponible pour LVM2, dans lequel tout est expliqué en détails. Il est simplement nécessaire de savoir comment les espaces de stockage sont organisés. La hiérarchie est la suivante :

  1. Espaces physiques (périphériques par blocs, partitions)

  2. Groupes de volumes (constitués d'espaces physiques)

  3. Volumes logiques (combinant des parties de groupes de volumes)

Les périphériques RAID correspondent à la plus basse couche de LVM2. Nous devons encore créer les espaces physiques, les assigner à des groupes de volumes et créer un volume logique. Un système de fichiers est uniquement affecté à un volume logique. La figure suivante montre comment les différentes couches du système de stockage sont organisées.

Marquons donc nos périphériques cryptés RAID1 comme espaces physiques et créons un groupe de volumes.


osiris:~# pvcreate /dev/mapper/crypt1
osiris:~# pvcreate /dev/mapper/crypt2
osiris:~# vgcreate -v cryptvg /dev/mapper/crypt1 /dev/mapper/crypt2

Les commandes vgscan et vgdisplay vous montrent le résultat des commandes ci-dessus. vgdisplay est particulièrement utile puisqu'elle vous donne le nombre d'espaces physiques disponibles dans un groupe de volumes. Nous souhaitons maintenant utiliser tout le groupe de volumes cryptvg en tant que volume logique. Pour cela nous précisons à lvcreate l'étendue à utiliser.


osiris:~# lvcreate -l 191849 -n backuplv cryptvg

On peut à présent accéder à notre nouveau volume logique en utilisant le fichier de périphérique /dev/backup/backuplv. Nous formatons ce périphérique avec un système de fichiers XFS (bien entendu vous pouvez utiliser le système de fichiers de votre choix, XFS est simplement un exemple).


osiris:~# mkfs.xfs -d agcount=48 -L backup /dev/backup/backuplv

Nous pouvons dés lors monter ce volume et l'utiliser à notre guise. N'oubliez pas d'ajouter une entrée dans votre fichier /etc/fstab pour que les options de montage soient correctes. Une configuration possible pourrait être :

/dev/backup/backuplv /backup xfs ikeep,noatime 0 0

Monter et démonter des périphériques cryptés

Il y a plusieurs étapes à respecter pour activer et désactiver votre nouveau volume crypté. Le noyau Linux prend en charge la plupart des opérations (comme l'autodétection des périphériques RAID et leur démarrage). D'autres opérations ne peuvent pas être prises en charge automatiquement. Un simple script fera le nécessaire :

#!/bin/sh

echo "Déverrouillage de /dev/md4"
cryptsetup luksOpen /dev/md4 crypt1
echo "Déverrouillage de /dev/md6"
cryptsetup luksOpen /dev/md6 crypt2
echo "Recherche des groupes de volumes"
vgscan --mknodes
vgchange -ay
echo "Montage de /backup"
mount /backup

cryptsetup vous demandera votre (vos) phrase(s) d'authentification (une par périphérique RAID). La séquence d'extinction se présente dans l'ordre inverse :

#!/bin/sh

umount /backup
lvremove backuplv
vgremove cryptvg
cryptsetup remove crypt1
cryptsetup remove crypt2

La plupart des distributions GNU/Linux incluent des scripts qui prennent en charge les séquences de démarrage et d'extinction. Néanmoins il est bon de connaître comment cela se déroule (ne serait-ce que pour le cas où le système n'est plus disponible).

Important : tester

Maintenant que votre tout nouveau volume crypté est vide, vous avez pour une fois dans votre vie la chance de pouvoir tester le mécanisme de stockage. Ne ratez pas cette occasion ! Simulez une panne de disque. Coupez le courant et redémarrez. Lancez un contrôle du système de fichiers. Créez des milliers de fichiers puis détruisez-les. Copiez un tas de grosses images ISO. Essayez de faire tout ce que doit supporter votre système de fichiers et regardez si les données persistent. La commande XFS mkfs a une option -p qui vous permet de remplir un nouveau système de fichiers XFS avec des fichiers et répertoires en suivant une répartition prédéfinie. C'est une option très utile à des fins de test. Une fois que votre batterie de tests est achevée de manière satisfaisante, installez vos véritables données sur le système de fichiers. Et conservez toujours des sauvegardes.

Liens utiles

René Pfeiffer est né l'année de la fondation d'Atari® et de la sortie du jeu Pong. Depuis tout petit, il a toujours cherché à démonter les objets pour savoir comment ils marchaient. A tel point qu'il ne pouvait pas passer devant un chantier sans regarder si les câbles électriques pouvaient être intéressants. Son intérêt pour l'informatique remonte à l'époque où son grand-père lui offrit un micro-ordinateur 4 bits avec 256 octets de mémoire vive et un système d'exploitation occupant 4 096 octets, l'obligeant ainsi à apprendre l'assembleur avant tout autre langage.

Après ses études secondaires, il entra à l'Université pour y étudier la physique. Il put ainsi mener des expériences avec un C64 et un C128, deux Amiga®, DEC® Ultrix, OpenVMS et finalement GNU/Linux sur un PC en 1997. Il utilise Linux depuis ce jour et aime toujours autant démonter et remonter les choses. Son amour de la liberté de pensée le rapprocha du mouvement pour le Logiciel Libre où il s'investit afin de promouvoir le droit à comprendre comment les logiciels fonctionnent. Il est également actif au sein de groupements pour la liberté civile, oeuvrant notamment dans le domaine des droits numériques.

Depuis 1999, il offre ses compétences en freelance. Ses activités principales sont l'administration système et réseaux, la programmation et le conseil. En 2001, il commença une série de conférences sur la sécurité au Technikum de Vienne. En dehors du travail sur écran, de la maintenance du matériel et de la configuration des équipements réseaux, il est passionné de plongée sous-marine, de littérature et de photographie numérique. Il espère également pouvoir de nouveau conter des histoires ou jouer à des jeux de rôles dés qu'il aura un peu plus de loisirs.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://wiki.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.