Nella puntata precedente, ho parlato di un serverino che effettua il backup di vari server su un disco cifrato.
Il mio backup è quasi perfetto, ma ho trovato una vulnerabilità, pertanto qui definisco il fix.
Il server di backup è pensato per backuppare in locale N server, in modo differenziale, ovvero se viene modificato un file sul server, nel backup viene riportata la modifica, questo ci consente di non sprecare banda e di mantenere contenuta la dimensione del backup stesso.
Il backup incrementale, aggiunge sempre, ma se un file l’ho tolto perchè non è più utile?
Quindi i backup incrementali non li uso, tuttavia se il mio server venisse aggredito? qui ci sarebbe un problema perchè se l’aggressore mi cancellasse tutti i dati io perderei anche il backup, visto che il mio server di backup interpreterebbe la mancanza di file come un gesto volontario nell’eliminazione degli stessi.
Per risolvere il problemaccio ho creato uno script che crea un backup differenziale con storico di N giorni.
Io sono abituato ad avere poca fantasia, pertanto non nomino i server con nomi pittoreschi tipo belfagor, dragon, dannunzio, etc etc, mi limito a chiamarli server0, server1, server2 e così via.
Questo mi consente di interrogare i miei server in modo più semplice, mi sono già trovato a gestire anche decine di server per singolo cliente, se avessi usato nomi di fantasia sarei diventato matto solo per ricordarli, col mio metodo, mi basta ricordare il nome del dominio del cliente che mi paga, i server hanno tutti lo stesso nome 🙂
Vediamo ora lo script che possiamo adoperare anche per il backup di cui alla puntata precedente.
#vi /script/backup.sh
#!/bin/sh
LIFE=1 #Qui definisco quanti giorni escluso oggi deve essere vecchio il backup
CMPT=cfpj #Qui definisco gli attributi del tar necessario a creare lo storico
EXT=.tar.bz2 #Qui definisco l’estensione del tar
CMPR=’-r -t -p -o -g -x -v –progress –delete -c -l -H -D –partial -z -i -s –exclude /tmp –exclude /proc –exclude /dev –exclude /sys –exclude lost+found –exclude swap.swp -e’ # Qui i parametri da passare ad rsync
NOW=$(date +%Y-%m-%d_%H:%M:%S) #Catturo questo momento per utilizzarlo successivamente come nome di file
RSYNC=/usr/bin/rsync #Posizione dove ho compilato rsync
SSH=/usr/bin/ssh #Posizione in cui ho compilato ssh
KEY=/home/davide/.ssh/key #Posizione in cui tengo celata la mia chiave privata
SERVERNAME=server #Avendo poca fantasia, i miei server si chiamano TUTTI server 🙂
RUSER=root #Utente con il quale accedere per effettuare il backup
RHOST=host.it #questo è il nome dell’host che sommato al nome del server forma l’indirizzo mnemonico
RPATH=/#Questa è la patch remota del server, in questo caso inizio a backuppare dalla root
LPATH=/BACKUP/ #La posizione in cui monto l’immagine del server che devo confrontare con il server in produzione
RPATH=/disk #La posizione in cui monto il disco cifrato
ARCH=ARCHIVIO/ La posizione dove tenglo l’archivio storico
for C in $(seq -w 0 9); do
SERVER=$SERVERNAME$C
################################## PULITURA VECCHI FILE ######################################
find $CRPATH$LPATH$ARCH -name “*$EXT” -type f -mtime +$LIFE -delete #cancello i file di backup più vecchi di $LIFE
################################### SINCRONIZZAZIONE #########################################
mount -o loop /disk$LPATH$SERVER.img $LPATH$SERVER # monto l’immagine del server remoto il locale
rsync $CMPR “$SSH -i $KEY” $RUSER@$SERVER.$RHOST:$RPATH $LPATH$SERVER #Confronto immagine remota con quella locale e scrivo le differenze
tar $CMPT $CRPATH$LPATH$ARCH$SERVER-$NOW$EXT $LPATH$SERVER #creo il tarball dell’immagine aggiornata
sync #mi assicuro che i dati siano stati tutti trascritti sui dischi
sync
sleep 4 #aspetto 4 secondi prima di proseguire
umount $LPATH$SERVER #smonto il contenitore locale
sleep 2 # attendo 2 secondi per far riposare il processore
done #ricomincio da capo, incrementando il contatore di 1 per passare al server successivo
Nel mio esempio posso gestire un massimo di 10 server, da server0 a server9
Qualora io abbia più server da gestire, i server dovranno recare un numero a 2 cifre, pertanto potrò gestire da server00 a server99.
Per fare questo è sufficiente porre i limiti 00 99 così:
for C in $(seq -w 00 99); do
va da se che se devo gestire 18 server, la riga va impostata così:
for C in $(seq -w 00 17); do
e qui chiudiamo questa sessione di backup