Bonjour à tous, le jour ou la nuit ! Ce post sera utile pour ceux qui utilisent le chiffrement des données LUKS et souhaitent déchiffrer des disques sous Linux (Debian, Ubuntu) sur la phase de déchiffrement de la partition root. Et je n'ai pas réussi à trouver cette information sur Internet.
Récemment, avec l'augmentation du nombre de disques dans les étagères, j'ai été confronté à un problème de déchiffrement des disques en utilisant la méthode bien connue via /etc/crypttab. Personnellement, je souligne plusieurs problèmes liés à l'utilisation de cette méthode, en particulier le fait que le fichier est lu uniquement après le montage de la partition root, ce qui a un impact négatif sur l'importation de ZFS, notamment s'ils ont été assemblés à partir de partitions sur un périphérique *_crypt, ou des RAID mdadm assemblés également à partir de partitions. Nous savons tous qu'il est possible d'utiliser parted sur des conteneurs LUKS ? Et il y a aussi le problème de l'initialisation précoce d'autres services, alors que les volumes ne sont pas encore disponibles, et d'utiliser il faut déjà quelque chose (je travaille avec Proxmox VE 5.x clusterisé et ZFS sur iSCSI).
Un peu sur ZFSoverISCSIL'iSCSI fonctionne chez moi via LIO, et quand le cible iscsi démarre et ne voit pas les périphériques ZVOL, il les supprime simplement de la configuration, ce qui empêche les systèmes invités de démarrer. D'où soit la restauration d'un fichier de sauvegarde json, soit l'ajout manuel des périphériques avec les identifiants de chaque VM, ce qui est tout simplement horrible lorsque l'on a des dizaines de ces machines et que chaque configuration en contient plus d'un disque.
Et la deuxième question que je vais aborder est celle de la manière de déchiffrer (c'est un point clé de l'article). Et nous en parlerons ci-dessous, allez-y pour lire !
La plupart du temps, sur Internet, un fichier clé est utilisé (bien entendu, ajouté au préalable dans le slot avec la commande — cryptsetup luksAddKey), ou dans de rares exceptions (les informations en russe sont très limitées) — le script decrypt_derived, situé dans /lib/cryptsetup/script/ (bien sûr, il y a d'autres méthodes, mais j'ai utilisé ces deux-là, ce qui a servi de base à l'article). J'aspirais également à un démarrage complètement autonome après des redémarrages, sans commande supplémentaire dans la console, afin que tout « décolle » immédiatement. Alors, pourquoi attendre ? —
Passons à l'action !
Nous supposons un système, par exemple Debian, installé sur une partition crypto sda3_crypt et une dizaine de disques prêts à être chiffrés et à créer ce que l'on souhaite. Nous avons une phrase de passe (passphrase) pour déverrouiller sda3_crypt et c'est de cette partition que nous allons extraire le « hachage » du mot de passe sur le système en cours d'exécution (décrypté) et l'ajouter aux autres disques. Tout est élémentaire, en exécutant dans la console :
/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdXoù X représente nos disques, partitions, etc.
Après avoir chiffré les disques avec le « hachage » de notre phrase clé, il est nécessaire de connaître l'UUID ou l'ID - selon ce à quoi chacun est habitué. 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 nécessaires à nos fonctions, alors commençons :
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/ensuite
touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decryptContenu .. /decrypt
#!/bin/sh
cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived"ensuite
touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopyContenu .. /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"encore un peu
touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobeContenu .. /partprobe
#!/bin/sh
$DESTDIR/bin/partprobeet enfin, avant update-initramfs, il faut é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 le présenter comme suit
Le fichier modifié
# 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"
breakNotez qu'ici vous pouvez utiliser soit UUID, soit ID. L'essentiel est que les pilotes nécessaires pour les périphériques HDD/SSD soient ajoutés dans /etc/initramfs-tools/modules. Pour connaître le pilote utilisé, vous pouvez exécuter la commande udevadm info -a -n /dev/sdX | egrep ‘looking|DRIVER’.
Maintenant que nous avons terminé et que tous les fichiers sont en place, exécutons update-initramfs -u -k all -v, dans les logs il ne devrait pas y avoir d'erreurs d'exécution de nos scripts. Nous redémarrons, saisissons la phrase clé et attendons un peu, selon le nombre de disques. Ensuite, le système démarrera et à la phase finale de démarrage, après le « montage » de la partition root, la commande partprobe sera exécutée - elle trouvera et attachera toutes les partitions créées sur les appareils LUKS et tous les volumes, qu'il s'agisse de ZFS ou mdadm, seront montés sans problème ! Et tout cela avant le démarrage des services et des systèmes principaux qui nécessitent ces disques/volumes.
update1: Comme , cette méthode fonctionne uniquement pour LUKS1.
Source : habr.com
