Comment déverrouiller un volume LUKS au démarrage sur Raspberry Pi OS
LUKS (Linux Unified Key Setup) est la méthode de chiffrement standard de facto utilisée sur les systèmes d’exploitation basés sur Linux. Comme nous l’avons vu dans les tutoriels précédents, lorsque nous voulons qu’une partition ou un disque brut chiffré à l’aide de LUKS soit automatiquement déverrouillé au démarrage, nous devons entrer une ligne dédiée dans le fichier /etc/crypttab. Ce faisant, nous sommes invités à fournir le mot de passe de chiffrement de manière interactive. C’est assez simple sur les ordinateurs portables ou de bureau, mais comment pouvons-nous déverrouiller un volume sur un serveur sans tête ? Une solution consiste à utiliser dropbear pour obtenir un accès ssh à un stade précoce du démarrage, dans initramfs, afin de fournir le mot de passe du volume. Dans ce tutoriel, nous voyons comment utiliser dropbear-initramfs pour obtenir un accès ssh à un stade précoce du démarrage, afin de déverrouiller un volume LUKS.
Dans ce tutoriel, vous allez apprendre :
- Comment installer et configurer dropbear-initramfs sur Raspberry-pi os
- Comment générer un initramfs
- Comment configurer une adresse IP statique dans l’initramfs
- Comment créer une entrée crypttab pour l’appareil LUKS
- Comment ssh à un stade précoce du démarrage et fournir le mot de passe du volume LUKS
Présentation et installation de Dropbear
Dropbear est un serveur et un client SSH gratuits et open source, disponibles sur une vaste gamme de plates-formes Unix. Comme il est très léger, il est souvent utilisé dans les appareils d’intégration où les ressources sont limitées. Sur Debian, et les distributions basées sur Debian comme Raspberry Pi OS, un paquet appelé dropbear-initramfs fournit un support pour l’intégration de Dropbear dans le système initramfs. Pour procéder à ce tutoriel, nous devons l’installer, donc nous exécutons :
sudo apt install dropbear-initramfsDans le cadre de l’installation, des clés SSH seront générées et stockées dans le répertoire /etc/dropbear-initramfs :
ls -l /etc/dropbear-initramfs
[...]
-rw------- 1 root root 141 Jun 27 16:03 dropbear_ecdsa_host_key
-rw------- 1 root root 83 Jun 27 16:03 dropbear_ed25519_host_key
-rw------- 1 root root 805 Jun 27 16:03 dropbear_rsa_host_keyNe vous inquiétez pas si vous utilisez déjà OpenSSH sur le système, ces clés ne seront utilisées que dans le cadre de l’initramfs.
Configuration de dropbear-initramfs
Une fois que nous avons installé le paquet dropbear-initramfs, nous devons le configurer. Nous pouvons le faire en écrivant la ligne appropriée dans le fichier /etc/dropbear-initramfs/config. Ce que nous voulons modifier dans le fichier, c’est la valeur de la variable DROPBEAR_OPTIONS. Les options que nous spécifions comme valeur de la variable sont passées à Dropbear lorsque nous nous connectons via SSH dans le contexte initramfs :
#
Command line options to pass to dropbear(8)
#
DROPBEAR_OPTIONS="-jks -p 2222 -c cryptroot-unlock"Les options -j et -k sont utilisées pour désactiver respectivement l’utilisation des ports SSH locaux et distants. La redirection de port local est une technique utilisée pour tunneliser le trafic reçu sur un port spécifique du client SSH vers un port spécifique de la machine utilisée comme serveur SSH ; La redirection de port à distance fonctionne de la manière inverse : elle est utilisée pour rediriger le trafic reçu sur un port du serveur SSH vers un port de la machine cliente. L’une des utilisations de la redirection de port SSH consiste à fournir un cryptage pour le trafic généré par des applications qui utilisent des protocoles non cryptés comme FTP. Nous n’avons pas besoin de redirection de port dans ce contexte, nous désactivons donc cette fonctionnalité.
L’option -s est utilisée pour désactiver la connexion par mot de passe. Pour se connecter via SSH au système temporaire fourni par initramfs, nous utilisons l’authentification par clé publique. Nous devons nous connecter en tant qu’utilisateur root, et dans ce contexte, même si nous le voulions, il ne serait pas possible de se connecter avec un mot de passe.
Par défaut, les serveurs SSH écoutent le port 22 ; Dans ce cas, cependant, nous avons utilisé l’option -p pour spécifier que nous voulons utiliser un autre port, 2222. C’est nécessaire car, comme nous l’avons déjà dit, des clés d’hôte dédiées sont générées lors de l’installation de dropbear, et celles-ci sont évidemment différentes de celles utilisées lors de la connexion au « vrai » système. La première fois que nous nous connectons à un serveur SSH, la clé du serveur est écrite dans notre fichier local « known_hosts ». Cette clé est vérifiée lors des connexions suivantes, afin d’éviter une éventuelle attaque de l’homme du milieu. Si la clé du serveur change, un message similaire au suivant s’affiche :
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Please contact your system administrator.
Add correct host key in /home/hostname /.ssh/known_hosts to get rid of this message.
Offending RSA key in /var/lib/sss/pubconf/known_hosts:4
RSA host key for pong has changed and you have requested strict checking.
Host key verification failed.Si nous utilisons le même port pour nous connecter via SSH lors de l’utilisation de dropbear dans l’initramfs et sur le système démarré, nous verrons ce message. En spécifiant un port différent pour dropbear, nous pouvons éviter l’erreur.
La dernière option que nous avons définie dans l’exemple ci-dessus est -c. Cette option prend une commande comme argument : cette commande est exécutée de force lorsque la connexion est établie, peu importe si une autre est spécifiée par l’utilisateur. Dans ce cas, nous avons utilisé la commande cryptroot-unlock. Cryptroot-unlock est un script fourni par le paquet cryptsetup-initramfs : il est utilisé pour déverrouiller les périphériques spécifiés dans le fichier /etc/crypttab au démarrage.
Autorisation de notre clé
Comme nous l’avons mentionné précédemment, nous nous connecterons en utilisant l’authentification par clé publique, nous devons donc copier la clé publique de notre client dans le fichier /etc/dropbear-initramfs/authorized-keys, qui doit être possédé par root, et avoir 600 comme mode d’autorisation, il doit donc être lisible et accessible en écriture uniquement par son propriétaire. Si nous nous connectons normalement en tant qu’utilisateur standard au système et que nous voulons utiliser la même clé, nous pouvons simplement copier le fichier ~/.ssh/authorized_key existant dans le répertoire personnel de l’utilisateur que nous connectons comme sur le serveur, à la position susmentionnée :
sudo cp ~/.ssh/authorized_keys /etc/dropbear-initramfs/Nous pourrions également générer une paire de clés dédiée, et copier le contenu de la clé publique dans le fichier.
Configuration de crypttab et fstab
Nous devons créer une entrée pour le périphérique de bloc crypté LUKS qui doit être automatiquement déverrouillé au démarrage dans le fichier /etc/crypttab. Ici, nous ne décrirons pas en détail la syntaxe crypttab, comme nous l’avons décrite dans un tutoriel dédié. Voici à quoi doit ressembler notre entrée crypttab :
luks-200ce9d7-72de-443f-b669-e50d0a23f01a UUID=200ce9d7-72de-443f-b669-e50d0a23f01a none luks,initramfsNous avons identifié l’appareil chiffré par son UUID et l’avons configuré pour qu’il soit accessible en tant que /dev/mapper/luks-200ce9d7-72de-443f-b669-e50d0a23f01a lorsqu’il est déverrouillé. La chose très importante à noter est que nous avons utilisé l’option initramfs : ce n’est pas une option standard de cyrpttab, mais une implémentation Debian et elle est nécessaire pour que l’entrée soit incluse dans l’initramfs.
Dans cet exemple, je veux que ce périphérique soit automatiquement monté sur /srv, nous devons donc ajouter cette ligne dans /etc/fstab :
/dev/mapper/luks-200ce9d7-72de-443f-b669-e50d0a23f01a /srv ext4 defaults,noatime 0 2D’ailleurs, si vous n’êtes pas familier avec fstab, nous avons également écrit un tutoriel sur sa syntaxe.
Définition d’une adresse IP statique dans l’initramfs
Pour pouvoir se connecter via SSH à un stade de démarrage précoce, lorsque l’initramfs est utilisé, nous devons définir une adresse IP statique pour notre machine. Une façon de le faire est de définir des baux statiques dans notre routeur (si l’appareil prend en charge cette fonctionnalité), afin qu’il attribue statiquement des adresses IP à des adresses MAC spécifiques. Si nous utilisons cette stratégie, nous n’avons pas besoin de changer quoi que ce soit sur la machine cliente. L’autre méthode consiste à définir une adresse IP statique sur le client directement en utilisant le paramètre de noyau « ip ». Nous pouvons le définir dans le fichier /etc/initramfs-tools/initramfs.conf, en utilisant la syntaxe suivante :
IP=<client-ip>:<server-ip>:<gateway-ip>:<netmask>:<hostname>Les éléments sont séparés par deux points ; le premier est le client-ip, le second, server-ip, n’est pas nécessaire dans ce contexte : il est utilisé lors de la connexion à un serveur NFS. Le troisième élément est l’adresse IP de la passerelle, qui, dans une configuration domestique, est généralement le modem/routeur. Le cinquième élément est le masque de réseau et le troisième est le nom d’hôte de la machine. En voici un exemple. Nous attribuons l’adresse IP statique 192.168.0.39 à la machine :
IP=192.168.0.39::192.168.0.1:255.255.255.0:feanorGénération des initramfs
Nous pouvons maintenant générer notre initramfs et spécifier qu’il doit être utilisé au démarrage. Pour générer l’initramfs, nous utilisons la commande mkinitramfs :
sudo mkinitramfs -o /boot/initramfs.gzDans l’exemple ci-dessus, nous avons utilisé l’option -o (abréviation de --outfile) qui prend comme argument le chemin où l’archive initramfs générée doit être enregistrée. Dans ce cas, nous l’avons enregistré sous le nom /boot/initramfs.tar.gz. Une fois l’initramfs généré, pour qu’il puisse être utilisé au démarrage, nous devons ajouter la ligne suivante au fichier /boot/config.txt :
initramfs initramfs.gz followkernelLa commande initramfs permet de spécifier les ramfs qui doivent être utilisés et l’adresse mémoire où ils doivent être chargés. En utilisant « followkernel », nous disons essentiellement que les initramfs doivent être chargés en mémoire après l’image du noyau (vous pouvez en savoir plus à ce sujet dans cette page de documentation Raspberry Pi).
Déverrouillage de l’appareil au démarrage
À ce stade, tout est prêt et tout devrait bien fonctionner. Nous redémarrons le système d’exploitation Rasberry Pi et attendons quelques secondes qu’il revienne en ligne ; puis, depuis notre machine cliente, nous nous connectons via SSH :
ssh root@192.168.0.39 -p 2222Si c’est la première fois que nous nous connectons, l’empreinte digitale du système s’affichera et nous serons invités à confirmer que nous voulons nous y connecter :
The authenticity of host '[192.168.0.39]:2222 ([192.168.0.39]:2222)' can't be established.
ED25519 key fingerprint is SHA256:TjCUX3ZG0blPkuRwyCCKM9Dv2JPtnHUivoC9nVP78XI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yesUne fois que nous confirmons, nous sommes informés que le serveur a été ajouté à la liste des hôtes connus, puis nous sommes invités à fournir le mot de passe pour déverrouiller le périphérique chiffré LUKS que nous avons spécifié dans le fichier crypttab :
Please unlock disk luks-200ce9d7-72de-443f-b669-e50d0a23f01a:Étant donné que le Raspberry Pi dispose d’une puissance CPU limitée, le déverrouillage du périphérique LUKS peut prendre un certain temps, surtout s’il a été formaté sur une machine plus puissante. Si le processus prend trop de temps, nous pouvons recevoir une erreur de délai d’expiration. Si nous fournissons la bonne phrase de passe, l’appareil sera déverrouillé, la connexion sera fermée et le processus de démarrage se poursuivra.
cryptsetup: luks-200ce9d7-72de-443f-b669-e50d0a23f01a set up successfully
Connection to 192.168.0.39 closed.Conclusions
Dans cet article, nous avons vu comment utiliser dropbear-initramfs pour obtenir un accès SSH à un stade précoce de démarrage, lorsque l’initramfs est chargé, afin de déverrouiller un périphérique crypté LUKS sur un Raspberry Pi sans tête. Les instructions de ce tutoriel, avec quelques petites modifications, peuvent être appliquées à d’autres systèmes basés sur Debian.
