due chiacchiere

Salvataggio offline del database del blog

Nelle scorse settimane ho seguito un corso di aggiornamento al lavoro sulla sicurezza delle applicazioni web. Ci hanno persino fatto giocare al piccolo hacker, esplorando una serie di strumenti per effettuare le scansione di vulnerabilità di un sito, ed insegnandoci tecniche per proteggersi da quegli attacchi. A parte tutti i tecnicismi, c’è stato un concetto basilare, citato dall’insegnante, che mi ha fatto riflettere: l’importanza delle copie di backup separate, anche fisicamente, dall’ambiente dove si trova l’applicazione o il sito. Perché eseguire il salvataggio della base di dati è si importante, ma cosa succede se l’azienda dove sono ospitati dati e sito web va a gambe all’aria (di servizi gratuiti online per far siti ne sono spariti a bizzeffe negli ultimi dieci anni) oppure viene attaccata da malintenzionati in grado di mettere sotto chiave anche i backup, o ancora è vittima di un disastro naturale che colpisce il datacenter?

Per questi motivi, non dovresti trascurare l’idea di mettere a punto un sistema che salvi quelle informazioni su un server fisicamente e geograficamente distante da quello principale, così che i dati compromessi non diventino ostaggio di una situazione non pianificata. Dato che il mio piccolo blog di periferia è da sempre stato il mio laboratorio creativo per questi progetti passatempo, e considerando la flessibilità offerta dal provider che mi ospita (si, il link è un referral, ma che c’è di male a guadagnare due spicci promuovendo un provider di qualità?), ho messo insieme un piccolo script che viene eseguito ogni giorno alle 3 del mattino sul mio server casalingo. Questo script si collega al server di Supporthost ed esegue un dump della base di dati, lo comprime e lo salva in locale. Il tutto in una sola riga (grazie, San StackOverflow):

ssh utente@server "mysqldump -u utente_db_wp nome_db_wp
| gzip" > /dove/salvare/bk_`date '+%Y-%m-%d'`.sql.gz

Spacchettiamo questo comando:

  • Fai in modo che il computer che esegue il comando sia configurato per connettersi al server usando la chiave privata/pubblica (in genere aggiungendo quanto necessario al file authorized_hosts nella cartella .ssh del server), quindi senza che venga richiesta la password a linea di comando
  • In questo modo ssh utente@server aprirà direttamente la connessione e potrà eseguire il comando tra virgolette
  • Con mysqldump si genera una copia dell’intera base di dati di WordPress, e come vedi richiede come argomenti il nome utente a riga di comando; la password andrà salvata sul server, nella propria home directory, in un file .my.cnf:
    [mysqldump]
    user = utente_db_wp
    password = segreta
  • Il mio consiglio è di creare un utente MySQL “di sola lettura”, così se anche qualcuno dovesse trovare quella password, non potrà effettuare alcuna modifica ai dati
  • L’output di quel comando viene passato a gzip, che si occupa di comprimerlo prima di inviarlo al computer remoto
  • Infine il percorso del file sul computer locale include il calcolo automatico della data odierna, per organizzare i backup cronologicamente

Il contenuto della cartella uploads invece viene salvato con un rsync:

rsync -az --delete utente@server:/home/utente/public_html/content/uploads /dove/salvare/

Salva questi due comandi in un file di shell, diciamo backup-sito.sh, e poi aggiungi qualcosa di simile a quanto segue al cron sulla macchina in questione (Linux o Mac):

0 3 * * * /home/utente/bin/backup-sito.sh

Questo comando eseguirà lo script ogni mattina alle 3, e ti farà trovare il file SQL zippato bello fresco appena sfornato al tuo risveglio, insieme al contenuto della cartella uploads. Il codice sorgente del tema e dei plugin invece, nel mio caso, è salvato su Github, quindi è relativamente al sicuro. Ovviamente lo script può essere ampiamente migliorato, a partire da una gestione degli errori più intelligente (dalla mancata connessione SSH, al fallimento del dump che genera un file vuoto), ma volevo giusto darti uno spunto su cui cominciare a lavorare.

P.S.: si, chi non vuole mettersi a giocare al piccolo sistemista, può semplicemente installare uno dei tanti plugin di backup per WordPress, che ti mandano via email il dump della base di dati a cadenza periodica prestabilita, il tutto in pochissimi click. Ma secondo te io mi accontentavo di una soluzione così semplice? 😅

Lascia un commento

Torna in cima alla pagina