Chiffrement des partitions LVM avec déchiffrement à distance#

Les différentes machines basées sous linux que j’utilise sont configurés avec LVM pour le partitionnement. La flexibilité de cette technologie permet de s’adapter aux différents besoins des applications installées dessus. De plus, je souhaite que les données disponibles sur les serveurs ne soit pas lisible lorsque le serveur est éteint.

Voici ce que nous allons faire : créer un nouveau serveur sur une base Debian, crée une partition chiffrée avec crypto_LUKS et utiliser LVM sur cette partition chiffrée pour séparer quelques points de montage traditionnel.

Point culture : la problèmatique !

Lors du démarrage d’un serveur, le matériel physique va lire les premiers octets de données du disque. Ces données vont lui expliquer les premières actions qu’il doit exécuter. Communément appelée boot loader (le plus connu GNU GRUB) va permettre de charger différents éléments pour que le système d’exploitation puisse se lancer.

Généralement, la partition (/boot) n’est pas, ou ne doit pas être chiffré. Car, si cette partition est chiffrée et nécessite qu’elle soit déchiffrée, le matériel physique ne va pas savoir quoi faire, car les données ne sont pas compréhensibles (chiffré) pour lui. Et donc ne va rien faire. Il existe, cependant, différentes techniques pour chiffrer et déchiffrer cette partition. Mais il n’y a pas, dans la majorité des cas, de plus value à chiffrer cette partition.

Une fois que le boot loader est chargé, il va vouloir déchiffrer notre partition chiffré où se situe notre système d’exploitation. Le boot loader étant le plus léger possible pour remplir ces missions, il ne possède pas d’application. Notre seul option que nous avons est d’utiliser un périphérique d’entrée physique (clavier), connecté au serveur pour entrer la phrase de passe pour déchiffrer cette partition, lancer le système d’exploitation et accéder à un serveur SSH par exemple.

On se retrouve donc coincé à être à côté de notre serveur lorsqu’on le redémarre !

Sauf si on exécute un serveur SSH léger en même temps que le boot loader. Et ainsi avoir un terminal distant pouvant renseigner la phrase de passe pour déchiffrer la partition du système d’exploitation.

C’est ce que nous allons voir tout de suite.

Installation standard Debian#

L’essential à savoir avec Debian, donnant une base de connaissance sur l’environnement est disponible à cette adresse : Manuel d’installation pour la distribution Debian GNU/Linux.

Nous allons suivre avec des valeurs par défaut les indications du manuel des composants de l’installateur.

  • L’installateur Debian et la configuration du matériel
  • Création des utilisateurs et des mots de passe
  • Configuration de l’horloge et du fuseau horaire

Partitionnement et points de montage#

Un point d’attention ici !

Nous allons prendre le schéma de partition suivant :

├─   1 Mb           biosgrub      -
├─ 600 Mb           ESP           -
├─   1 Gb           ext2          /boot
└─ xxx Gb           crypto_LUKS   -         (used by LVM)
 ├─ Volume group 01                         (vg_00)
   ├─  8 Gb         swap          -         (lv_swap)
   ├─  8 Gb         xfs           /         (lv_root)
   ├─  2 Gb         xfs           /home     (lv_home)
   ├─ 50 Gb         xfs           /var      (lv_var)
   ├─  1 Gb         xfs           /var/log  (lv_var_log)
   └─  1 Gb         xfs           /tmp      (lv_tmp)

Info : Réaliser le partitionnement dans l’ordre. L’installateur peut se bloquer si on renviens en arrière sur des actions comme la définition d’un volume physique LVM sur la partition crypto_LUKS. Préférez recommencer l’installation en redémarrant le serveur.

Terminer l’installation#

Continuer l’installation standard de la distribution. Selon les besoins des applications, vous pouvez pré-installer des outils/logiciels. Il est récommandé d’installer uniquement à minima un serveur SSH (pour l’accès à distance) et d’ajouter au fur et à mesure des besoins les outils nécessaires.

  • L’installation du système de base
  • Installation de logiciels supplémentaires
  • Rendre le système amorçable
  • La fin de l’installation

Valider l’installation#

Une fois démarré, tenter un redémarrage du système pour valider de bout en bout la configuration (déchiffrement + connexion SSH).

A ce niveau, vous avez une installation de base d’un Debian.

Déchiffrement de la partition à distance#

L’utilitaire dropbear est un serveur et client SSH très minimaliste. Il va être exécuté lors du démarrage du serveur avec le boot loader.

Lancer les commandes suivantes pour l’initialisation de base :

apt install wget busybox dropbear*
systemctl stop dropbear
systemctl disable dropbear

On installe aussi la boîte à outil busybox qui nous premettra d’avoir la capacité d’exécuter quelques commandes aussi. Cependant, on ne souhaite pas que dropbear soit exécuté au lancement du système d’exploitation. On le désactivera avec systemd.

Pour sécuriser l’accès au déchiffrement de la partition, on va privilégié l’authentification avec une paire de clé.

On va donc rajouter notre clé publique (le plus souvent disponbile ~/.ssh/id_rsa.pub, il faut en générer une sinon) et ajouter le contenu dans le fichier /etc/dropbear/initramfs/authorized_keys.

cat ~/.ssh/id_rsa.pub >> /etc/dropbear/initramfs/authorized_keys
update-initramfs -u

On met à jour initramfs pour prendre en compte ces modifications. Plus d’information disponible ici Wiki debian - initramfs.

Le dernier point à réaliser est le suivant. Créer le script /etc/initramfs-tools/hooks/crypt_unlock.sh avec le contenu suivant pour permettre de déchiffrer la partition LVM via le terminal SSH.

#!/bin/sh
 
PREREQ="dropbear"
 
prereqs() {
echo "$PREREQ"
}
 
case "$1" in
prereqs)
prereqs
exit 0
;;
esac
 
. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions
 
if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF
 
chmod 755 "${DESTDIR}/bin/unlock"
 
mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF
 
chmod 755 "${DESTDIR}/lib/unlock/plymouth"
 
echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd
 
fi

Ajouter la permission d’exécution au script avec la commande suivante :

sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

Une fois à ce niveau, vous êtes prêt pour déchiffrer à distance votre partition LVM.

Liens additionnels#