Changer de mot de passe avec cryptsetup

J’utilise pour certaines de mes sauvegardes des containers (fichiers) chiffrés avec cryptsetup et ensuite formatés en ext3 ou vfat. Jusque là, rien que du classique si ce n’est qu’il faut au préalable faire reconnaître ce fichier ‘normal’ en question comme un fichier de type ‘bloc’ via la commande losetup

LOOP=$(sudo losetup -f)
sudo losetup $LOOP space/$CONTAINER.dsk

Là où cela devient plus complexe, c’est que le tout se trouve sur une machine à l’autre bout de la France (et potentiellement du monde) et est donc exploité via sshfs, donc comme un partage réseau en quelque sorte.

sshfs user@machine:/space space -o allow_other

Plutôt que de gérer les containers chiffrés directement sur la machine distante, et donc de risquer encore plus une compromission des clés de chiffrement des sauvegardes, je les gère de chez moi via sshfs. Et c’est lent, très lent…

Lent pour créer le fichier container, mais ça on peut le faire sur la machine distante avec la commande dd :

ssh user@machine dd if=/dev/zero of=/space/$CONTAINER.dsk bs=1M count=4900

Très lent aussi pour ensuite formater le container une fois celui-ci monté/chiffré (losetup/cryptsetup) :

sudo cryptsetup luksOpen $LOOP $CONTAINER --key-file $CONTAINER.passwd
sudo mkfs.ext3 /dev/mapper/$CONTAINER

Plutôt que de passer mon temps (et celui de ma machine) à formater via sshfs mes containers, j’en fait un appelé model.dsk . Ensuite, il me reste à le duplique sous le nom d’une container puis de modifier la clé de chiffrement associée à ce container (et oui, elles sont différentes chez moi ;-).

La duplication est une copie sur la machine distante :

cp model.dsk $CONTAINER.dsk

Et le changement de mot de passe se fait avec ces commandes :

LOOP=$(sudo losetup -f)
sudo losetup $LOOP space/$CONTAINER.dsk
sudo cryptsetup luksAddKey --key-file model.passwd --key-slot 1 $LOOP $CONTAINER.passwd
sudo cryptsetup luksKillSlot --key-file $CONTAINER.passwd $LOOP 0
sleep 5
sudo losetup -d $LOOP

Bon, je rajoute une difficulté, pour l’exercice de style, positionner la clé qui m’intéresse sur le slot 0… qui est déjà occupé :

LOOP=$(sudo losetup -f)
sudo losetup $LOOP space/$CONTAINER.dsk
sudo cryptsetup luksAddKey --key-file model.passwd --key-slot 1 $LOOP temp.passwd
sudo cryptsetup luksKillSlot --key-file temp.passwd $LOOP 0
sudo cryptsetup luksAddKey --key-file temp.passwd --key-slot 0 $LOOP $CONTAINER.passwd
sudo cryptsetup luksKillSlot --key-file $CONTAINER.passwd $LOOP 1
sleep 5
sudo losetup -d $LOOP

Et voila :-)