Backup con SSH su Debian/Ubuntu in ambiente cloud: Duplicity
I server di hosting con tecnologia cloud vengono spesso utilizzati per effettuare dei backup, anche incrementali e criptati, con molteplici opzioni aggiuntive: per farlo si può utilizzare Duplicity, un software adibito a tale scopo che funziona da linea di comando SSH. Duplicity funziona mediante GnuPG, tar ed rdiff, trasmette i dati mediante ssh o scp, FTP, Amazon S3, rsync ed accesso locale ai file. Si assume nel seguito di disporre sia di una locazione remota (VPS o dedicato) di cui vogliamo una copia di sicurezza periodica, sia di un cloud hosting che permetta di memorizzare le copie progressivamente. Per effettuare l’operazione sfrutteremo delle chiavi crittografiche e la protezione delle connessioni mediante SSH.
Tutti i sistemi informatici basati su crittografia si basano su una passphrase, che è come se fosse una password riservata di accesso solo che, in generale, è più lunga. Per installare Duplicity si ricorre quindi alla seguente istruzione (ovviamente previo accesso ad SSH come spiegato qui):
apt-get install duplicity
il che produrrà un output del genere:
Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: librsync1 python-crypto python-gnupginterface python-paramiko Suggested packages: python-boto ncftp python-pexpect python-cloudfiles python-gdata tahoe-lafs python-crypto-dbg python-crypto-doc The following NEW packages will be installed: duplicity librsync1 python-crypto python-gnupginterface python-paramiko 0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. Need to get 1,735 kB of archives. After this operation, 10.4 MB of additional disk space will be used. Do you want to continue [Y/n]? y Get:1 http://mirrors.kernel.org/debian/ stable/main librsync1 amd64 0.9.7-9 [72.1 kB] Get:2 http://mirrors.kernel.org/debian/ stable/main python-gnupginterface all 0.3.2-9.1 [21.0 kB] Get:3 http://mirrors.kernel.org/debian/ stable/main duplicity amd64 0.6.18-3 [309 kB] Get:4 http://mirrors.kernel.org/debian/ stable/main python-crypto amd64 2.6-4 [524 kB] Get:5 http://mirrors.kernel.org/debian/ stable/main python-paramiko all 1.7.7.1-3.1 [809 kB] Fetched 1,735 kB in 6s (262 kB/s) Selecting previously unselected package librsync1:amd64. (Reading database ... 36532 files and directories currently installed.) Unpacking librsync1:amd64 (from .../librsync1_0.9.7-9_amd64.deb) ... Selecting previously unselected package python-gnupginterface. Unpacking python-gnupginterface (from .../python-gnupginterface_0.3.2-9.1_all.deb) ... Selecting previously unselected package duplicity. Unpacking duplicity (from .../duplicity_0.6.18-3_amd64.deb) ... Selecting previously unselected package python-crypto. Unpacking python-crypto (from .../python-crypto_2.6-4_amd64.deb) ... Selecting previously unselected package python-paramiko. Unpacking python-paramiko (from .../python-paramiko_1.7.7.1-3.1_all.deb) ... Processing triggers for man-db ... Setting up librsync1:amd64 (0.9.7-9) ... Setting up python-gnupginterface (0.3.2-9.1) ... Setting up duplicity (0.6.18-3) ... Setting up python-crypto (2.6-4) ... Setting up python-paramiko (1.7.7.1-3.1) ... Processing triggers for python-support ...
Per eseguire backup periodici in automatico, dunque, ci serve una chiave ssh che possiamo creare in prima istanza in questo modo:
ssh-keygen -t rsa
La passphrase può essere impostata da terminale dopo aver premuto Invio, ed essa potrebbe in generale essere anche vuota (sconsigliato): per impostare il valore della passphrase esplicitamente si ricorre ad un’istruzione del genere:
sudo apt-get install keychain
poi si va ad editare il bash-profile dell’utente:
vi $HOME/.bash_profile
e si aggiungono nel file in questione le direttive seguenti:
/usr/bin/keychain --clear $HOME/.ssh/id_rsa source $HOME/.keychain/$HOSTNAME-sh
Per creare chiavi GPG andiamo ad installare sul VPS cloud:
apt-get install gnupg
e poi andiamo a creare le chiavi per il backup sempre da terminale remoto:
gpg --gen-key
il che produrrà, questa volta, un output simile nel quale ci sarà richiesta conferma delle operazioni:
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gpg: keyring `/root/.gnupg/secring.gpg' created Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) 0 Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Real name: Home Nas Server Email address: root@nas01 Comment: Home Nas Server Backup You selected this USER-ID: "Home Nas Server (Home Nas Server Backup) <root@nas01>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O You need a Passphrase to protect your secret key.
se andiamo a listare le chiavi di sistema, a questo punto:
gpg --list-keys
prenderemo nota di 3AABBCC7 (di seguito un esempio di output):
/root/.gnupg/pubring.gpg ------------------------ pub 4096R/3AABBCC7 2013-10-04 uid Home Nas Server (Home Nas Server Backup) <root@nas01> sub 4096R/12345678 2013-10-04
Per effettuare il backup sicuro e criptato dei file su cloud.esempiosito.com, ad esempio, andiamo a scrivere:
duplicity /home/miacartella/ scp://utente@cloud.esempiosito.com/backup
Per escludere file (o directory) dal backup si usa l’opzione –exclude:
duplicity --exclude /tmp/ --exclude /proc/ --exclude /nas/ \ --exclude /jails/ --exclude /mnt/ / scp://utente@cloud.esempiosito.com/backup
che esclude tmp, proc, nas, jails, mnt e copia invece tutto il resto; viceversa per includere file si usa –include, che in questo esempio copierà soltanto /home/, /root/, /etc/, e /var/spool/cron/ dal server remoto fino al nostro cloud server che stiamo utilizzando per il backup:
duplicity --include /home/ --include /root --include /etc/ \ --include /var/spool/cron/ --exclude '**' / scp://utente@cloud.esempiosito.com/backup
Per eseguire un backup completo criptato si scriverà:
duplicity full --encrypt-key="3AABBCC7" /home/miacartella/ scp://utente@cloud.esempiosito.com/backup
mentre invece per un backup incrementale e criptato:
duplicity incr --encrypt-key="3AABBCC7" /home/miacartella/ scp://utente@cloud.esempiosito.com/backup
per vedere infine i file memorizzati nell’archivio si sfrutterà la chiave annotata in precedenza:
duplicity list-current-files --encrypt-key="3AABBCC7" scp://utente@cloud.esempiosito.com/backup
mentre per verificare l’integrità del backup:
duplicity verify --encrypt-key="3AABBCC7" scp://utente@cloud.esempiosito.com/backup /home/miacartella
il comando successivo, inoltre, permette di economizzare lo spazio su disco del server cloud di backup eliminando dopo 30 giorni i backup vecchi:
duplicity remove-older-than 60D --encrypt-key="3AABBCC7" --force scp://utente@cloud.esempiosito.com/backup
Per recuperare un backup in caso di necessità si eseguono i comandi riportati:
mkdir /home/miacartella/ duplicity --encrypt-key="3AABBCC7" scp://utente@cloud.esempiosito.com/backup /home/miacartella/
Ovviamente parametri dei comandi come utente, cloud.esempiosito.com e home/miacartella devono essere adeguatamente rimpiazzati a seconda dei casi durante l’uso pratico delle istruzioni che abbiamo pubblicato.
Un commento