Eseguire backup regolari del proprio hosting è una pratica essenziale per garantire la sicurezza e la protezione dei dati. In questo articolo viene illustrato come creare un backup crittografato di tutti i virtualhost presenti su una macchina utilizzando uno script Bash. Questo approccio consente di proteggere i dati sensibili, come i file dei siti web e i database, utilizzando crittografia sicura tramite OpenSSL.
Introduzione
Lo script presentato esegue backup completi e crittografati di tutti i file associati ai virtualhost Apache e dei relativi database MySQL. Per ogni sito, viene generato un archivio contenente i dati e i dump dei database, successivamente crittografati con chiavi asimmetriche. Questo garantisce che solo chi possiede la chiave privata possa decrittare e ripristinare i dati.
Prerequisiti
- OpenSSL: Assicurarsi che OpenSSL sia installato sulla macchina.
- MySQL/MariaDB: Lo script esegue il backup dei database MySQL o MariaDB, ma può essere adattato per altri tipi di database.
- Accesso root o privilegi sudo: Lo script richiede privilegi di amministratore per accedere ai file e ai database.
Preparazione: Generazione delle chiavi di crittografia
Prima di eseguire lo script, è necessario generare una coppia di chiavi RSA per la crittografia dei backup. Questa operazione può essere eseguita con il seguente comando:
openssl req -x509 -nodes -newkey rsa:2048 -keyout domains-key.priv.pem -out domains-key.pub.pem
Questo comando genera una chiave privata (domains-key.priv.pem
) e una chiave pubblica (domains-key.pub.pem
). La chiave pubblica viene utilizzata per crittografare i backup, mentre la chiave privata sarà necessaria per decrittarli.
Script di backup
Di seguito lo script per eseguire il backup:
#!/bin/bash
# ===== VARIABILI =====
DATE=`date +%Y-%m-%d-%H-%M-%S`
TARGET_FOLDER=/var/www_backups
PUBLIC_KEY=/root/domains-key.pub.pem
FILE_DB_PASSWORD=/root/.secrets/db_psswd.txt
DB_USER=root
DB_PASSWORD=$(cat ${FILE_DB_PASSWORD})
# ===== VERIFICO L'ESISTENZA DELLA CARTELLA DI BACKUP =====
if [ ! -d "$TARGET_FOLDER" ]; then
echo "La cartella di destinazione non esiste, la creo: $TARGET_FOLDER"
mkdir /var/www_backups
fi
# ===== VERIFICO L'ESISTENZA DELLA CHIAVE PUBBLICA =====
if [ ! -f "$PUBLIC_KEY" ]; then
echo "La chiave pubblica non esiste: $PUBLIC_KEY"
exit 1
fi
# ===== VERIFICO L'ESISTENZA DELLA PASSWORD DI ROOT =====
if [ ! -f "$FILE_DB_PASSWORD" ]; then
echo "Il file con la password di root non esiste: $FILE_DB_PASSWORD"
exit 1
fi
# ===== SCRIPT BACKUP DB =====
for dbname in $(mysql -u ${DB_USER} -p${DB_PASSWORD} -e 'show databases' -s --skip-column-names); do
if [ "$dbname" != "information_schema" ] && [ "$dbname" != "performance_schema" ] && [ "$dbname" != "mysql" ] && [ "$dbname" != "sys" ]; then
ARCHIVE_DB="${dbname}-dump-${DATE}.backup.sql.gz.enc"
mysqldump -u ${DB_USER} -p${DB_PASSWORD} --single-transaction --routines --events --triggers --complete-insert "$dbname" \
| gzip -9 -c \
| openssl smime -encrypt -binary -text -aes256 -out ${TARGET_FOLDER}/${ARCHIVE_DB} -outform DER ${PUBLIC_KEY}
fi
done
# ===== SCRIPT BACKUP FILES =====
for virtual_host in /etc/apache2/sites-available/*.conf; do
virtual_host=$(basename $virtual_host .conf)
if [ ! -d "/var/www/$virtual_host" ]; then
echo "La cartella /var/www/$virtual_host non esiste, passo al successivo"
continue
fi
ARCHIVE_FILES="${virtual_host}-files-${DATE}.backup.tar.gz.enc"
tar -cvpzf /root/${virtual_host}.${DATE}.tar.gz -C /var/www/ $virtual_host
openssl smime -encrypt -binary -text -aes256 -in /root/${virtual_host}.${DATE}.tar.gz -out ${TARGET_FOLDER}/${ARCHIVE_FILES} -outform DER ${PUBLIC_KEY}
rm /root/${virtual_host}.${DATE}.tar.gz
done
Spiegazione del codice
- Variabili: Le variabili definiscono la data e l'ora attuali (
DATE
), la cartella di destinazione del backup (TARGET_FOLDER
), il percorso della chiave pubblica (PUBLIC_KEY
) e il file che contiene la password del database MySQL (FILE_DB_PASSWORD
). - Verifica delle Cartelle e dei File: Prima di eseguire il backup, lo script verifica se la cartella di destinazione, la chiave pubblica e il file con la password del database esistono. Se la cartella non esiste viene creata, ma se la chiave pubblica o il file con la password non sono presenti, lo script termina con un messaggio di errore.
- Backup dei Database: Per ogni database, viene eseguito un dump tramite mysqldump, compresso con gzip e crittografato utilizzando la chiave pubblica. I file di backup vengono salvati nella cartella di destinazione.
- Backup dei File dei Virtualhost: Per ogni virtualhost configurato in Apache, viene creato un archivio compresso (tar.gz) contenente i file del sito web, crittografato con la chiave pubblica e salvato nella cartella di destinazione.
Ripristino dei backup
Per ripristinare i backup, è necessario decrittografare i file utilizzando la chiave privata. Ecco come eseguire il processo di decrittazione ed estrazione:
# DECRIPTAZIONE ED ESTRAZIONE
FILENAME=indicare_il_nome_del_file # ad esempio domain.local-files-2023-03-06-16-03-45.backup.tar
openssl smime -decrypt -in ${FILENAME}.gz.enc -binary -inform DER -inkey domains-key.priv.pem -out ${FILENAME}.gz
gzip -d ${FILENAME}.gz
tar -xvf ${FILENAME}
Considerazioni finali
Utilizzando questo script, è possibile eseguire backup regolari e crittografati di tutti i file e database ospitati su una macchina. La crittografia garantisce che i dati siano protetti da accessi non autorizzati, mantenendo al sicuro informazioni sensibili anche in caso di compromissione dei file di backup.
Questo script rappresenta una base solida per automatizzare il processo di backup su un hosting e può essere facilmente adattato a necessità specifiche, come l'invio di backup a un server remoto o l'aggiunta di notifiche in caso di errori.