Backup remoti automatici quotidiani di più server con rsnapshot

In questa guida, scritta con lo scopo di rimanere un appunto personale che potrebbe tornare utile a molti di voi, vi mostro come impostare dei backup quotidiani (o anche orari se volete) di uno o più server, utilizzando una qualunque macchina con installato Linux (pc o server) per salvare tutti i dati. Ci tengo a precisare che non ho inventato nulla: ci sono una miriade di ottime guide su come impostare backup remoti tra server usando rsnapshot su Internet.

Rsnapshot (sito web) permette backup incrementali utilizzando rsync e gli hardlink, per cui lo spazio occupato risulta infinitamente inferiore che dei singoli backup giorno per giorno. Il trasferimento avviene utilizzando il protocollo SSH e le chiavi pubbliche e private, per cui è possibile automatizzare i backup senza bisogno di utilizzare alcuna password.

Basta chiacchere e andiamo al sodo.

Per semplicità farò l’esempio utilizzando un pc che funge da backup (lo chiamerò pc locale, può essere anche un server ovviamente) e un server di cui fare il backup (che chiamerò server remoto). Nella vita reale vi troverete probabilmente a dover fare il backup a più di un server: ripetete le operazioni per ognuno dei server di cui fate il backup e, in fondo a questa guida, troverete il mio file rsnapshot.conf in cui eseguo il backup di più di un server alla volta.

1. Server remoto: impostazioni iniziali

Innanzitutto verificare di avere installato i seguenti programmi: sudo, rsync, ssh.

a. Aggiunta utente per backup

root@server8:~# useradd -s /bin/bash -m rbackup

Creo l’utente rbackup (potete chiamarlo come volete) creando la home directory e assegnandogli /bin/bash come shell

b. Creazione di un wrapper

root@server8:~# vim /usr/local/bin/rsync_wrapper.sh

Inserire all’interno:

#!/bin/sh
/usr/bin/sudo /usr/bin/rsync "$@";

Il wrapper viene creato per permettere all’utente rbackup di eseguire rsync con permessi di root grazie all’applicazione sudo.

Cambiamo i permessi al wrapper:

root@server8:~# chmod 755 /usr/local/bin/rsync_wrapper.sh

c. Creazione di uno script per limitare l’uso di ssh

root@server8:~# vim /home/rbackup/validate-rsync.sh

Inseriamo nel file questi comandi:

#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
  *\&*)
    echo "Rejected 1"
    ;;
  *\;*)
    echo "Rejected 2"
    ;;
  /usr/local/bin/rsync_wrapper*)
    $SSH_ORIGINAL_COMMAND
    ;;
  *true*)
    echo $SSH_ORIGINAL_COMMAND
    ;;
  *)
    echo "Rejected 3"
    ;;
esac

Impostiamo anche permessi e owner dello script:

root@server8:~# chown rbackup:rbackup /home/rbackup/validate-rsync.sh
root@server8:~# chmod 755 /home/rbackup/validate-rsync.sh

d. Impostazioni di sudo per permettere l’utilizzo di rsync (e solo rsync) con permessi di root.

Utilizzare il comando visudo che apre e modifica il file /etc/sudoers

root@server8:~# visudo

Aggiungiamo alla fine del file questa riga:

rbackup ALL = NOPASSWD: /usr/bin/rsync

2. Configurazione server remoto e pc locale per autenticazione senza password

a. Generazione delle chiavi (pubblica e privata) sul pc locale

root@lamehost ~ # ssh-keygen -t rsa

Accettate il file di default (/root/.ssh/id_rsa) e premete invio senza inserire nessuna password.

Dovendo probabilmente gestire più di un server, vi consiglio di rinominare le chiavi in modo chiaro:

root@lamehost ~ # mv /root/.ssh/id_rsa.pub /root/.ssh/id_rsa_rsnapshot_server8.pub
root@lamehost ~ # mv /root/.ssh/id_rsa /root/.ssh/id_rsa_rsnapshot_server8

b. Copia della chiave pubblica sul server remoto, e configurazione per consentire autenticazione senza password

Da root, passate all’utente rbackup e utilizzate per la prima volta ssh, in modo che venga creata la directory .ssh con i permessi corretti.

root@server8:~# su - rbackup

Una volta diventati user rbackup:

rbackup@server8:~$ ssh 0
The authenticity of host '0 (0.0.0.0)' can't be established.
ECDSA key fingerprint is ba:fc:1d:c0:95:01:39:35:01:3a:b4:d1:f7:cb:1b:b3.
Are you sure you want to continue connecting (yes/no)? yes

Quindi tornate root premendo CTRL-D o digitando exit:

rbackup@server8:~$ exit

Ora copiate (utilizzando scp, ftp o quel che vi pare) la chiave pubblica del pc locale (/root/.ssh/id_rsa_rsnapshot_server8.pub) nella directory /home/rbackup/.ssh del server remoto, dopodichè la andrete a inserire all’interno del file authorized_keys e rimuoverete la chiave pubblica (non più necessaria).

root@server8:~# cat /home/rbackup/.ssh/id_rsa_rsnapshot_server8.pub >>/home/rbackup/.ssh/authorized_keys
root@server8:~# rm /home/rbackup/.ssh/id_rsa_rsnapshot_server8.pub

Impostate i permessi nel modo corretto:

root@server8:~# chown rbackup:rbackup /home/rbackup/.ssh/authorized_keys
root@server8:~# chmod 600 /home/rbackup/.ssh/authorized_keys

A questo punto bisogna aggiungere alcune limitazioni all’autenticazione senza password, in modo da imporre l’utilizzo del file validate_rsync.sh creato in precedenza così che non sia possibile eseguire altri comandi

root@server8:~# vim /home/rbackup/.ssh/authorized_keys

Il file inizia con ssh-rsa . Aggiungere prima:

from="*.fastwebnet.it",command="/home/rbackup/validate-rsync.sh"

Il mio pc locale ha connessione fastweb quindi ho limitato le connessioni agli host fastweb. Al posto di *.fastwebnet.it potete mettere il vostro IP o consentire a tutti gli ip la connessione utilizzando l’asterisco. In ogni caso solo chi ha la chiave privata (ovvero il pc locale) può autenticarsi senza password.

c. Test del funzionamento senza password

Innanzitutto per comodità, soprattutto se dovete gestire molti server, è opportuno salvare i dati di connessione sul pc locale in modo da semplificare e abbreviare i comandi. Sostituite 192.168.0.1 con l’ip del vostro server remoto.

root@lamehost ~ # vim /root/.ssh/config

Inserite all’interno:

Host server8
HostName 192.168.0.1
User rbackup
IdentityFile ~/.ssh/id_rsa_rsnapshot_server8

Ora testiamo la connessione:

root@lamehost ~ # ssh server8
Rejected 3
Connection to 192.121.0.25 closed.

Il nostro wrapper funziona correttamente, siamo riusciti ad autenticarci senza password dal pc locale al server remoto ma ci viene risposto Rejected 3, come da noi impostato nel wrapper sul server remoto.

Proviamo ora ad utilizzare rsync con autenticazione senza password, ad esempio chiedendo di trasferire un file inesistente, dovremmo ricevere un messaggio di errore di rsync

root@lamehost ~ # ssh server8 /usr/local/bin/rsync_wrapper.sh ciao pippo
rsync: link_stat "/home/rbackup/ciao" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]

Perfetto, FUNZIONA!!

Ora abbiamo pc locale e server remoto configurati per eseguire rsync per generare i backup con rsnapshot

 

3. Configurazione di rsnapshot

Non mi dilungherò molto, la configurazione è molto semplice e potete consultare la documentazione ufficiale per tutti i dettagli.

Questa configurazione mi permette backup giornalieri, settimanali e mensili secondo le direttive qui sotto, salvando i backup nella directory /root/snapshots. Riporto solo le righe da me modificate, tenete presente che nel frattempo il file di configurazione di default di rsnapshot potrebbe essere cambiato dagli sviluppatori.

root@lamehost ~ # vim /etc/rsnapshot.conf

ATTENZIONE: il file di configurazione di rsnapshot non vuole spazi, è necessario utilizzare i TAB come separatori. Se fate copia-incolla da qui, ricordatevi di sostituire gli spazi con i TAB.

Salviamo i backup in /root/snapshots/

snapshot_root /root/snapshots/

Manteniamo 30 backup giornalieri, 4 settimanali e 6 mensili. Quelli orari non ci interessano.

#interval hourly 6
interval daily 30
interval weekly 4
interval monthly 6

Imposto i backup di /srv e /etc escludendo le directory cache e session.

backup rbackup@server8:/srv/ server8/ +rsync_long_args=--rsync-path=/usr/local/bin/rsync_wrapper.sh,exclude=cache/,exclude=session/
backup rbackup@server8:/etc/ server8/ +rsync_long_args=--rsync-path=/usr/local/bin/rsync_wrapper.sh

Se volessi aggiungere un altro server remoto di cui fare il backup, ad esempio della directory root, aggiungerei questa riga:

 backup rbackup@server9:/etc/ server9/ +rsync_long_args=--rsync-path=/usr/local/bin/rsync_wrapper.sh

Testiamo la configurazione di rsnapshot, dovreste ricevere “Syntax OK” come risposta.

root@lamehost ~ # rsnapshot configtest

Testiamo il backup giornaliero, verranno mostrati tutti i comandi eseguiti.

root@lamehost ~ # rsnapshot -t daily

Se tutto è ok, potete fare il vostro primo backup.

root@lamehost ~ # rsnapshot daily

Il primo backup impiegherà tutto il tempo necessario a trasferire tutti i file oggetto di backup. Per server di grandi dimensioni vi occorre una connessione molto veloce oppure molta pazienza. I backup successivi saranno invece più veloci perchè rsync si occuperà di scaricare solo i file modificati rispetto al backup precedente, risparmiando tempo, banda e spazio sul pc locale.

Una volta completato il primo backup, potrete trovarlo nella directory /root/snapshots/daily.0

 

4. Configurazione cron jobs per l’esecuzione in automatico di rsnapshot

La configurazione di crontab dipende dal vostro sistema. Questa è la configurazione del mio pc locale che esegue daily ogni giorno alle 14.30, weekly ogni settimana alle 14.55 e monthly ogni mese alle 15.10

30 14 * * * /usr/bin/rsnapshot daily
55 14 * * 1 /usr/bin/rsnapshot weekly
10 15 1 * * /usr/bin/rsnapshot monthly

5. Problemi noti

Dopo due anni di utilizzo di rsnapshot per fare i backup di server Linux, questi sono i problemi in cui potreste incorrere

a) No space left on device con molto spazio libero su disco

Dal momento che rsnapshot fa uso massiccio di hard links per risparmiare spazio, vi sembrerà assurdo che avete un disco mezzo vuoto ma vi compare spesso il messaggio “No space left on device”.

root@lamehost ~ # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda7 148G 7.8G 133G 6% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 787M 632K 787M 1% /run
shm 3.9G 0 3.9G 0% /dev/shm
cgroup_root 10M 0 10M 0% /sys/fs/cgroup
/dev/mapper/home 197G 16G 172G 9% /home

Come si vede, tutte le partizioni hanno una marea di spazio vuoto.

Andiamo però ad analizzare gli iNode liberi

root@lamehost ~ # df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
<strong> /dev/sda7 9.4M 9.4M 1K <span style="color: #ff0000;">99%</span> /</strong>
devtmpfs 984K 520 983K 1% /dev
tmpfs 984K 547 984K 1% /run
shm 984K 1 984K 1% /dev/shm
cgroup_root 984K 6 984K 1% /sys/fs/cgroup
/dev/mapper/home 13M 20K 13M 1% /home

Come vedete, il filesystem root (/dev/sda7) ha 9.4 milioni di iNodes, praticamente tutti utilizzati (99%). La soluzione è ridurre il numero di backup mantenuti in archivio facendo contestualmente pulizia delle directory contenenti una miriade di piccoli file o link.

 

6. Ringraziamenti

Ringrazio me stesso per tutto il tempo speso a scrivere questo articolo :)

A parte gli scherzi, come al solito non ho inventato nulla, ho semplicemente adattato le decine e decine di guide trovate in rete. Mi sembra doveroso un link alla fonte primaria della mia guida: http://gentoo-en.vfose.ru/wiki/Rsnapshot

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *