Aller au contenu

Annexe – Scripts de sauvegarde automatique (Bash)

BTS SIO SISR 1re année – Bloc 1 – S11

Script du TP : sauvegarde-configs.sh

C'est le script installé à l'étape 1 du TP. Il archive /etc/apache2, calcule l'empreinte, tient un journal et conserve les 14 dernières sauvegardes. Pour sauvegarder d'autres dossiers, modifie la liste SOURCES.

#!/bin/bash
# Sauvegarde des configurations (TP S11)
# Usage : sudo /usr/local/bin/sauvegarde-configs.sh
# Rôle  : archive les dossiers listés, calcule une empreinte, journalise,
#         conserve les 14 dernières sauvegardes.

set -u

SOURCES=("/etc/apache2")                 # dossiers à sauvegarder
DEST="/var/backups/configs"              # dossier des sauvegardes
CONSERVER=14                             # nombre de sauvegardes gardées
LOG="$DEST/sauvegarde.log"

mkdir -p "$DEST"
chmod 750 "$DEST"

DATE=$(date +%Y%m%d-%H%M%S)
ARCHIVE="configs-$DATE.tar.gz"

journal() { echo "$(date '+%F %T') $*" | tee -a "$LOG"; }

journal "Début de la sauvegarde ($ARCHIVE)"

# Archive : -C / pour stocker des chemins relatifs (etc/apache2/...)
dossiers=()
for s in "${SOURCES[@]}"; do dossiers+=("${s#/}"); done
if ! tar -czf "$DEST/$ARCHIVE" -C / "${dossiers[@]}" 2>>"$LOG"; then
    journal "ERREUR : la création de l'archive a échoué"
    exit 1
fi

# Empreinte (nom de fichier relatif, pour 'sha256sum -c' depuis le dossier)
( cd "$DEST" && sha256sum "$ARCHIVE" > "${ARCHIVE%.tar.gz}.sha256" )
chmod 640 "$DEST/$ARCHIVE" "$DEST/${ARCHIVE%.tar.gz}.sha256"

journal "Archive créée : $(du -h "$DEST/$ARCHIVE" | cut -f1)"

# Rotation : on garde les $CONSERVER plus récentes
cd "$DEST" || exit 1
ls -1t configs-*.tar.gz 2>/dev/null | tail -n +$((CONSERVER + 1)) | while read -r vieux; do
    rm -f "$vieux" "${vieux%.tar.gz}.sha256"
    journal "Ancienne sauvegarde supprimée : $vieux"
done

journal "Fin de la sauvegarde"

Pour aller plus loin : sauvegarder des équipements réseau

Exemple de principe (équipements Cisco par SSH avec expect). Non utilisé dans le TP : il demande des équipements joignables et le paquet expect. Le mot de passe en clair n'est là que pour l'exemple : en production, on utilise une clé SSH ou un coffre de secrets.

#!/bin/bash
# ═══════════════════════════════════════════════════════════════════
# Script : backup_configs.sh
# Auteur : [Votre nom]
# Date   : 2024-11-15
# Rôle   : Sauvegarde automatique des configurations réseau
# Usage  : ./backup_configs.sh
# Cron   : 0 2 * * * /backup/scripts/backup_configs.sh (tous les jours 2h)
# ═══════════════════════════════════════════════════════════════════

# ─── Configuration ───
BACKUP_DIR="/backup/configs"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="$BACKUP_DIR/backup.log"

# Liste des équipements à sauvegarder (IP + nom)
declare -A EQUIPEMENTS=(
    ["192.168.1.1"]="Switch-Core1"
    ["192.168.1.2"]="Switch-Distrib-RH"
    ["192.168.1.254"]="Routeur-Principal"
)

# Identifiants (À SÉCURISER — utiliser vault ou clé SSH)
USERNAME="admin"
PASSWORD="password"  # NE PAS stocker en clair en production

# ─── Fonction de sauvegarde ───
backup_device() {
    local IP=$1
    local NAME=$2
    local FILENAME="${BACKUP_DIR}/${NAME}/config_${NAME}_${DATE}.txt"

    echo "[$(date)] Sauvegarde de ${NAME} (${IP})..." | tee -a "$LOG_FILE"

    # Créer le dossier si inexistant
    mkdir -p "${BACKUP_DIR}/${NAME}"

    # Méthode 1 : TFTP (si le switch supporte)
    # (nécessite un serveur TFTP configuré)

    # Méthode 2 : SSH avec expect (exemple Cisco)
    expect << EOF > "$FILENAME"
        spawn ssh ${USERNAME}@${IP}
        expect "Password:"
        send "${PASSWORD}\r"
        expect "#"
        send "terminal length 0\r"
        expect "#"
        send "show running-config\r"
        expect "#"
        send "exit\r"
        expect eof
EOF

    # Vérifier que le fichier a été créé
    if [ -f "$FILENAME" ]; then
        echo "[$(date)] [OK] ${NAME} sauvegardé : ${FILENAME}" | tee -a "$LOG_FILE"
    else
        echo "[$(date)] [ERREUR] Erreur sauvegarde ${NAME}" | tee -a "$LOG_FILE"
    fi
}

# ─── Boucle sur tous les équipements ───
echo "═══════════════════════════════════════════════════" | tee -a "$LOG_FILE"
echo "Début de sauvegarde automatique — ${DATE}" | tee -a "$LOG_FILE"
echo "═══════════════════════════════════════════════════" | tee -a "$LOG_FILE"

for IP in "${!EQUIPEMENTS[@]}"; do
    backup_device "$IP" "${EQUIPEMENTS[$IP]}"
done

# ─── Nettoyage (garder seulement les 30 dernières sauvegardes) ───
find "$BACKUP_DIR" -name "config_*.txt" -mtime +30 -delete

echo "[$(date)] Nettoyage effectué (configs > 30 jours supprimées)" | tee -a "$LOG_FILE"
echo "═══════════════════════════════════════════════════" | tee -a "$LOG_FILE"