Le système de mon serveur personnel (pas celui qui héberge ce site web) est totalement chiffré (/boot est une partition indépendante même si GRUB permet de s'en passer). Au démarrage, je saisis la phrase de passe depuis le VNC proposé par l'hébergeur.
Très récemment, j'ai changé d'hébergeur. Avant mon déménagement, son VNC a été dysfonctionnel pendant quasiment une semaine. Ça a été le déclic : comment faire si je dois redémarrer mon serveur pendant une panne ou une maintenance du VNC de mon hébergeur ? Autant une panne du VNC de mon ancien hébergeur me semblait improbable ou très limitée dans le temps au nom du « too big to fail », autant une panne longue de mon nouvel hébergeur me paraît crédible. Donc il m'appartient de concevoir un plan B. (On pourra aussi argumenter qu'une connexion SSH directe sera toujours plus sécurisée que le VNC over HTTPS de l'hébergeur par la simple disparition de l'intermédiaire.)
Il est possible de demander à l'initrd de se connecter au réseau, de proposer un accès SSH (avec l'implémentation minimaliste dropbear
) et un terminal (implémentation minimaliste busybox
) qui permettent d'ouvrir le conteneur LUKS. J'avais lu ça chez Aeris il y a quelques années, mais on va adapter un peu.
apt install dropbear-initramfs
;Ajouter sa clé publique SSH dans /etc/dropbear-initramfs/authorized_keys
. L'auth par mot de passe est impossible (cela garantit la sécurité du serveur contre la force brute en cas de redémarrage inattendu suite à un plantage ou à une maintenance côté hébergeur) ;
Créer un fichier /etc/initramfs-tools/conf.d/ip
. Format : « IP=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>
» (via) ;
IP=192.0.2.42::192.0.2.1:255.255.255.0::eth0:off
;Reconstruire les initrd : update-initramfs -uk all
;
On fabrique un enregistrement DNS de type SSHFP ou une entrée pour le fichier known_hosts
(cela permettra d'authentifier la machine, d'être sûr qu'on causera au bon serveur SSH qui aura booté sur l'initrd). Dans les deux cas, ça nécessite de convertir la clé privée du serveur depuis le format dropbear vers une clé publique au format openssh (attention : depuis OpenSSH 8.7, il ne peut y avoir qu'un seul enregistrement SSHFP par nom, donc une seule paire de clés pour l'initrd et le système…) :
ssh-keygen -y -f /dev/stdin <<< $(dropbearconvert dropbear openssh /etc/dropbear-initramfs/dropbear_rsa_host_key -)
. Ajouter la sortie au fichier known_hosts
de la machine qui accédera au serveur ;ssh-keygen -r <FQDN> -f /dev/stdin <<<$(ssh-keygen -y -f /dev/stdin 2>/dev/null <<<$(dropbearconvert dropbear openssh /etc/dropbear-initramfs/dropbear_rsa_host_key -))
.reboot
le serveur ;dropbear
n'implémente pas toute la crypto moderne, donc, si comme moi tu blindes ta conf' client SSH, il faudra réduire tes prétentions. Cela peut se faire avec une entrée dédiée dans .ssh/config
;ssh root@<serveur>
doit fonctionner ;
Comme nous le dit le prompt, il suffit d'utiliser la commande cryptroot-unlock
. Après la saisie de la phrase de passe, le système démarrera :
~ # cryptroot-unlock
Please unlock disk sda2_crypt:
cryptsetup: sda2_crypt set up successfully
~ # Connection to 192.0.2.42 closed by remote host.
Connection to 192.0.2.42 closed.