Décryptage d'un conteneur LUKS au démarrage du système

Bonne journée et bonne nuit à tous ! Ce billet sera utile pour ceux qui utilisent le chiffrement de données LUKS et qui veulent déchiffrer des disques sous Linux (Debian, Ubuntu) sur étapes de déchiffrement de la partition racine. Et je ne pouvais pas trouver de telles informations sur Internet.

Plus récemment, avec l'augmentation du nombre de disques dans les étagères, j'ai rencontré le problème du décryptage des disques en utilisant la méthode plus que connue via /etc/crypttab. Personnellement, je souligne quelques problèmes avec l'utilisation de cette méthode, à savoir que le fichier est en cours de lecture uniquement après avoir chargé (monté) la partition racine, ce qui affecte négativement les importations ZFS, en particulier si elles ont été créées à partir de partitions sur un périphérique *_crypt, ou les raids mdadm également créés à partir de partitions. Nous savons tous que vous pouvez utiliser parted sur les conteneurs LUKS, n'est-ce pas ? Et aussi le problème du démarrage précoce d'autres services, quand il n'y a pas encore de tableaux, mais utiliser J'ai déjà besoin de quelque chose (je travaille avec Proxmox VE 5.x en cluster et ZFS sur iSCSI).

Un peu sur ZFSoverISCSIiSCSI fonctionne pour moi via LIO, et en fait, lorsque la cible iscsi démarre et ne voit pas les périphériques ZVOL, elle les supprime simplement de la configuration, ce qui empêche les systèmes invités de démarrer. Par conséquent, soit restaurer une sauvegarde de fichier json, soit ajouter manuellement des périphériques avec des identifiants pour chaque machine virtuelle, ce qui est tout simplement terrible lorsqu'il existe des dizaines de telles machines et que chaque configuration a plus d'un disque.

Et la deuxième question que je vais considérer est de savoir comment décrypter (c'est le point clé de l'article). Et on en reparle plus bas, passez sous la coupe !

Le plus souvent, sur Internet, un fichier de clé est utilisé (auto-ajouté à l'emplacement avant cela par la commande - cryptsetup luksAddKey), ou dans de rares exceptions (sur Internet en russe, il y a très peu d'informations) - le script decrypt_derived situé dans /lib/cryptsetup/script/ (bien sûr, il existe d'autres moyens, mais j'ai utilisé ces deux, qui ont constitué la base de l'article). Je me suis également efforcé d'obtenir une inclusion autonome complète après les redémarrages, sans aucune commande supplémentaire dans la console, afin que tout "vole" pour moi en même temps. Alors, pourquoi attendre ? —

Commençons!

Supposons un système, tel que Debian, installé sur une partition crypto sda3_crypt et une douzaine de disques prêts à être chiffrés et créés à votre guise. Nous avons une phrase clé (passphrase) pour déverrouiller sda3_crypt, et c'est à partir de cette partition que nous supprimerons le "hachage" du mot de passe sur le système en cours d'exécution (déchiffré) et l'ajouterons au reste des disques. Tout est élémentaire, dans la console on exécute :

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX

où X est nos disques, partitions, etc.

Après avoir crypté les disques avec un "hachage" de notre phrase de passe, vous devez trouver l'UUID ou l'ID - selon qui est habitué à quoi et à quoi. Nous prenons les données de /dev/disk/by-uuid et by-id respectivement.

La prochaine étape consiste à préparer les fichiers et les mini-scripts pour les fonctions dont nous avons besoin, continuons :

cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/
cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/

далее

touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt

Contenu de ../decrypt

#!/bin/sh

cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"

далее

touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy

Le contenu de ../partcopy

#!/bin/sh

cp -p /sbin/partprobe "$DESTDIR/bin/partprobe"
cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2"
cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7"

un peu plus

touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe

Contenu ../partprobe

#!/bin/sh

$DESTDIR/bin/partprobe

et enfin, avant update-initramfs, vous devez éditer le fichier /etc/initramfs-tools/scripts/local-top/cryptroot, à partir de la ligne ~360, extrait de code ci-dessous

Original


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                
                message "cryptsetup ($crypttarget): set up successfully"
                break

et apportez-le à ce formulaire

Édité


                # decrease $count by 1, apparently last try was successful.
                count=$(( $count - 1 ))
                

                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP*
                /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP*

                message "cryptsetup ($crypttarget): set up successfully"
                break

Notez que l'UUID ou l'ID peuvent être utilisés ici. L'essentiel est que les pilotes nécessaires pour les périphériques HDD / SSD soient ajoutés à /etc/initramfs-tools/modules. Vous pouvez savoir quel pilote est utilisé avec la commande udevadm info -a -n /dev/sdX | egrep 'recherche|CONDUCTEUR'.

Maintenant que nous avons terminé et que tous les fichiers sont en place, lancez mise à jour-initramfs -u -k tous -v, dans la journalisation ne devrait pas être erreurs d'exécution de nos scripts. Nous redémarrons, entrons la phrase secrète et attendons un peu, en fonction du nombre de disques. Ensuite, le système démarrera et à l'étape finale du lancement, à savoir après le "montage" de la partition racine, la commande partprobe sera exécutée - elle trouvera et récupérera toutes les partitions créées sur les périphériques LUKS et toutes les baies, que ce soit ZFS ou mdadm, se montera sans problème ! Et tout ça avant le chargement les services de base et les services qui ont besoin de ces disques/baies.

update1: Comment remarqué AEP, cette méthode ne fonctionne que pour LUKS1.

Source: habr.com

Ajouter un commentaire