Déverrouiller à distance
un système chiffré

J’auto-héberge un serveur sous Arch Linux sur lequel sont stockées divers données personnelles : documents, photos, musiques, vidéos… Ses données sont intégralement chiffrées, y compris le système principal, pour éviter tout risque – en cas de cambriolage par exemple.

Le chiffrement de l’ensemble du système soulève néanmoins une difficulté : un mot de passe est nécessaire à chaque redémarrage. Cela signifie qu’il est nécessaire de brancher un clavier et un écran au serveur, ce qui n’est pas forcément pratique s’il s’agit d’un petit boitier qui a vocation à n’être accédé que par SSH…

Surtout, ce serveur doit rester constamment disponible : en cas de coupure de courant ou de dysfonctionnement, il doit pouvoir être redémarré sans que je ne sois nécessairement sur place.

La solution est simple : lorsque l’invité de saisie du mot de passe apparaît, lancer une session SSH minimale qui permet de le saisir.

Cet article est directement inspiré de dm-crypt/Specialties du wiki d’Arch Linux, qui présente différentes façons de faire. Il suppose que vous avez déjà un système chiffré entièrement opérationnel.

Paquets

Nous allons utiliser mkinitcpio-netconf, qui permet d’avoir l’accès au réseau lors de la phase de démarrage précoce, mkinitcpio-tinyssh et tinyssh-convert pour lancer un accès SSH, et mkinitcpio-utils pour obtenir une session :

sudo pacman -Syu mkinitcpio-netconf \
                 mkinitcpio-tinyssh \
                 tinyssh-convert \
                 mkinitcpio-utils

Réseau

Pour obtenir un accès au réseau, il est nécessaire de passer des informations de connexion avec l’option ip au noyau lors du démarrage. Pour ma part, mon serveur se connecte directement avec DHCP sur l’interface eth0, j’utilise donc :

ip=:::::eth0:dhcp

Si votre routeur se connecte sans DHCP à une IP statique, on peut utiliser :

ip=192.168.1.1:::::eth0:none

Vous pouvez voir d’autres possibilités ici. Si vous avez besoin de vous connecter en wifi, le paquet AUR mkinitcpio_wifi : la documentation est détaillée ici.

Copie de la clef

Pour vous connecter au démarrage, il est nécessaire d’envoyer votre clef publique. TinySSH n’accepte que les clefs Ed25519 ou ECDSA ; j’utilise pour ma part le premier type avec ssh-keygen -t ed25519 -a 100.

Cette clef publique doit être placée dans le fichier /etc/tinyssh/root_key.

Pour utiliser la même clef que celle que vous utilisez déjà pour vous connecter en SSH au serveur, il suffit de la copier :

cp ~/.ssh/authorized_keys /etc/tinyssh/root_key

Lancement dans la séquence de démarrage

On modifie enfin le fichier /etc/mkinitcpio.conf pour remplacer encrypt par netconf tinyssh encryptssh dans la ligne qui commence par HOOKS.

On intègre enfin les modifications avec sudo mkinitcpio -P.

En local

Il ne reste qu’à créer une configuration simple, en local, pour déverrouiller son serveur. On modifie ~/.ssh/config avec :

Host unlock
  Hostname domain.tld
  User root
  IdentityFile ~/.ssh/key

Il suffit alors, lorsque la machine est en attente du mot de passe au démarrage, de lancer ssh unlock pour ensuite pouvoir taper le mot de passe !