Outils pour utilisateurs

Outils du site


debian-fde-dropbear

Ceci est une ancienne révision du document !


Serveur Debian chiffré (FDE) avec déchiffrement distant

Nous allons utiliser dropbear, un serveur ssh avec la particularité de pouvoir fonctionner dans l'initramfs, c'est-à-dire la partie du disque non-chiffrée qui est accessible au démarrage de la machine sur le réseau et permet de débloquer le disque chiffré à distance. Sans cela, il faudrait se déplacer physiquement sur le serveur pour entrer la phrase de passe sur un clavier.

Note : FDE est l'acronyme de “Full Disk Encryption” (chiffrement intégral du disque).

Pré-requis : Un serveur avec Debian installé en mode “Utiliser tout un disque avec LVM Chiffré”.

Sources & Documentation

Installation de dropbear

  apt install dropbear

Avec Jessie (debian 8)

L'installation de dropbear génère une paire de clés ssh mais qui sont stockées sur la partie non-chiffrée du disque.

Il faut donc vider les clés autorisées à se connecter sur l'initramfs

  echo "" > /etc/initramfs-tools/root/.ssh/authorized_keys

et supprimer les clés ssh générées par l'installation de dropbear

  rm /etc/initramfs-tools/root/.ssh/id_rsa*

Ensuite, il faut ajouter les clés ssh autorisées à se connecter pour déchiffrer le disque au fichier /etc/initramfs-tools/root/.ssh/authorized_keys (cela peut être une copie de ~/.ssh/authorized_keys, par exemple).

À partir de stretch (debian 9)

L'installation de dropbear entraîne l'installation d'un paquet complémentaire dropbear-initramfs.

Les clés autorisées à se connecter sur l'initramfs ne sont plus générées automatiquement, elles seront à ajouter dans /etc/dropbear-initramfs/authorized_keys. C'est pourquoi à la fin de l'installation ou si l'on reconstruit l'initramfs avant d'avoir ajouter les clés, on a un message nous indiquant :

  dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!

Ajout du pilote de la carte réseau à l'initram-fs

Note : Cette étape n'est pas obligatoire sur toutes les machines, le pilote de la carte réseau étant déjà chargé dans certains cas.

Pour cela, il faut détecter le pilote avec la commande

  # "e*" permet de fonctionner avec l'ancien (eth*) et le nouveau (enps*) nommage des interfaces.
  grep DRIVER /sys/class/net/e*/device/uevent

qui retourne par exemple

  DRIVER=r8169

et l'ajouter au fichier /etc/initramfs-tools/modules (uniquement le nom du driver r8169 ici).

Cela peut se faire en une seule ligne

  grep DRIVER= /sys/class/net/e*/device/uevent | cut -d= -f2 >>/etc/initramfs-tools/modules

Configuration de l'initramfs

Note : La configuration décrite ci-après est réalisée dans le fichier /etc/initramfs-tools/initramfs.conf, mais pour éviter des surprises vis à vis des mises à jour Debian, il serait préférable d'utiliser un autre fichier comme par exemple /etc/initramfs-tools/conf.d/dropbear-fde-unlock.

Avec Jessie (debian 8)

Éditer le fichier /etc/initramfs-tools/initramfs.conf et ajouter les lignes suivantes :

  # enable dropbear explicitly
  DROPBEAR=y
  # network configuration.
  # network module is loaded by /etc/initramfs-tools/modules
  # IP should be like IP=<local_IP>::<gw_IP>:<netmask>:<hostname>:<network_interface>:off
  DEVICE=eth0
  IP=111.222.333.444::111.222.333.254:255.255.255.0::eth0:off

Reconstruire l'initramfs (à faire après chaque modification)

  update-initramfs -u

Enfin, il faut forcer l'extinction de l'interface réseau allumée par le initramfs avant sa réactivation par le système principal.

Ajouter ceci dans la spécification de l'interface, dans le fichier /etc/network/interfaces, en dessous la règle iface :

  pre-up ip addr flush dev eth0
  # pre-up ifdown eth0

À partir de stretch (debian 9)

Le fonctionnement est identique, à ceci près, qu'il n'est pas utile d'ajouter la ligne :

  # enable dropbear explicitly
  DROPBEAR=y

Variante

DROPBEAR=y et DEVICE=eth0 étant les valeurs par défaut, il est possible de définir la configuration réseau via le Grub. Pour cela il faut éditer le fichier /etc/default/grub et ajouter la ligne suivante

  # GRUB_CMDLINE_LINUX="ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>"
  GRUB_CMDLINE_LINUX="ip=111.222.333.444::111.222.333.254:255.255.255.0::eth0:off"

Puis recharger la configuration de Grub

  update-grub

Note : Il est cependant nécessaire de reconstruire l'initramfs (update-initramfs -u) suite à la suppression des clés générées par dropbear et à l'ajout du pilote réseau.

Connexion à la machine

Avec Jessie (debian 8)

  ssh -t -o UserKnownHostsFile=~/.ssh/machine_known_hosts root@machine "/lib/cryptsetup/askpass 'FDE Passphrase : ' > /lib/cryptsetup/passfifo"

avec machine = IP de la machine

Explications :

  • L'utilitaire /lib/cryptsetup/askpass permet de demander une phrase de passe
  • La phrase de passe est écrite dans le fifo /lib/cryptsetup/passfifo (sur le serveur) au sein duquel le programme de déverrouillage du disque la lit ;
  • Un fichier KnownHost spécifique est utilisé car la clé ssh du serveur diffère entre l'initramfs et le root filesystem.

Notez qu'il est possible de se connecter simplement en ssh à la machine (ssh -o UserKnownHostsFile=~/.ssh/machine_known_hosts root@machine) puis de saisir la commande /lib/cryptsetup/askpass 'FDE Passphrase : ' > /lib/cryptsetup/passfifo pour entrer sa phrase de passe.

À partir de stretch (debian 9)

On peut toujours se connecter avec la méthode décrite, ci-dessus, mais désormais le paquet cryptsetup inclut un script de déverrouillage complémentaire (cf. /usr/share/cryptsetup/initramfs/bin/cryptroot-unlock et /usr/share/initramfs-tools/hooks/cryptroot-unlock), que l'on peut définir comme unique commande proposée à la connexion.

Pour cela, on ajoute la clé ssh autorisée à se connecter au boot, avec les commandes suivante :

 # echo -n "command=\"/bin/cryptroot-unlock\" " > /etc/dropbear-initramfs/authorized_keys
 # cat /home/<username>.ssh/id_rsa.pub >> /etc/dropbear-initramfs/authorized_keys

ou avec votre éditeur de texte préféré.

Dès lors, pour se connecter, il suffit de lancer :

  ssh -t -o UserKnownHostsFile=~/.ssh/machine_known_hosts root@machine

Configuration persistante de SSH

SSH permet de définir des configurations par défaut dans le fichier ~/.ssh/config. Dans notre cas nous pouvons configurer l'utilisation d'un fichier KnownHost spécifique pour cette machine, ainsi que d'autres paramètres.

Exemple :

  Host machine-initrd
      PasswordAuthentication no
      IdentityFile ~/.ssh/id_rsa
      User root
      Hostname machine.example.org
      UserKnownHostsFile ~/.ssh/machine_known_hosts
      StrictHostKeyChecking yes

Ensuite, suffit de faire :

  ssh machine-initrd -t "/lib/cryptsetup/askpass 'FDE Passphrase : ' > /lib/cryptsetup/passfifo"

À noter qu'une fois la passphrase entrée, la connexion ssh est coupée étant donnée que la machine se lance et se déchiffre.

Et en IPv6 ?

Le serveur SSH dans l'initrd écoute également par défaut en IPv6. Cela signifie :

  • Si vous avez de l'auto-configuration IPv6 sur votre réseau, vous pourrez utiliser l'adresse publique de votre machine pour la déverrouiller à distance.
  • En étant sur le même LAN que votre machine, vous pouvez utiliser l'adresse link-local de votre machine pour la déverrouiller.

Complément et alternative

Sécurisation de dropbear-initramfs

À partir de debian 9, il y a une configuration spécifique pour le paquet dropbear-initramfs.

Sans rien y toucher ça marche, mais il est possible d'ajouter quelques options, dans le fichier /etc/dropbear-initramfs/config, pour sécuriser le tout.

Quelques options extraites de man dropbear :

-p Listen on specified TCP port.
-s Disable password logins.
-j Disable local port forwarding.
-k Disable remote port forwarding.
-I Disconnect the session if no traffic is transmitted or received for n seconds.

La ligne #DROPBEAR_OPTIONS= dans le fichier de config peut donc devenir : DROPBEAR_OPTIONS=-w -s -j -k -I 60.

Cohabitation dropbear et openssh

Avec la mise en place de dropbear, du point de vue du client SSH on se connecte deux fois de suite sur la même ip+port en ssh, mais sur deux serveurs SSH (dropbear, puis openssh-server) identifiés par des clés différentes (côté serveur).

Ces clés sont stockées par le client SSH dans ~/.ssh/known_hosts et vérifiées à la connexion.

Pour éviter que notre client SSH ne crie à chaque connexion croyant que l'on ne se connecte pas à la même machine, il y a au moins deux possibilités :

Le cas particulier d'une Brique Internet

Dropbear est déjà installé et utilisé sur les installations chiffrées de la Brique Internet, donc pas besoin de l'installer. Et vis-a-vis des explications précédentes, la brique fonctionne avec u-boot et non grub comme gestionnaire de démarrage.

Ouvrir /etc/initramfs-tools/root/.ssh/authorized_keys et y copier le contenu de ~/.ssh/authorized_keys (en espérant que vous aviez précédemment sécurisé la connexion ssh par clé) :

 vi /etc/initramfs-tools/root/.ssh/authorized_keys

Découvrir quel est le driver utilisé par l'interface réseau ethernet eth0 :

grep DRIVER /sys/class/net/eth0/device/uevent

qui donne DRIVER=stmmaceth par exemple

Et ajouter le résultat de la commande précédente (stmmaceth) dans le fichier /etc/initramfs-tools/modules :

vi /etc/initramfs-tools/modules

(c'est en prévention, cela marche aussi généralement sans)

Et finalement compléter le fichier /etc/initramfs-tools/initramfs.conf :

vi /etc/initramfs-tools/initramfs.conf

pour y ajouter :

  # network configuration.
  # network module is loaded by /etc/initramfs-tools/modules
  # IP should be like IP=<local_IP>::<gw_IP>:<netmask>:<hostname>:<network_interface>:off
  DEVICE=eth0
  IP=89.234.176.xxx::89.234.176.193:255.255.255.24::eth0:off

(ici, exemple de configuration pour rackage dans le DC, remplacer xxx par l'IP)

Et reconstruire l'initramfs avec ces informations (pas besoin de plus pour la configuration de u-boot) :

update-initramfs -k all -u 

N'oubliez pas de configurer la connexion réseau une fois la brique déchiffrée comme expliqué ici avant de continuer la procédure

Limites

Il est important de se rappeler les limites d'une telle méthode. Si un attaquant obtient un accès root au système, il peut obtenir la clé de chiffrement (dmsetup table –showkeys) et n'a plus besoin de découvrir la phrase de passe. Il est également possible de récupérer la clé de chiffrement en mémoire via dump de la mémoire après redémarrage.

Dans tous les cas, ça rend l'opération plus compliqué que simplement partir avec la machine, donc c'est bien mais ça a ses limites.

À noter aussi, Mandos peut servir à automatiser l'opération.

debian-fde-dropbear.1514653858.txt.gz · Dernière modification : 2017/12/30 17:10 de aurelien