web-dev-qa-db-fra.com

Comment décrypter automatiquement un système de fichiers chiffré lors du prochain redémarrage?

Objectif

Je cherche un moyen non interactif de déchiffrer une partition de fichier racine et une partition de swap chiffrée avec LUKS lors du prochain redémarrage du système. En plus de cela, j'ai besoin d'un moyen de l'annuler après le redémarrage pour qu'il répète après le redémarrage, le mot de passe (ou même un nouveau mot de passe).

Le système utilise LVM.

Je ne veux pas avoir à taper le mot de passe sur le système, ou utiliser un autre système pour le déverrouiller, il doit se déverrouiller lui-même une fois.

J'ai le mot de passe avec lequel il est crypté et je serais prêt à le sauvegarder en texte clair sur le disque dur. Je ne suis pas concerné par la sécurité à cette étape.

Contexte

J'ai un flux de déploiement d'Ubuntu basé sur une installation de serveur Ubuntu avec un fichier preseed et kickstart personnalisé. Kickstart installe un service exécuté après le premier redémarrage (et uniquement le premier redémarrage), puis redémarre à nouveau. J'essaie d'implémenter le chiffrement de disque LUKS dans ce flux, mais j'ai besoin qu'il reste non interactif, de sorte qu'il doit pouvoir redémarrer la première fois sans mot de passe.

Le mot de passe défini lors de l'installation est temporaire et sera modifié par le service qui s'exécute après le premier redémarrage. Le premier mot de passe peut donc être stocké en texte clair.

Choses que j'ai examinées avant de poster cette question

J'ai fait assez mon travail de recherche sur Google pour essayer de résoudre celui-ci, et la plupart de ce que je trouve vont vers une solution qui permute le fichier initramfs.

J'ai trouvé plusieurs ressources expliquant comment utiliser ceci pour permettre le déverrouillage à distance du système, mais je dois le faire sans interaction. Voici une de ces ressources: https://hamy.io/post/0005/remote-unlocking-of-luks-encrypted-root-in-ubuntu-debian/

La solution la plus proche de la solution que je pense avoir trouvée est cette ressource qui est supposée être un moyen d'accomplir ce que je veux pour une solution VPS, mais il ne s'agit que d'un ensemble de commandes sans explication, et je ne sais pas comment adaptez-le: https://dradisframework.com/pro/support/guides/customization/auto-unlock-luks-encrypted-drive.html

J'ai aussi trouvé cette ressource pour ArchLinux https://wiki.archlinux.org/index.php/Dm-crypt/System_configuration#cryptkey , et j'ai essayé d'ajouter les paramètres du noyau, mais je n'ai pas encore pas de chance avec ça non plus. Je ne sais pas si c'est parce que LUKS ne prend pas en charge ces paramètres de noyau.

7
Tobias

La solution semble être assez simple, et est en quelque sorte décrite dans Comment configurer LVM & LUKS pour déchiffrer automatiquement la partition?

Voici comment j'ai réussi à le faire

Ma partition/boot est/dev/sda1

Mon volume LVM que je veux déchiffrer est/dev/sda3

J'étais root, mais si vous n'avez pas ajouté Sudo à toutes les commandes.

Commencez par créer un fichier de clés avec un mot de passe (j'en génère un pseudo-aléatoire)

dd if=/dev/urandom of=/boot/keyfile bs=1024 count=4

Puis définissez l'autorisation de lecture pour root et rien pour personne d'autre

chmod 0400 /boot/keyfile

Ajoutez ensuite le fichier de clé en tant que clé de déverrouillage

cryptsetup -v luksAddKey /dev/sda3 /boot/keyfile

(Vous serez ensuite invité à saisir le mot de passe de cryptage)

Trouvez l'uuid de la partition/boot avec (celle-ci ne vous oblige pas à être root)

ls -l /dev/disk/by-uuid/

Voici un exemple de ce à quoi l’apparence ressemble (ce n’est pas la sortie réelle car je l’ai saisie à partir d’une autre machine)

test@test:~$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Jan 15 03:36 025c66a2-c683-42c5-b17c-322c2188fe3f -> ../../sda2
lrwxrwxrwx 1 root root 10 Jan 15 03:36 9e7a7336-3b81-4bbe-9f1a-d43415df1ccb -> ../../sda1

Puis éditez/etc/crypttab avec votre éditeur préféré

nano /etc/crypttab

Le contenu ressemblera à quelque chose comme (encore une fois, cela provient d'une autre machine)

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f none luks,discard

Ce que vous voulez faire, c'est que vous voulez remplacer aucun par /dev/disk/by-uuid/[ l'uuid de la partition/boot] et que vous souhaitez remplacer annulez par ) keyscript =/lib/cryptsetup/scripts/passdev

Le résultat devrait ressembler à quelque chose comme ça

sda3_crypt UUID=025c66a2-c683-42c5-b17c-322c2188fe3f /dev/disk/by-uuid/9e7a7336-3b81-4bbe-9f1a-d43415df1ccb luks,keyscript=/lib/cryptsetup/scripts/passdev

Enregistrez le fichier et continuez avec la mise à jour de initramfs

update-initramfs -u

Ça y est, vous pouvez maintenant redémarrer.

reboot

Pour le supprimer à nouveau (comme je le voulais)

Je confirme d'abord qu'il n'y a que deux clés dans le système (la clé d'origine et le nouveau fichier de clés)

cryptsetup luksDump /dev/sda3 | grep BLED

Cela générera une sortie similaire à celle-ci.

Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Pour supprimer la clé dans le logement de clé 1 (le fichier de clé)

cryptsetup luksKillSlot /dev/sda3 1

Vous êtes ensuite invité à saisir le mot de passe de cryptage (le mot de passe d'origine, pas celui du fichier de clés).

Puis supprimez le fichier de clé actuel

rm /boot/keyfile

Mettre à jour les initramfs à nouveau

update-initramfs -u

Maintenant, lorsque vous redémarrez, il vous sera demandé à nouveau un mot de passe. Vous avez terminé.

reboot
7
Tobias