#!/bin/bash # ============================================================================ # Script de synchronisation sécurisée vers une clé USB chiffrée avec LUKS # - Vérifie les prérequis (droits root, outils, dossiers) # - Détecte automatiquement une clé USB connue via UUID # - Déverrouille, monte, synchronise avec rsync, démonte et ferme # ============================================================================ # 📁 Déclaration des emplacements SOURCE_DIRS=("/home/exemple_1" "/home/exemple_2" "/home/dossier/exemple_3") MOUNT_POINT="/media/usb_media" MAPPER_NAME="encrypted_usb_media" LOG_FILE="/var/log/custom/sync_luks_usb.log" # 🧩 Liste des UUIDs connues pour les clés USB KNOWN_UUIDS=("1234-ABCD" "5678-EFGH" "90AB-CDEF") # 🔐 Vérification que le script est exécuté en tant que root if [ "$EUID" -ne 0 ]; then echo "❌ Ce script doit être exécuté avec des droits root. Utilisez 'sudo' pour l'exécuter." exit 1 fi # 📦 Vérifie si rsync est installé, sinon tente une installation automatique command -v rsync >/dev/null 2>&1 || { echo "❌ rsync n'est pas installé. Installation en cours..." sudo apt update && sudo apt install -y rsync if [ $? -ne 0 ]; then echo "❌ Échec de l'installation de rsync. Veuillez l'installer manuellement." exit 1 fi } # 🔐 Vérifie si cryptsetup est installé, sinon tente une installation automatique command -v cryptsetup >/dev/null 2>&1 || { echo "❌ cryptsetup n'est pas installé. Installation en cours..." sudo apt update && sudo apt install -y cryptsetup if [ $? -ne 0 ]; then echo "❌ Échec de l'installation de cryptsetup. Veuillez l'installer manuellement." exit 1 fi } # 📁 Vérifie que les dossiers source existent for dir in "${SOURCE_DIRS[@]}"; do if [ ! -d "$dir" ]; then echo "❌ Le dossier source '$dir' n'existe pas." exit 1 fi done # 📝 Vérifie que le répertoire de logs existe, sinon le créer if [ ! -d "/var/log/custom" ]; then echo "🔧 Création du répertoire de logs /var/log/custom..." sudo mkdir -p /var/log/custom sudo chmod 700 /var/log/custom fi # 🕒 Timestamp pour les logs TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") # 🔍 Recherche automatique de clés USB connues via UUID echo "🔍 Recherche de clés USB connues..." for uuid in "${KNOWN_UUIDS[@]}"; do USB_DEVICE=$(lsblk -o NAME,UUID | grep "$uuid" | awk '{print $1}') if [ -n "$USB_DEVICE" ]; then echo "✅ Clé USB connue détectée : /dev/$USB_DEVICE (UUID: $uuid)" break fi done # 🧑‍💻 Si aucune clé connue détectée, demande manuelle à l'utilisateur if [ -z "$USB_DEVICE" ]; then echo "❌ Aucune clé USB connue détectée." echo "📋 Liste des périphériques USB disponibles :" lsblk -o NAME,SIZE,TYPE,MOUNTPOINT | grep -E 'sd[b-z][0-9]*' echo "" read -p "👉 Entrez le nom du périphérique USB à utiliser (ex: sdb1) : " USB_DEVICE fi # 📦 Vérifie que le périphérique existe if [ ! -b "/dev/$USB_DEVICE" ]; then echo "❌ Le périphérique /dev/$USB_DEVICE n'existe pas." echo "$TIMESTAMP - Erreur : périphérique /dev/$USB_DEVICE introuvable." >> "$LOG_FILE" exit 1 fi # 🔎 Vérifie que la partition est chiffrée avec LUKS echo "🔎 Vérification du chiffrement LUKS..." if ! sudo cryptsetup isLuks "/dev/$USB_DEVICE"; then echo "❌ La partition /dev/$USB_DEVICE n'est pas chiffrée avec LUKS. Synchronisation annulée." echo "$TIMESTAMP - Annulation : /dev/$USB_DEVICE n'est pas chiffrée avec LUKS." >> "$LOG_FILE" exit 1 fi # 🔐 Déverrouillage de la partition chiffrée avec le mot de passe LUKS echo "🔐 Veuillez entrer le mot de passe LUKS pour /dev/$USB_DEVICE :" sudo cryptsetup open "/dev/$USB_DEVICE" "$MAPPER_NAME" if [ $? -ne 0 ]; then echo "❌ Échec du déverrouillage LUKS." echo "$TIMESTAMP - Échec du déverrouillage LUKS pour /dev/$USB_DEVICE." >> "$LOG_FILE" exit 1 fi # 📁 Création du point de montage si nécessaire sudo mkdir -p "$MOUNT_POINT" # 📦 Montage de la partition déverrouillée echo "📦 Montage de la clé USB..." sudo mount "/dev/mapper/$MAPPER_NAME" "$MOUNT_POINT" if [ $? -ne 0 ]; then echo "❌ Échec du montage." echo "$TIMESTAMP - Échec du montage de /dev/mapper/$MAPPER_NAME." >> "$LOG_FILE" sudo cryptsetup close "$MAPPER_NAME" exit 1 fi # 🔄 Synchronisation des fichiers avec rsync for dir in "${SOURCE_DIRS[@]}"; do echo "🔄 Synchronisation en cours de '$dir' vers '$MOUNT_POINT/server_backup/'..." rsync -av --delete "$dir" "$MOUNT_POINT/server_backup/" >> "$LOG_FILE" 2>&1 done # 📤 Démontage et fermeture de la partition echo "📤 Démontage et fermeture de la partition..." sudo umount "$MOUNT_POINT" sudo cryptsetup close "$MAPPER_NAME" sudo rmdir "$MOUNT_POINT" 2>/dev/null # ✅ Fin du script echo "✅ Synchronisation terminée avec succès." echo "$TIMESTAMP - Synchronisation réussie vers /dev/$USB_DEVICE." >> "$LOG_FILE"