Décodage du conteneur LUKS au démarrage

Bonjour, nuit! Ce message sera utile à ceux qui utilisent le cryptage des données LUKS et qui souhaitent décrypter les disques de décryptage sous Linux (Debian, Ubuntu) au stade du décryptage de la partition racine . Et je n'ai pas pu 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 plusieurs problèmes à l'aide de cette méthode, à savoir que le fichier est lu uniquement après le montage (montage) de la partition racine , ce qui affecte négativement l'importation de ZFS, en particulier si elles ont été collectées à partir de partitions sur le périphérique * _crypt ou de raids mdadm collectées également dans les sections. Nous savons tous que vous pouvez utiliser parted sur des conteneurs LUKS? Et aussi le problème du démarrage précoce d'autres services quand il n'y a pas encore de tableaux, mais quelque chose doit être utilisé (je travaille avec Proxmox VE 5.x et ZFS en cluster sur iSCSI).

Un peu sur ZFSoverISCSI
iSCSI fonctionne pour moi via LIO, et en fait, lorsque la cible iscsi démarre et ne voit pas les périphériques ZVOL, il les supprime simplement de la configuration, ce qui empêche le chargement des systèmes invités. Par conséquent, soit la restauration d'une sauvegarde de fichier json, soit l'ajout manuel de périphériques avec les identifiants de chaque machine virtuelle, ce qui est tout simplement horrible lorsqu'il existe des dizaines de ces machines et qu'il y a plus d'un disque dans la configuration de chacun.

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 nous en parlerons ci-dessous, allez sous la coupe!

Le plus souvent, sur Internet, ils utilisent un fichier de clés (la commande cryptsetup luksAddKey ajoutée à l'emplacement avant lui-même), ou à de rares exceptions (la langue russe est une information très rare) - le script decrypt_derived, qui se trouve dans / lib / cryptsetup / script / (bien sûr, il y a encore des moyens, mais j'ai utilisé ces deux, qui constituaient la base de l'article). J'ai également cherché une inclusion totalement autonome après les redémarrages, sans aucune commande supplémentaire dans la console, afin que tout «décolle» à la fois. Alors pourquoi attendre? -

Commençons!

Nous supposons un système, par exemple, Debian, installé sur la partition de crypto sda3_crypt et une douzaine de disques prêts à crypter et à créer tout ce que vous aimez. Nous avons une phrase secrète pour déverrouiller sda3_crypt et c'est dans cette section que nous allons supprimer le "hachage" du mot de passe sur le système en cours d'exécution (déchiffré) et l'ajouter aux autres lecteurs. Tout est élémentaire, dans la console que nous exécutons:

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

où X est nos disques, partitions, etc.

Après avoir chiffré les disques avec un «hachage» à partir de notre phrase secrète, vous devez trouver l'UUID ou l'ID - selon qui et à quoi vous êtes habitué. Nous prenons les données de / dev / disk / by-uuid et by-id, respectivement.

L'étape suivante est la préparation des fichiers et des mini-scripts pour que les fonctions nécessaires fonctionnent, nous procédons:

 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/ 

plus loin

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

Contenu ../décrypter
 #!/bin/sh cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived" 


plus loin

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

Contenu ../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, un morceau de code ci-dessous

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


et apporter à 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 


Veuillez noter 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 découvrir quel pilote utiliser par udevadm info -a -n / dev / sdX | egrep 'recherche | CONDUCTEUR' .

Maintenant que nous avons terminé et que tous les fichiers sont en place, exécutez update-initramfs -u -k all -v , il ne devrait y avoir aucune erreur dans l'exécution de nos scripts dans la journalisation. Nous redémarrons, saisissons la phrase secrète et attendons un peu, selon le nombre de disques. Ensuite, le système démarrera et au stade final du démarrage, à savoir, après avoir «monté» la partition racine, la commande partprobe sera exécutée - il trouvera et récupérera toutes les partitions créées sur les périphériques LUKS et tous les tableaux, qu'ils soient ZFS ou mdadm, s'assembleront sans problème! Et tout cela avant de charger les services de base et les services qui ont besoin de ces disques / baies.

update1 : Comme l'a noté AEP , cette méthode ne fonctionne que pour LUKS1.

Source: https://habr.com/ru/post/fr457260/


All Articles