Table des matières

Linux : le fourre-tout

sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y && sudo apt clean -y && sudo reboot

Scripts

Sauvegarde sécurisée sur clé USB chiffrée

Il est recommandé de stocker le script à l'emplacement suivant : /usr/local/bin/sync_luks_usb.sh

Ouvrez votre éditeur de texte favori avec les privilèges root et créez le fichier de script : sudo nano /usr/local/bin/sync_luks_usb.sh

Pour trouver l'UUID d'une disque dur ou d'une clé USB : lsblk -o UUID,NAME,SIZE,MOUNTPOINT

Pour suivre l'activité du script, nous allons créer un fichier de log. L'emplacement recommandé est : /var/log/custom/sync_luks_usb.log

Nous allons configurer les permissions pour renforcer la sécurité des logs et du script. Exécutez les commandes suivantes :

# Créer le répertoire pour les logs
sudo mkdir -p /var/log/custom

# Configurer les permissions sur le répertoire des logs
sudo chmod 700 /var/log/custom

# Créer le fichier de log
sudo touch /var/log/custom/sync_luks_usb.log

# Configurer les permissions sur le fichier de log
sudo chmod 600 /var/log/custom/sync_luks_usb.log

Il est crucial de s'assurer que seule l'utilisateur root peut exécuter le script et lire les logs :

# Changer le propriétaire du script
sudo chown root:root /usr/local/bin/sync_luks_usb.sh

# Rendre le script exécutable uniquement par root
sudo chmod 700 /usr/local/bin/sync_luks_usb.sh

# Rendre le fichier de log lisible uniquement par root
sudo chmod 600 /var/log/custom/sync_luks_usb.log

Vous pouvez exécuter le script avec la commande suivante : sudo /usr/local/bin/sync_luks_usb.sh

sync_luks_usb.sh
#!/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"