Dm-crypt (FR)

From Gentoo Wiki
Jump to:navigation Jump to:search
Resources

dm-crypt est un système de chiffrement de disque utilisant le framework de l'API cryptographique du noyau et le sous-système de mappeur de périphériques. Avec dm-crypt, les administrateurs peuvent chiffrer des disques entiers, des volumes logiques, des partitions, mais aussi des fichiers individuels.

Le sous-système dm-crypt prend en charge la structure LUKS (Linux Unified Key Setup), qui permet à plusieurs clés d'accéder aux données chiffrées, ainsi que de manipuler les clés (comme les modifier, ajouter des phrases de passe supplémentaires, etc.) Bien que dm-crypt prenne également en charge des configurations non LUKS, cet article se concentrera sur la fonctionnalité LUKS, principalement en raison de sa flexibilité, de sa facilité de gestion et de son large support au sein de la communauté.

Configuration

Il y a deux prérequis avant de pouvoir commencer à utiliser dm-crypt :

  1. Configuration du noyau Linux
  2. Installation du paquet sys-fs/cryptsetup

Configuration du noyau

Pour utiliser dm-crypt, un certain nombre de paramètres de configuration sont nécessaires.

Tout d'abord, la prise en charge de l'infrastructure de mappage des périphériques et de la cible de chiffrement doit être incluse :

{{KernelBox|title=Enabling device mapper and crypt target|1= [*] Enable loadable module support Device Drivers --->

   [*] Multiple devices driver support (RAID and LVM) --->
       <*> Device mapper support
       <*>   Crypt target support

Ensuite, le noyau Linux doit prendre en charge l'ensemble des API cryptographiques que l'administrateur souhaite utiliser pour le chiffrement. Ces API se trouvent dans la section Cryptographic API (API cryptographiques) :

KERNEL Activation des fonctions de l'API cryptographique
[*] Cryptographic API --->
    <*> XTS support
    <*> SHA224 and SHA256 digest algorithm
    <*> AES cipher algorithms
    <*> AES cipher algorithms (x86_64)
    <*> User-space interface for hash algorithms
    <*> User-space interface for symmetric key cipher algorithms

Si le système de fichiers racine est également chiffré, il faut créer un système de fichiers ram initial dans lequel le système de fichiers racine est déchiffré avant d'être monté. Cela nécessite donc la prise en charge d'initramfs :

KERNEL Activation de la prise en charge de l'initramfs
General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

Si vous utilisez l'option de chiffrement tcrypt (mode de compatibilité TrueCrypt/tcplay/VeraCrypt), les éléments suivants devront également être ajoutés au noyau. Sinon, cryptsetup renverra les erreurs suivantes : "device-mapper : reload ioctl failed : Invalid argument" et "Kernel doesn't support TCRYPT compatible mapping".

KERNEL Activation de la prise en charge de tcrypt (mode de compatibilité TrueCrypt/tcplay/VeraCrypt)
Device Drivers --->
    [*] Block Devices ---> 
        <*> Loopback device support 
File systems ---> 
     <*> FUSE (Filesystem in Userspace) support 
[*] Cryptographic API ---> 
     <*> RIPEMD-160 digest algorithm 
     <*> SHA384 and SHA512 digest algorithms 
     <*> Whirlpool digest algorithms 
     <*> LRW support 
     <*> Serpent cipher algorithm 
     <*> Twofish cipher algorithm

Installation de cryptsetup

Le paquet sys-fs/cryptsetup fournit la commande cryptsetup, qui est utilisée pour ouvrir ou fermer l'espace de stockage chiffré ainsi que pour gérer les phrases de passe ou les clés qui lui sont associées.

Espace de stockage chiffré

Benchmark

cryptsetup fournit un utilitaire de benchmarking qui vous aidera à décider de la configuration à choisir. Le résultat dépend des paramètres du noyau ainsi que des USE flags et de la destination (HDD, SSD, etc.).

root #cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1      1707778 iterations per second for 256-bit key
PBKDF2-sha256    2131252 iterations per second for 256-bit key
PBKDF2-sha512    1630755 iterations per second for 256-bit key
PBKDF2-ripemd160  882639 iterations per second for 256-bit key
PBKDF2-whirlpool  664496 iterations per second for 256-bit key
argon2i       9 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      9 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b      1197.2 MiB/s      3788.1 MiB/s
    serpent-cbc        128b               N/A               N/A
    twofish-cbc        128b               N/A               N/A
        aes-cbc        256b       888.2 MiB/s      3011.1 MiB/s
    serpent-cbc        256b               N/A               N/A
    twofish-cbc        256b               N/A               N/A
        aes-xts        256b      3670.7 MiB/s      3708.4 MiB/s
    serpent-xts        256b               N/A               N/A
    twofish-xts        256b               N/A               N/A
        aes-xts        512b      2929.2 MiB/s      2974.0 MiB/s
    serpent-xts        512b               N/A               N/A
    twofish-xts        512b               N/A               N/A

Fichier de clé ou phrase de passe

Pour commencer avec un stockage chiffré, l'administrateur devra décider de la méthode à utiliser pour la clé de chiffrement. Avec cryptsetup, il a le choix entre une phrase de passe et un fichier clé. Dans le cas d'un fichier clé, il peut s'agir de n'importe quel fichier, mais il est recommandé d'utiliser un fichier contenant des données aléatoires correctement protégé (étant donné que l'accès à ce fichier clé signifie l'accès aux données chiffrées).

Pour créer un fichier clé, on peut utiliser la commande dd :

root #dd if=/dev/urandom of=/etc/keys/enc.key bs=1 count=4096

Dans les sections suivantes, nous montrerons toutes les commandes pour les deux situations - phrase de passe et fichier de clé. Bien entendu, une seule méthode est nécessaire.

Création d'une plateforme de stockage chiffrée

Pour créer une plate-forme de stockage chiffrée (qui peut être un disque, une partition, un fichier, ...), utilisez la commande cryptsetup avec l'action luksFormat.

Par exemple, pour définir /dev/vdb2 comme support de stockage des données chiffrées :

root #cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/vdb2
This will overwrite data on /dev/vdb2 irrevocably.
  
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: ...
Verify passphrase: ...

Pour utiliser un fichier clé plutôt qu'une phrase de passe :

root #cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/vdb2 /etc/keys/enc.key
This will overwrite data on /dev/vdb2 irrevocably.

Are you sure? (Type uppercase yes): YES

L'option -c aes-xts-plain64 indique à cryptsetup la norme de chiffrement utilisée pour chiffrer le disque (cat /proc/crypto vous montrera toutes les possibilités). -s 512 indique à cryptsetup la longueur de clé à utiliser pour la clé de chiffrement réelle (contrairement à la phrase de passe ou au fichier de clés, qui sont utilisés pour accéder à cette véritable clé de chiffrement). Enfin, -y vous oblige à taper deux fois votre mot de passe.

Note
XTS divise la clé en deux moitiés, dont une seule est utilisée pour le chiffrement proprement dit. Cela signifie que "aes-xts" avec une clé de 512 bits utilise en fait 256 bits pour la partie AES.
Important
Si l'en-tête LUKS est endommagé, vos données chiffrées seront perdues à jamais, même si vous disposez d'une sauvegarde de la clé GPG et de la phrase de passe. Par conséquent, vous pouvez envisager de sauvegarder cet en-tête sur un périphérique séparé et de le stocker en toute sécurité. Consultez la de LUKS pour plus de détails sur la manière de procéder.
root #cryptsetup luksHeaderBackup /dev/sdXn --header-backup-file /tmp/efiboot/luks-header.img
Sachez que si vous conservez une sauvegarde de l'en-tête LUKS de cette manière et que vous révoquez ultérieurement l'un des lots de clés, les anciennes clés seront toujours utilisables pour déverrouiller la partition LUKS par les personnes ayant accès à ce fichier de sauvegarde de l'en-tête.

Démarrage avec chiffrement intégral du disque

Pour démarrer le système à partir d'un périphérique entièrement chiffré (y compris /boot chiffré) à l'aide de GRUB, chiffrez à l'aide de luks1, puisque luks2 n'est pas encore entièrement pris en charge. Exemple de commande :

Ouverture du stockage chiffré

Pour ouvrir le stockage chiffré (c'est-à-dire rendre les données réelles accessibles grâce à un déchiffrement transparent), utilisez l'action luksOpen .

root #cryptsetup luksOpen /dev/vdb2 myname
Enter passphrase for /dev/vdb2: ...

Si un fichier clé est utilisé, la commande se présente comme suit :

root #cryptsetup luksOpen -d /etc/keys/enc.key /dev/vdb2 myname

Lorsque la commande est exécutée avec succès, un nouveau fichier de périphérique appelé /dev/mapper/myname est mis à disposition.

Si c'est la première fois que ce périphérique chiffré est utilisé, il doit être formaté. L'exemple suivant utilise le système de fichiers Btrfs, mais tout autre système de fichiers peut être utilisé :

root #mkfs.btrfs /dev/mapper/myname

Une fois que le système de fichiers est formaté, ou que le formatage a déjà été effectué dans le passé, le fichier du périphérique peut être monté sur le système :

root #mount /dev/mapper/myname /home

Fermeture du stockage chiffré

Pour verrouiller le stockage chiffré (c'est-à-dire s'assurer que les données réelles ne sont plus accessibles par un déchiffrement transparent), utilisez l'action luksClose :

root #cryptsetup luksClose myname

Bien entendu, assurez-vous que l'appareil n'est plus utilisé.

Manipulation des clés LUKS

Les clés LUKS sont utilisées pour accéder à la véritable clé de chiffrement. Elles sont stockées dans des emplacements situés dans l'en-tête de la partition, du disque ou du fichier (chiffré).

Liste des emplacements

La commande luksDump permet d'afficher des informations sur la partition, le disque ou le fichier chiffré. Cela inclut les emplacements :

root #cryptsetup luksDump /dev/vdb2
LUKS header information for /dev/vdb2
  
Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha1
Payload offset: 4096
MK bits:        512
MK digest:      34 3b ec ac 10 af 19 e7 e2 d4 c8 90 eb a8 da 3c e4 4f 2e ce
MK salt:        ff 7c 7f 53 db 53 48 02 a4 32 dc e0 22 fc a3 51
                06 ba b3 48 b3 28 13 a8 7a 68 43 d6 46 79 14 fe
MK iterations:  59375
UUID:           2921a7c9-7ccb-4300-92f4-38160804e08c
  
Key Slot 0: ENABLED
        Iterations:             241053
        Salt:                   90 0f 0f db cf 66 ea a9 6c 7c 0c 0d b0 28 05 2f
                                8a 5c 14 54 98 62 1a 29 f3 08 25 0c ec c2 b1 68
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: ENABLED
        Iterations:             273211
        Salt:                   01 4c 26 ed ff 18 75 31 b9 89 5d a6 e0 b5 f4 14
                                48 d0 23 47 a9 85 78 fb 76 c4 a9 d0 cd 63 fb d7
        Key material offset:    512
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Dans l'exemple ci-dessus, deux emplacements sont utilisés. Notez que luksDump ne divulgue rien de sensible - il affiche simplement le contenu de l'en-tête LUKS. Aucune clé de décryptage ne doit être fournie pour utiliser luksDump.

Ajout d'un fichier clé ou d'une phrase de passe

Afin d'ajouter un fichier clé ou une phrase de passe supplémentaire pour accéder au stockage chiffré, utilisez la commande luksAddKey :

root #cryptsetup luksAddKey /dev/vdb2
Enter any passphrase: (Enter a valid, previously used passphrase to unlock the key)
Enter new passphrase for key slot: ... 
Verify passphrase: ...

Pour utiliser un fichier de clé afin de déverrouiller la clé (tout en ajoutant une phrase de passe) :

root #cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2
Enter new passphrase for key slot: ...
Verify passphrase: '''

Si un fichier clé doit être ajouté (par exemple /etc/keys/backup.key) :

root #cryptsetup luksAddKey /dev/vdb2 /etc/keys/backup.key

Ou, pour utiliser le premier fichier de clé pour déverrouiller la clé principale :

root #cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2 /etc/keys/backup.key

Suppression d'un fichier de clé ou d'une phrase de passe

La commande luksRemoveKey permet de supprimer un fichier de clé ou une phrase de passe (qui ne peuvent donc plus être utilisés pour déchiffrer l'espace de stockage) :

root #cryptsetup luksRemoveKey /dev/vdb2
Enter LUKS passphrase to be deleted: ...

Ou pour supprimer un fichier de clé :

root #cryptsetup luksRemoveKey -d /etc/keys/backup.key /dev/vdb2

Assurez-vous qu'au moins une méthode d'accès aux données est encore disponible. Une fois qu'une phrase de passe ou un fichier clé a été supprimé, il ne peut plus être récupéré.

Vider un emplacement

Si la phrase de passe ou le fichier clé n'est plus connu, l'emplacement peut être libéré. Bien entendu, il faut pour cela savoir à l'avance dans quel emplacement la phrase de passe ou le fichier clé a été stocké.

Par exemple, pour vider l'emplacement 2 (qui est le troisième emplacement puisque les emplacements sont numérotés à partir de 0) :

root #cryptsetup luksKillSlot /dev/vdb2 2

Cette commande demandera une phrase d'authentification valide avant de continuer. Il est également possible de transmettre le fichier clé à utiliser :

root #cryptsetup luksKillSlot -d /etc/keys/enc.key /dev/vdb2 2

Automatiser le montage des systèmes de fichiers chiffrés

Jusqu'à présent, l'article se concentrait sur la configuration manuelle et le montage/démontage des systèmes de fichiers chiffrés. Il existe un service init dmcrypt qui automatise le déchiffrement et le montage des systèmes de fichiers chiffrés.

Configuration de dm-crypt

Éditez le fichier /etc/conf.d/dmcrypt et ajoutez des entrées pour chaque système de fichiers. Les entrées prises en charge sont bien documentées dans le fichier, l'exemple ci-dessous n'est qu'un exemple :

FILE /etc/conf.d/dmcryptOuverture automatique de deux systèmes de fichiers chiffrés
# Definition for /dev/mapper/home (for /home)
target=home
source=UUID="abcdef12-321a-a324-a88c-cac412befd98"
key=/etc/keys/home.key
 
# Definition for /dev/mapper/local (for /usr/local)
target=local
source=UUID="fedcba34-4823-b423-a94c-cadbefda2943"
key=/etc/keys/local.key
 
# Using an encrypted partition as key source.
target=other
source=UUID="ff24303e-49e1-4d13-b8ad-fc6b7e1d8174"
key=/keys/other.key                                # Relative to the root of the encrypted partition.
remdev=/dev/mapper/home                            # The recently decrypted partition.
 
# An empty line is important at the end of the file

Configuration de fstab

L'étape suivante consiste à configurer /etc/fstab pour monter automatiquement les systèmes de fichiers (déchiffrés) dès qu'ils sont disponibles. Il est recommandé de commencer par obtenir l'UUID du système de fichiers décrypté (monté) :

root #blkid /dev/mapper/home
/dev/mapper/home: UUID="4321421a-4321-a6c9-de52-ba6421efab76" TYPE="ext4"

Mettez ensuite à jour le fichier /etc/fstab en conséquence :

FILE /etc/fstabAutomounting the decrypted file systems
UUID="4321421a-4321-a6c9-de52-ba6421efab76"   /home        ext4   defaults   0   0
UUID="bdef2432-3bd1-4ab4-523d-badcf234a342"   /usr/local   ext4   defaults   0   0

Ajout de l'initscript à bootlevel

N'oubliez pas de lancer le service init dmcrypt au démarrage :

root #rc-update add dmcrypt boot

Afficher les nœuds de périphériques déchiffrés

Si vous avez déchiffré ou déverrouillé un périphérique avant le démarrage des services, par exemple votre disque racine avec un initramfs, il est possible que le périphérique mappé ne soit pas visible. Dans ce cas, vous pouvez exécuter la procédure suivante pour le recréer.

root #dmsetup mknodes

Montage des volumes TrueCrypt/tcplay/VeraCrypt

root #cryptsetup --type tcrypt open container-to-mount container-name

Remplacez container-to-mount par le fichier de périphérique sous /dev ou le chemin du fichier que vous souhaitez ouvrir. Une fois l'ouverture réussie, le périphérique en clair apparaîtra sous la forme /dev/mapper/container-name, sur lequel vous pourrez utiliser la commande mount comme n'importe quel périphérique normal.

Si vous utilisez des fichiers clés, transmettez-les à l'aide de l'option --key-file, pour ouvrir un volume caché, transmettez l'option --tcrypt-hidden et pour une partition ou un disque entier chiffré en mode système, utilisez l'option --tcrypt-system.

Lorsque vous avez terminé, utilisez la commande unmount pour démonter le volume et fermez le conteneur à l'aide de la commande suivante :

root #cryptsetup close container-name

Voir également

Ressources externes

  • The cryptsetup FAQ hosted on GitLab covers a wide range of frequently asked questions.