Démarrer un debian chiffré à distance avec dm-crypt et ssh

Posted on mar. 12 avril 2016 in tuto

Un serveur dédié c'est bien : ça permet de mettre différents services en lignes, comme un cloud personnel ou un site internet perso. Le problème c'est que quiconque à accès à la machine physique peut piquer un disque, et accéder à toutes nos données, ce qui n'est pas l'idéal pour tout le monde : dans ce cas, on passe par du chiffrement. Mais quand on chiffre l'ensemble de son système, il faut taper un mot de passe lors du boot, ce qui implique d'avoir accès à la machine avant qu'elle ait démarré : pas évident !

Pour pallier ce problème (non, il n'y a pas de faute), il est possible d'utiliser SSH pour taper le mot de passe pour démarrer le système.

Attends, tu nous parles de nous connecter en SSH sur un système pas démarré ? Gné ?

Non, je ne suis pas fou ! Il suffit d'utiliser une méthode supportée par linux : un serveur ssh dans l'initramfs. Mais déjà, qu'est-ce que c'est que l'initramfs ? C'est l'heure de faire un point sur la...

Chaîne de démarrage d'une machine sous Linux

Je vais pas faire un cours détaillé sur le boot d'un Linux, juste quelques notions rapides pour comprendre ce qu'il se passe et la partie qui nous intéresse. Alors qu'est-ce qu'il se passe quand on appuie sur le bouton de démarrage du PC ?

  • Le BIOS (ou l'UEFI) se lance, liste et initialise le matériel, et amorce le support choisi. En général, c'est votre disque dur.
  • Le BootLoader prend le relais. En général il s'agit de grub, et ça tombe bien parce que ce tuto va partir du principe que c'est ce que vous avez. Il va charger le kernel en RAM, lui donner quelques paramètres (quel disque contient votre racine par exemple) et lui passer la main.
  • A ce moment là, on se dit que le kernel va monter votre disque et roulez jeunesse. Le problème, c'est qu'il lui faut pas mal de choses pour ça. Les drivers de votre système de fichiers par exemple (au hasard, les modules de crypto pour le déchiffrer...). Qui sont... Sur le disque. Vous voyez le problème ? L'oeuf, la poule, etc etc... D'où une petite étape intermédiaire...
  • L'initramfs ! Il s'agit d'un mini système qui va être chargé en ram et executer les taches préparatoires pour monter le système final... Comme déchiffrer votre disque ! Une fois ces tâches executées et la racine montée...
  • Le système final prend le relai et monte les différentes partitions, lance l'espace utilisateur, les services, éventuellement l'interface graphique, et le PC est prêt à être utilisé.

Comment avoir un système avec une racine chiffrée ?

Pour Debian, rien de plus simple : il suffit de demander lors du partitionnement des disques à "Utiliser un disque entier avec LVM chiffrée". L'installeur va vous demander de choisir un mot de passe et c'est tout ! N'oubliez pas le mot de passe, sinon vous êtes bons pour tout réinstaller... Sous Archlinux, je vous conseille de lire la (vaste) documentation de DM-Crypt, et en particulier cette page. Et de vous armer d'un peu de patience, mais vous ne choisissez pas Arch pour que ça soit facile ;)

Petite note en passant : la suite de ce tuto est pour les utilisateurs de Debian (Jessie, la version stable à l'heure où j'écris ces lignes). Si vous voulez faire la même chose sous une autre distribution, je vous conseille de jeter un oeil à cette page du wiki d'ArchLinux qui pourra vous aider.

Un serveur SSH dans l'initramfs

Vous l'avez compris, c'est donc l'initramfs qui va nous intéresser. Il faut donc faire en sorte qu'on puisse se connecter en SSH dans l'initramfs, pour pouvoir lui donner le mot de passe de déchiffrement de notre partition racine. Pour cela, on va devoir installer quelques paquets sur le serveur :

apt-get install openssh-server dropbear busybox

Dropbear est un serveur SSH alternatif à openssh, qui va se placer dans l'initramfs, et automatiquement créer une clef SSH dans le dossier /etc/initramfs-tools/root/.ssh/id_rsa. Il faut copier cette clef sur la machine qui vous servira à déverrouiller le serveur via le réseau. On va placer la clef sur le poste client dans ~/id-rsa.initramfs pour l'exemple.

Paramétrer le réseau pour l'initramfs

Il y a deux solutions : soit votre serveur reçoit ses IP via DHCP, auquel cas vous pouvez sauter cette étape, soit l'ip est configurée statiquement sur le serveur.

Dans le deuxième cas, pour que l'initramfs soit connectée au réseau, il faut modifier le fichier /etc/default/grub pour avoir la ligne suivante :

GRUB_CMDLINE_LINUX="ip=aaa.bbb.ccc.ddd::eee.fff.ggg.hhh:www.xxx.yyy.zzz::ethX:none"

Deux trois petites choses à noter :

  • Certains champs sont vides, ce qui explique qu'il y ait des ::, respectez les bien.
  • aaa.bbb.ccc.ddd est l'IP qui vous permettra de joindre votre serveur. A vous de faire en sorte qu'elle soit contactable par votre PC client.
  • eee.fff.ggg.hhh est l'IP de la passerelle de votre serveur
  • www.xxx.yyy.zzz est le masque de sous-réseau de votre serveur (255.255.255.0 par exemple)
  • ethX est l'interface à paramétrer.

Une fois cette configuration effectuée, vous devez reconstruire les paramètres de grub avec la commande

update-grub

Et y'a plus qu'à !

Vous pouvez ensuite redémarrer votre serveur. Vous constaterez qu'il vous demande votre mot de passe, mais aussi qu'il paramètre le réseau cette fois. Il ne vous reste plus qu'à vous diriger vers le poste client pour le déverrouiller à l'aide d'une simple commande :

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" root@aaa.bbb.ccc.ddd "echo -ne \"VotreClefDeChiffrement\" > /lib/cryptsetup/passfifo"

Lancez la commande, et le tour est joué ! Votre serveur déchiffre et monte le disque, et se lance normalement. Il ne vous reste qu'à profiter de vos services !