Déchiffrer à distance un volume LUKS
Je parle souvent de “homelab” sur ce blog sur lequel je fais ma veille technologique. Mais en réalité, ce terme n’est pas vraiment approprié : je pratique rarement sur mes machines personnelles (à part pour des tests entre plusieurs zones réseaux). On devrait plutôt parler de “cloudlab” puisque je déploie la plupart du temps sur un dédié sur lequel j’y ai installé un Proxmox.
Avoir un serveur dédié me permet d’avoir accès à des ressources plus importantes que sur mes deux machines n100 et d’héberger des applications qui auront une meilleure disponibilité. Aussi, j’ai déjà eu des pannes de réseau et des coupures de courant chez moi, ce qui ne devrait pas arriver chez l’hébergeur. J’utilise également ce serveur pour sauvegarder les données sur mon NAS (qui lui est chez moi). Bref : c’est un peu mon “cloud personnel”.
Mais petit rappel qu’on devrait tous avoir en tête, dès lors qu’on utilise un serveur distant : nous avons accès à cette machine, mais ça n’est pas notre machine. Il est déjà arrivé que des personnes malveillantes aient des accès physiques à des datacenters et aient pu accéder aux données. De plus, je ne fais pas forcément confiance aux clouds providers pour bien formater les disques avant de les réutiliser pour d’autres clients une fois que j’aurai résilié mon contrat.
RIP les photos de mes vacances à la plage… Heureusement que j’ai caché ces fichiers à travers des milliards de photo de mon chat, le hacker ne saura pas lesquelles sont les bonnes !
Matez-moi ce frimeur.
Chiffrer ses données avec LUKS, c’est facile, mais c’est l’étape du déchiffrement qui peut être problématique. Comment donner la clé de déchiffrement au démarrage du serveur ?
Vous pourriez me répondre que vous avez un accès IPMI (ou à l’écran) de votre serveur pour rentrer la passphrase mais :
- Ce n’est pas toujours disponible en fonction du cloud provider choisi.
- La surcouche ajoutée par l’hébergeur (notamment en fonction de votre gamme sur l’hébergeur français en 3 lettres) n’est pas toujours fonctionnelle (voire rarement).
- La passphrase passe par l’interface propriétaire de l’hébergeur, et ça c’est pas cool (Moi parano ? Toi-même !).
Si seulement il existait un moyen de déchiffrer un volume LUKS à distance… Si seulement…
Vous connaissez Dropbear ?
Dropbear
En plus d’être le nom d’un animal folklorique d’Australie représentant un Koala carnivore et “vicieux” (ce n’est pas moi qui le dit, c’est Wikipédia), c’est également le nom d’un serveur SSH ayant peu de dépendance et suffisamment léger pour être installé dans les systèmes embarqués (tellement qu’il peut s’installer dans l’initramfs).
Pour rappel, l’initramfs c’est le composant qui, au démarrage de votre système, permet de monter les différentes partitions, de charger les modules et de poursuivre le lancement du système. C’est d’ailleurs lui qui vous demande votre passphrase pour déchiffrer votre volume LUKS.
Vous commencez à voir où je veux en venir ? Grâce à Dropbear et son intégration dans l’initramfs, vous pouvez déchiffrer votre volume LUKS à distance, sans devoir rentrer la passphrase depuis l’écran du serveur.
Installation
J’utilise 99% du temps des serveurs sous Debian donc on va partir de cette base.
Première étape : Installer notre système avec LUKS. Je ne vais pas détailler cette étape, il s’agit juste de répondre aux questions posées par l’installateur.
Ici, on sort un peu du contexte où je suis chez un hébergeur et où je n’ai pas accès à l’écran. On pourra en reparler dans un prochain article 😃
N’hésitez pas à utiliser ce même mot de passe, comme ça vous serez sûr de ne pas l’oublier !
Après l’installation (où on déchiffre le volume LUKS avec notre passphrase), on va installer Dropbear.
sudo apt install dropbear-initramfs
L’installation du paquet va également afficher un message d’erreur :
dropbear: WARNING: Invalid authorized_keys file, SSH login to initramfs won't work!
Oui, oui… on sait, on va te configurer.
Ce qu’on va faire, c’est ajouter notre clé publique dans la configuration de Dropbear. Pour cela, on va éditer le fichier /etc/dropbear/initramfs/authorized_keys
(et le créer s’il n’existe pas).
Je le précise quand même, Dropbear est compatible avec les clés RSA, ECDSA et surtout ED25519 (que j’utilise au quotidien).
Libre à vous d’employer la même clé que celle que vous utilisez pour vous authentifier sur votre serveur ou d’en générer une nouvelle.
mkdir unlock; cd unlock
ssh-keygen -t ed25519 -f ./unlock_key
cat unlock_key.pub > /etc/dropbear/initramfs/authorized_keys
Récupérez bien le fichier unlock_key
afin de pouvoir vous connecter à votre serveur (c’est plus pratique pour s’authentifier).
Il reste quand même à configurer Dropbear en modifiant le fichier /etc/dropbear/initramfs/dropbear.conf
pour y ajouter la configuration suivante :
DROPBEAR_OPTIONS="-j -k -s -p 666"
-j
et-k
Désactiver le port-forwarding (remote et local).-s
Désactiver l’authentification par mot de passe.-p 666
Changer le port par défaut (22) par le port 666 (Pourquoi ce port ? Vous avez 3h).
Dropbear, c’est check ! ✅
Il ne reste qu’à mettre à jour l’initramfs pour que l’intégration de Dropbear soit effective.
update-initramfs -u
C’est tipar, on reboot ! 🚀
Ci-dessus l’écran de la VM. Les logs ne sont pas très lisibles, mais on peut voir que :
- La passphrase est toujours demandée (on peut toujours unlock en passant par l’écran également) ;
- Dropbear est démarré et a récupéré une IP par le DHCP.
On ne va pas attendre plus longtemps : on se connecte !
La commande cryptroot-unlock
va nous demander la clé de déchiffrement, une fois rentrée : on est automatiquement déconnecté et le système démarre.
Et voilà, on a déchiffré notre volume LUKS à distance ! 🎉
Je pense sincèrement que personne n’a de raison valable de ne pas chiffrer ses données, mais c’est rarement fait de manière systématique (pas de shaming ici, juste un constat). Les serveurs (en cloud ou chez soi) ne font pas exception à la règle et cette astuce (dropbear + LUKS) est une raison de moins de laisser les données en clair.
Comment ça se passe si vous êtes chez un cloud provider où vous n’avez pas le contrôle sur l’OS que vous installez ? On en parle dans un prochain article 😉 !