Files
docudjeex/content/fr/5.nonsense/3.bash/2.luks-backup.md
T

87 lines
3.4 KiB
Markdown

---
title: Luks backup
description: Un script bash pour extraire automatiquement les headers LUKS de tous les disques chiffrés, les identifier par numéro de série et les archiver de façon chiffrée.
---
:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
Je me suis rendu compte il y a peu qu'il ne suffisait pas d'avoir le mot de passe pour deverouiller un volume luks apres une panne ou une corruption. J'ai ainsi appris à dump les headers luks des disques/volumes et à utiliser les numéros de série + noms de partitions pour pouvoir bien identifier quel header correspond à quel disque/partition (j'en ai 10 !).
Après avoir bien galéré à la main, j'avoue avoir demandé à Qwen3 (llm hebergé sur ma RTX 5090) de me faire un script qui automatise le listing et identification des disques, dump les headers et les stock dans une archive chiffrée prete à etre backupée sur mon serveur de sauvegarde.
Ainsi, ce script :
* Liste et identifie les disques avec leur numéro de série
* Liste les partition
* Dump les headers dans un dossier dans `/root` (dossier sécurisé)
* Cree une archive temporaire
* Prompt pour saisir un mot de passe
* Chiffre avec le mot de passe
* Détruit l'archive non chiffrée
```bash [Terminal]
#!/bin/bash
# Dossier où seront sauvegardés les headers LUKS
DEST="/root/luks-headers-backup"
mkdir -p "$DEST"
echo "🔍 Recherche des conteneurs LUKS sur toutes les partitions..."
# Parcourt toutes les partitions disque possibles (y compris NVMe et SATA)
for part in /dev/sd? /dev/sd?? /dev/nvme?n?p?; do
# Ignore si le périphérique n'existe pas
if [ ! -b "$part" ]; then
continue
fi
# Vérifie si la partition est un volume chiffré LUKS
if cryptsetup isLuks "$part"; then
# Trouve le disque parent (ex. nvme0n1p4 → nvme0n1)
disk=$(lsblk -no pkname "$part" | head -n 1)
full_disk="/dev/$disk"
# Récupère le numéro de série du disque parent
SERIAL=$(udevadm info --query=all --name="$full_disk" | grep ID_SERIAL= | cut -d= -f2)
if [ -z "$SERIAL" ]; then
SERIAL="unknown"
fi
# Extrait le nom de la partition (ex. nvme0n1p4)
PART_NAME=$(basename "$part")
# Construit le nom du fichier de sortie avec le nom de partition et le numéro de série
OUTPUT="$DEST/luks-header-${PART_NAME}__${SERIAL}.img"
echo "🔐 Sauvegarde du header LUKS de $part (Numéro de série : $SERIAL)..."
# Sauvegarde le header LUKS dans le fichier de sortie
cryptsetup luksHeaderBackup "$part" --header-backup-file "$OUTPUT"
if [[ $? -eq 0 ]]; then
echo "✅ Sauvegarde réussie → $OUTPUT"
else
echo "❌ Échec de la sauvegarde pour $part"
fi
fi
done
# Crée une archive tar compressée et horodatée de toutes les sauvegardes de headers
ARCHIVE_NAME="/root/luks-headers-$(date +%Y%m%d_%H%M%S).tar.gz"
echo "📦 Création de l'archive $ARCHIVE_NAME..."
tar -czf "$ARCHIVE_NAME" -C "$DEST" .
# Chiffre l'archive symétriquement avec GPG et le chiffrement AES256
echo "🔐 Chiffrement de l'archive avec GPG..."
gpg --symmetric --cipher-algo AES256 "$ARCHIVE_NAME"
if [[ $? -eq 0 ]]; then
echo "✅ Archive chiffrée créée : ${ARCHIVE_NAME}.gpg"
# Supprime l'archive non chiffrée pour plus de sécurité
rm -f "$ARCHIVE_NAME"
else
echo "❌ Échec du chiffrement"
fi
```
Ne pas oublier de backup `/etc/fstab` et `/etc/crypttab` !