Indice

Script per il backup sicuro tramite Rsync e Openssh

Autori: Fabio Di Matteo
Ultima revisione: 31/10/2009

L'idea di questo script nasce dall'esigenza di dover allestire un servizio di backup centralizzato, incrementale e sicuro all'interno di una rete medio-piccola. Evitando di dover installare soluzioni personalizzate in ogni macchina, avendo il vantaggio che ad ogni aggiornamento del software non si debbano aggiornare tutte le copie.

Obiettivi

Possiamo quindi elencare estesamente gli obbiettivi dello script come segue :

  1. backup incrementale (tramite rsync);
  2. backup sicuro (tramite tunnel ssh);
  3. creazione di dettagliati file di log per utente contenenti informazioni su ogni transazione di file (tramite rsync);
  4. backup automatizzato (utilizza un db mysql per prendere i riferimenti agli host di cui fare i backup);
  5. lo script verra' scritto in PHP (CLI) ;
  6. nessuna personalizzazzione installata sulle macchine della lan;
  7. lo script deve risiedere interamente ed esclusivamente sul fileserver che conterra' i backup;

Strumenti

Per quanto riguarda le macchine nella lan (dalle quali si fara' il backup) e' sufficiente che siano installati rsync e ssh , su Debian e Ubuntu con:

apt-get install ssh rsync

Sulla macchina in cui risiedera' lo script invece e' necessario anche installare l'interprete da riga di comando del PHP, in quanto scriveremo lo script in php e sshpass grazie al quale e' possibile passare la password per i servizi ssh in maniera non interattiva, ovvero e' possibile passare la password tramite linea di comando..

apt-get install php5-cli sshpass

Inoltre per comodita' useremo la classe database di Gianluca Giusti (http://www.urcanet.it/brdp/php_manual/html/brdp9.html#title56) per interagire con la nostra tabella mysql.

Il principio di funzionamento

Tenuto conto dell'articolo Usare ssh in modo non interattivo possiamo certamente dire che l'istruzione principale e' la seguente:

sshpass -p <password>  rsync –progress --log-file=<log-backup.log> -avz -e ssh <USER>@<IP>:<directory da backuppare> <directory locale che contiene i backup>

Il db mysql contiene una tabella chiamata tbl_personale con i campi:

campi
so
ip
user
rootpass

Sorgente

ersukup

#!/usr/bin/php
<?php
include("db.php");
echo "----------------------------------------------\n";
echo "Ersukup 0.1 - Fabio Di Matteo pobfdm@gmail.com\n";
echo "----------------------------------------------\n";
echo "\n\n\n";
 
        $db =  new database;
        $db->connetti();
 
        $sql="select * from tbl_personale where so like '%linux%' ";
        if ($db->esegui($sql)){
                        for($i=0; $i<$db->righe(); $i++){
                                $cmd="sshpass -p ".$db->leggi($i,"rootpass").
                                        " rsync -L --delete --progress --log-file=/var/log/ersukup/".
                                        $db->leggi($i,"user").".log -avz -e ssh root@".
                                        $db->leggi($i,"ip").":/home/".$db->leggi($i,"user")."/Documenti /home/".$db->leggi($i,"user");
                                if ($db->leggi($i,"user")!=""  &&  $db->leggi($i,"rootpass")!="")
                                {
                                        echo "\n\n\n\nbackup utente --> ". $db->leggi($i,"user")." (". $db->leggi($i,"ip").")\n\n" ;   
                                        system($cmd);
                                }       
                        }
                        echo "Procedura di backup terminata. \n";
        }else{
                //problemi nell'interrogare la base dati
                echo "Problemi nell'interrogare la base dati.\n";
        }
        $db->disconnetti();
 
 
?>
~                                                                                                                                                            
~                                                                                                                                                            
~                                                                                                                                                            
~                                                                                                                                                            
~                                                                                                                                                            
~