[Résolu]Démarrage partition chiffrée avec clé / mot de passe

Bonjour,

j’ai récemment installé une Debian sur des partitions chiffrées avec cryptsetup et LUKS.

[b]Je souhaiterais pouvoir démarrer sur la partition que laquelle est montée la racine du système, soit :

  • Par le biais d’une clé, placé sur un support amovible (cela j’y parviens)
  • OU en saisissant un mot de passe si la clé est introuvable.

Quelqu’un pourrait m’aider svp ?
[/b]

J’ai comme partions lvm, dans le conteneur LUKS:

  • Une partition root
  • Une partition de données (je crée des liens depuis le /home vers les fichiers de cette partition.
  • Une swap
  • Deux partitions vides destinées à tester des distributions.

J’ai ajouté une clé dans un slot de la partition root. Pour booter sur la partition root, j’ai récupéré un script, appelé dans /etc/crypttab, qui récupère la clé et la fournit (via un echo) à cryptsetup au démarrage. Cela se passe sans problème.

En revanche si la clé est absente, le démarrage s’interrompt et j’obtiens le message d’erreur “cryptsetup : cryptsetup failed, bad password or options ?” puis une invite sur ce qui me semble être la console busybox ou initramfs.

En examinant plusieurs tutoriels (références en bas de page) je ne suis pas parvenu à trouver une solution à ce problème.

Auriez-vous une solution oou des pistes à examiner s’il-vous-plaît ?

Ci-dessous :

  • le contenu du fichier /etc/crypttab (les lignes précédée d’un # correspondent à des tentatives infructueuses

# <target name> <source device> <key file> <options> tank UUID=61a4c4e4-708d-4012-a7df-fc7bae0e8391 tank.key luks,keyscript=/etc/initramfs-tools/scripts/tank.sh #tank UUID=61a4c4e4-708d-4012-a7df-fc7bae0e8391 none luks,keyscript=/etc/initramfs-tools/scripts/tank.sh #tank UUID=61a4c4e4-708d-4012-a7df-fc7bae0e8391 tank.key luks,tries=1,timeout=3 #tank UUID=61a4c4e4-708d-4012-a7df-fc7bae0e8391 UUID=a248a493-7ae2-448d-87f1-084da8057994:tank.key luks,keyscript=/etc/initramfs-tools/scripts/tank.sh #tank UUID=61a4c4e4-708d-4012-a7df-fc7bae0e8391 UUID=a248a493-7ae2-448d-87f1-084da8057994:tank.key luks sav UUID=90e1c47b-5173-498d-89d9-fedaf20986bb savLx0.key luks,keyscript=/etc/initramfs-tools/scripts/savLx0.sh

  • Le script appelé dans /etc/crypttab et situé dans /etc/initramfs-tools/scripts

[code]#!/bin/sh

Modif en statique

mkdir /keyTmpMnt 2>/dev/null
mount UUID=a248a493-7ae2-448d-87f1-084da8057994 /keyTmpMnt -t ext4 2>/dev/null
cat /keyTmpMnt/LUKS/tank.key 2>/dev/null
umount /keyTmpMnt 2>/dev/null
rmdir /keyTmpMnt 2>/dev/null

exit

Principe : Monter la partition contenant la clé du conteneur LUKS et la lire

Définition des variables

tmpMnt="/keyTmpMnt"
keyDev=""
keyPath="LUKS"
keyFile="tank.key"
keyPartUUID="a248a493-7ae2-448d-87f1-084da8057994"
keyPartfs="ext4"
keybool=0 # flag indiquant si la clé a été lue ou non

Extraction du dev correspondant à l’UUID de la partition contenant la clé

keyDev=$(blkid | grep $keyPartUUID | cut -d: -f1)

chargement des modules nécessaires

modprobe usb-storage >/dev/null 2>&1
modprobe ext2 >/dev/null 2>&1

Création d’un répertoire temporaire (s’il n’existe pas déjà) où monter la partition contenant la clef

if test ! -d $tmpMnt; then
mkdir $tmpMnt 2>/dev/null
echo "Création du point de montage"
else
echo “Point de montage préexistant”

fi

Montage de la partition si ce n’est pas déjà fait.

if test “$(mount -l | grep $tmpMnt | wc -m)” -eq 0; then
#mount $keyDev $tmpMnt -t $keyPartfs -o ro 2>/dev/null
#Modif
mount $keyDev $tmpMnt
echo "Montage de la partition contenant la clé"
else
echo "Partition déjà montée"
fi

Affichage de la clé

if test -f $tmpMnt/$keyPath/$keyFile; then
cat $tmpMnt/$keyPath/$keyFile 2>/dev/null
keybool=1
echo "Le conteneur LUKS est ouvert"
else
# Tentative de saisie du mot de passe
echo -n "Essai de saisie du mot de passe: " >&2
read -r A
echo -n "$A"
fi

#~ # Nettoyage
sleep 1
umount $tmpMnt 2>/dev/null
rmdir $tmpMnt 2>/dev/null

#~ # Tentative de saisie du mot de passe
#~ if test $keybool -eq 0; then
#~ echo -n "Essai de saisie du mot de passe: " >&2
#~ read -r A
#~ echo -n “$A”
#~ fi
[/code]

Je suis à votre disposition pour vous communiquer toute information complémentaires.

Par avance merci :slightly_smiling:

PS: Liste non exhaustive des tutoriels consultés :

Je poste juste pour prévenir que je poste sur debian-facile.org

Tu peux nous donner un lien direct vers la discussion sur debian-facile ?
Ça nous évitera de te poser des questions ici auxquelles tu aurais déjà répondu là-bas.

Bonjour,

merci de ton attention : debian-facile.org/viewtopic.php?id=10744

up. svp.

Je ne connais pas grand-chose à cryptsetup, mais cette partie du script semble faire ce que tu demandes :

[code]# Affichage de la clé
if test -f $tmpMnt/$keyPath/$keyFile; then
cat $tmpMnt/$keyPath/$keyFile 2>/dev/null
keybool=1
echo "Le conteneur LUKS est ouvert"
else

Tentative de saisie du mot de passe

echo -n "Essai de saisie du mot de passe: " >&2
read -r A
echo -n "$A"
fi[/code]
Par contre ce code n’est jamais exécuté puisque le script, un peu après “modif en statique”, s’arrête sur une commande “exit”. Est-ce toi qui as modifié le script ?

Bonjour Pascal,

MERCI BEAUCOUP !

Je n’avais pas vu cet “exit”, j’aurais pu tourner longtemps en rond sur ce problème.

Une fois cet exit enlevé, je rencontre plusieurs problèmes de script. Je tâche de les corriger et de poster le bon script en espérant que cela puisse serir à quelqu’un.

Je n’ai pas regardé dans le détail, mais j’ai l’impression qu’il y a deux scripts indépendants en un, séparés par la commande exit ; le premier est une version simplifiée et linéaire de la seconde. Il ne suffit pas de supprimer cet exit : il faut choisir entre les deux versions du script.

Par ailleurs je pense qu’il manque une redirection vers la sortie d’erreur dans certaines commandes echo pour afficher des messages sur la console, la sortie standard étant redirigée vers cryptsetup et ne devant donc transmettre que la clé de déchiffrement.

Oui, il y a effectivement deux parties dans le script indépendantes l’une de l’autre. J’avais commencé à écrire le script configurable et n’arrivant pas à le faire fonctionné j’ai fait une partie en statique pour pouvoir booter. Tout cela me revient maintenant. Là j’essaie de corriger la seconde partie en commentant la première.

Considérant le second point, j’y suis effectivement allé “à la truelle” pour les redirections. Je note ton point et je modifierais le script dans ce sens et avec les capacités que j’ai en bash.

Merci encore de tes remarques.

Bonjour,

Je me réponds à moi-même en éspérant que cela peut servir à quelqu’un d’autre.

Mon problème venait du fait que le script utilisé était incorrect. J’ai donc corrigé le script et mon problème est maintenant corrigé.

Ma situation est la suivante :

  • J’ai chiffré l’ensemble des partitions utilisées par Linux (OS, données et swap). L’ensemble des partitions est situé dans un conteneur LUKS
  • J’ai mis sur une clé USB la partition de boot et les clés permettant de déchiffrer les partitions.
  • Je cherche à pouvoir déchiffrer le conteneur LUKS avec (en laissant la clé USB après le démarrage) ou sans clé (en l’enlevant juste après le chargement du noyau)

La solution consiste à s’appuyer sur un script bash.

Les étapes de la mise en place sont les suivantes :

  • Ajouter dans le fichier /etc/crypttab une ligne de décryptage du conteneur LUKS en précisant l’adresse d’un script et la clé (je pense que ce dernier point est inutile)
  • Ajouter un script (nommé ici tank.sh) dans /etc/initramfs-tools/scripts. Le script est ci-dessous
#!/bin/sh

# Principe : Monter la partition contenant la clé du conteneur LUKS et la lire

# Définition des variables
tmpMnt="/keyTmpMnt"									# Répertoire temporaire sur lequel est montée le périphérique amovible contenant la clé
keyDev=""											# Point de montage
keyPath="LUKS"										# Répertoire contenant la clé
keyPartUUID="a248a493-7ae2-448d-87f1-084da8057994"	# UUID de la partition contenant la clé
keyPartfs="ext4"									# Système de fichier de la partition contenant la clé 
keyFile="tank.key"									# nom du fichier contenant la clé

# On laisse l'ensemble des partitions être prises en compte
sleep 1

# Extraire le point de montage sur lequel la clé est
keyDev=$(blkid | grep "$keyPartUUID" | cut -d: -f1)

# Si le répertoire temporaire de montage de la partition contenant la clé n'existe pas, on le créé
if test ! -d "$tmpMnt"; then
	mkdir "$tmpMnt" 2>/dev/null
fi

# On vérifie que ni la partition contenant la clé, ni le répertoire de montage ne sont montés
if ! $(mount | grep "$tmpMnt") && ! $(mount | grep "$keyDev"); then
	
	# On monte la partition contenant la clé sur le répertoire temporaire de montage
	mount "$keyDev" "$tmpMnt" -t ext4 2>/dev/null
	
	# Si on peut lire la clé, on l'affiche et on la transmet à cryptsetup
	if test -f "$tmpMnt/$keyPath/$keyFile"; then
		cat "$tmpMnt/$keyPath/$keyFile"
	else
	# Sinon, on demande la saisie du mot de passe
		echo "Pas de clé valide trouvée" >&2
		echo -n "Saisie du mot de passe : " >&2
		read -s -r A
		#~ read -r A
		echo -n "$A"
	fi 

else
	echo "Impossible de monter le périphérique sur son point de montage" >/dev/null 2>&1
fi

sleep 1
umount "$tmpMnt" #2>/dev/null
rmdir "$tmpMnt" #2>/dev/null
  • mettre à jour l’initramfs de la manière habituelle :

Le problème n’est pas intégralement résolu car lors de la mise à jour de l’initramfs, j’obtiens les messages suivants :

/var/tmp/mkinitramfs_Xtmv5f/scripts/old/tank.sh: 31: /var/tmp/mkinitramfs_Xtmv5f/scripts/old/tank.sh: /dev/sdd4: Permission denied Pas de clé valide trouvée Saisie du mot de passe : /var/tmp/mkinitramfs_Xtmv5f/scripts/old/tank.sh: 43: read: Illegal option -s update-initramfs: Generating /boot/initrd.img-3.2.0-4-amd64 /var/tmp/mkinitramfs_NZSiXA/scripts/old/tank.sh: 31: /var/tmp/mkinitramfs_NZSiXA/scripts/old/tank.sh: /dev/sdd4: Permission denied Pas de clé valide trouvée Saisie du mot de passe : /var/tmp/mkinitramfs_NZSiXA/scripts/old/tank.sh: 43: read: Illegal option -s

Cependant, en dépit de ce message, le problème est corrigé. Cela fonctionne depuis plusieurs semaines de mon côté. Ainsi, si je laisse la clé USB branchée, le système décrypte les partitions et se lance et s’il n’y a pas de clé, le système demande de la saisir.