Effettuare il backup remoto di un server Linux utilizzando rsync
In un articolo precedente ci siamo occupati di rsync, il più diffuso sistema di backup utilizzato in linux.
In particolare, abbiamo visto come utilizzare rsync per effettuare un backup in locale, cioè in un hard disk secondario (un HD usb).
In questo articolo chiudiamo l'argomento rsync occupandoci del suo utilizzo nel caso in cui si voglia copiare una o più directories da un server locale ad un server remoto presente in rete.
Utilizzo di rsync in modalità PUSH
Ricordiamo la sintassi di rsync vista nell'articolo precedente
rsync opzioni sorgente destinazione
In questo caso sorgente e destinazione sono due server localizzati in rete.
Ipotizziamo di avere due server:
- Il server "A", raggiungibile all'indirizzo ip pubblico 5.249.132.100, di cui vogliamo effettuare il backup della directory "html" localizzata al path "/var/www/html"
- Il server B, raggiungibile all'indirizzo ip pubblico 62.149.226.241, sui cui salviamo il backup del server A nella directory "/bkp" che abbiamo creato ad hoc per il nostro backup
Con rsync in modalità PUSH è il server locale A a contattare il server remoto B, e a "spedirgli" files e directories da salvare.
Vediamo un esempio:
rsync -avz --delete /var/www/html/ root@62.149.226.241:/bkp/
In questo esempio possiamo vedere:
- le opzioni utilizzate sono "-avz" e "--delete", già descritte nell'articolo precedente, e servono ad effettuare una copia speculare di A su B
- la directory locale da copiare è al path "/var/www/html"
- la directory remota è "/bkp" localizzata sul server remoto 62.149.226.241: il server A contatterà il server B e dovrà loggarsi su questo come utente root.
Per effettuare questa connessione tra server indichiamo "root@62.149.226.241:/bkp", dove root è l'utente che dovrà effettuare il login, seguono la chiocciola, l'ip del server remoto, i duepunti, ed infine la directory dove salvare il backup sul server remoto.
Lanciando rsync verrà richiesta la password dell'utente root del server B. Immessa la password il processo di salvataggio del backup inizierà.
Utilizzo di rsync in modalità PULL
In modalità PULL si invertono le parti in causa: è il server B a contattare il server A e a prelevare files e directories da salvare nella cartella /bkp
rsync -avz --delete root@5.249.132.100:/var/www/html/ /bkp/
Anche in questo caso verrà richiesta la password dell'utente root del server A.
Utilizzo di rsync con SSH
Abbiamo visto come utilizzare rsync in modalità PUSH e PULL. Il loro limite è che i dati viaggiano in rete non protetti, per cui un hacker in ascolto potrebbe intercettarne il passaggio. Inoltre se volessimo schedulare un processo giornaliero di backup non potremmo immettere la password manualmente.
Vediamo come superare questi limiti utilizzando rsync con SSH.
SSH è un protocollo che permette di stabilire una connessione remota cifrata, in questo modo i dati transiteranno sicuri.
Vediamo come utilizzare rsync con SSH in modalità PUSH modificando l'esempio precedente:
rsync -avz --delete -e ssh /var/www/html/ root@62.149.226.241:/bkp/
A differenza dell'esempio senza SSH abbiamo aggiunto l'opzione "-e" seguita da "ssh": stiamo dicendo a rsync di lavorare utilizzando il protocollo SSH.
NOTA: nulla vieta di indicare le opzioni tutte assieme in questo modo "-avze"
Rsync in ssh utilizza di default la porta 22. Ma è possibile utilizzare una porta differente utilizzando l'opzione -p seguito dal numero di porta. Ad esempio volendo usare la porta 14000:
rsync -avz --delete -e "ssh -p 14000" /var/www/html/ root@62.149.226.241:/bkp/
Se vogliamo utilizzare in SSH la modalità PULL, chiamiamo rsync così:
rsync -avz --delete -e ssh root@5.249.132.100:/var/www/html/ /bkp/
Utilizzo di rsync con SSH senza digitare la password
Utilizzando SSH con rsync la password dell'utente root del server B verrà comunque chiesta. Vediamo come aggirare l'ostacolo!
Siamo sul server A: nel nostro esempio siamo loggati come utente root (e stiamo utilizzando una distribuzione Centos 7).
Generiamo una coppia di chiavi di autenticazione, pubblica e privata, con il comando "ssh-keygen -t rsa" dove "-t" indica il tipo di crittografia utilizzata per generare le chiavi, nel nostro esempio "rsa"
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tKDh2c9E1cCX69hVZJIDGgnEexEkpf+9wLZxi+YSL8g root@mioserver.it
The key's randomart image is:
+---[RSA 2048]----+
| o+=B=.o.oo|
| .++o+ oo.|
| . . +..o . o |
| . = +.o. . . |
| + . S..+ . |
| + ooo. |
| .o. o* o |
| E o.o* o |
| =+ o |
NOTA: nel momento in cui verrà richiesta una password ("Enter passphrase") non inserite nulla e andate avanti
In alternativa alla crittografia "rsa" possiamo creare una chiave a crittografia ellittica ("ecdsa"), più corta e sicura:
# ssh-keygen -t ecdsa
Utilizzando "ssh-keygen" viene creata, se ancora non è presente, la directory "/root/.ssh" ed all'interno verranno salvate due chiavi:
- una chiave pubblica "id_rsa.pub" (o "id_ecdsa.pub", se si utilizza la crittografia ecdsa)
- e una privata privata "id_rsa" (o "id_ecdsa", se si utilizza la crittografia ecdsa)
Controlliamo che siano state effettivamente create e verifichiamone i permessi: in particolare che la chiave privata sia accessibile solo per il proprietario, nel nostro esempio l'utente root
# ls -la /root/.ssh
-rw------- 1 root root 1675 21 ago 14.30 id_rsa
-rw-r--r-- 1 root root 399 21 ago 14.30 id_rsa.pub
A questo punto occorre copiare la chiave pubblica sul server.
Come prima cosa assicurati che sul server B la cartella ".ssh" esista. Se non esiste creala manualmente.
Adesso possiamo procedere con la copia del file "id_rsa.pub" dal server A al server B, dove lo chiameremo "authorized_keys" (solo per evitare di sovrascrivere un eventuale file "id_rsa.pub" già presente sul server B).
# cat /root/.ssh/id_rsa.pub | ssh root@62.149.226.241 'cat >> /root/.ssh/authorized_keys'
In alternativa potresti usare il comando "scp"
# scp /root/.ssh/id_rsa.pub root@62.149.226.241:/root/.ssh/authorized_keys
In entrambi i casi ti verrà chiesta la password dell'utente root del server B. Digitata la password, il file id_rsa.pub verrà copiato sul server B, nella cartella "ssh", con il nome "authorized_keys".
Bene, adesso provate a lanciare rsync e la connessione tra i server avverrà senza richiesta di password.
Backup periodico
Se vogliamo che rsync effettui periodicamente il backup, senza alcun intervento manuale, andiamo ad utilizzare cron per schedulare una attività di backup. Ad esempio, alle 23.45 di ogni giorno verrà effettuato il backup.
45 23 * * * rsync -Pavz --delete -e ssh /var/www/html/ root@62.149.226.241:/bkp/
Riprendere un backup interrotto
Se, per qualche motivo, la copia non venisse portata a termine interamente (come nel caso in cui, effettuando la copia su un server remoto, la connessione cadesse), possiamo utilizzare l'opzione -P (in maiuscolo) che consente di riprendere il backup eventualmente interrotto precedentemente
rsync -Pavz --delete -e ssh /var/www/html/ root@62.149.226.241:/bkp/
E con questo abbiamo concluso l'argomento dedicato al backup con rsync.