Traduction(s) : English - Français - ~
duplicity est un outil très utile pour faire des sauvegardes à distance sans assistance. Les sauvegardes peuvent être incrementales, cryptées, sur plusieurs variétés de support. Voici l'exemple d'une configuration pour sauvegarder divers répertoires à distance. D'autres outils tel que backupninja peuvent être utilisés dans le même but.
Contents
Il est pratique de couper les sauvegardes par répertoire, tel que /etc, /var/lib/dpkg ou /var/spool. Ce script créera de petites sauvegardes, une par répertoire définie plus tard dans BACKDIRS. La machine distante contiendra l'arborescence des répertoires dans LPATH:
localmachine/etc/ localmachine/var/lib/dpkg localmachine/var/spool ...
et les commandes que nous exécuterons depuis la machine locale ressemblera à ça:
duplicity --encrypt-key AE45AE12 --sign-key AE45AE12 \ remove-older-than 2W /var/spool \ scp://babar@remotehostname//home/babar/duplic/localmachine/var/spool
et ensuite supprimera les anciennes sauvegardes:
duplicity --encrypt-key AE45AE12 --sign-key AE45AE12 \ remove-older-than 2W \ scp://babar@remotehostname//home/babar/duplic/localmachine/var/spool
Vous aurez besoin tout d'abord de connaitre quels répertoires à sauvegarder sur votre machine. Un strict minimum pour reconstruire l'installation pourrait être /etc et /var/lib/dpkg. Réfléchissez à deux fois, vérifiez la taille qu'elle prend, et la taille que vous avez sur le serveur. Comment la taille varie-t-elle dans le temps ? Combien de temps voulez-vous garder les anciennes sauvegardes ?
Ici nous gardons 2 semaines de sauvegardes anciennes, avec une sauvegarde complète chaque semaine et une incrémentale tous les jours.
Créer les clés ssh et gpg
$ su # apt-get install duplicity keychain [...] # ssh-keygen -t dsa [...] # gpg --gen-key [...] # umask 077 # touch /root/backup.sh /root/.duplicity.conf # chmod u+x /root/backup.sh # ls -la /root/backup.sh /root/.duplicity.conf -rwx------ 1 root root 0 2006-01-16 06:47 /root/backup.sh -rw------- 1 root root 0 2006-01-16 06:47 /root/.duplicity.conf
Maintenant vous devriez faire :
- un mot de passe protégé par une paire de clé publique/privée gpg
localmachine:~# gpg --list-secret-keys /root/.gnupg/secring.gpg ------------------------ sec 1024D/AE45AE12 2005-08-26 [expires: 2016-08-26] uid Backup signature (localmachine) <root@localmachine> ssb 2048g/AE45AE12 2005-08-26
- une paire de clé publique/privée ssh
# ls -la /root/.ssh total 16 drwx------ 2 root root 54 2006-01-14 01:30 . drwxr-xr-x 13 root root 4096 2006-01-16 07:48 .. -rw------- 1 root root 1264 2006-01-13 21:30 id_dsa -rw-r--r-- 1 root root 1113 2006-01-13 21:30 id_dsa.pub
Sur la machine distante, l'utilisateur utilisé pour recevoir les sauvegardes peut être créé comme ça:
# apt-get install scponly # adduser --disabled-password --shell /usr/bin/scponly babar # getent passwd babar babar:x:1002:1002:,,,:/home/babar:/usr/bin/scponly
Exemple de fichier script de duplicity
D'abord, le fichier de script pour éxécuter les sauvegardes: /root/backup.sh
# uncomment for debug #set -x . /root/.duplicity.conf # duplicity command DUPEXEC="duplicity --encrypt-key $ENCRKEY --sign-key $SIGNKEY $DUPOPTS $*" # loop on directories echo -n "---- Incremental backup of $HOSTNAME ---- "; date for i in $BACKDIRS do echo Starting backup of directory /$i # create directory, then backup, then erase old backups $MKDIR $LPATH/$i && $DUPEXEC /$i $RPATH/$i && $DUPEXEC $DUPOPTS_CLEANUP $RPATH/$i # verify backup integrity #$DUPEXEC --verify $RPATH/$i /$i done # if local, fix permissions if [ -z $HOST ]; then chown -R $NAME.$NAME $LPATH; fi echo -n "---- Finished backup on $HOSTNAME ---- "; date
Exemple de paramétrage
Editer et compléter le fichier /root/.duplicity.conf (XXXX doit être remplacé):
# path to backup to
LPATH=/home/babar/XXX/$HOSTNAME
## 1. remote settings
# remote host
HOST=remotehostnameXXX
# remote login (user for backup on server)
NAME=babarXXX
# send over ssh
RPATH=scp://$NAME@$HOST/$LPATH
## 2. local settings (use another disk!)
# remote host *empty*
#HOST=
# user name to change ownership too to
#NAME=babar
# RPATH now uses file://
#RPATH=file://$LPATH
# complete with root gpg signature and encryption key
SIGNKEY=XXXXXXXX
ENCRKEY=$SIGNKEY
# yes, we need to store the gpg pass phrase in clear somewhere
export PASSPHRASE='XXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
# local list of directories to backup
BACKDIRS='etc var/lib/dpkg var/log var/mail usr/local/XXX'
# full '/' backup setting
#BACKDIRS=/
#DUPOPTS='--exclude /proc --exclude /mnt --exclude /tmp'
# duplicity options (backup.sh also accepts command line arguments)
DUPOPTS=
# cleanup (really needs --force)
DUPOPTS_CLEANUP="remove-older-than 2W"
# exclude patterns
#DUPOPTS="$DUPOPTS --exclude **/pictures/XXX"
# load ssh agent info using keychain
[[ -f /root/.keychain/$HOSTNAME-sh ]] && \
source /root/.keychain/$HOSTNAME-sh
export GNUPGHOME=/root/.gnupg
if [ -z $HOST ]; then
MKDIR="mkdir -p"
else
MKDIR="ssh $NAME@$HOST mkdir -p"
fi
Tester le script
Ajouter ce qui suit à votre machinelocale:/root/.bashrc
keychain --nogui --clear id_dsa . ~/.keychain/$HOSTNAME-sh
et connectez-vous en tant que root à nouveau. Vous devriez être invité à entrer la phrase de chiffrement ssh.
La nouvelle clé ssh doit être installée sur le serveur (i.e. ajouter le contenu de la machinelocale:/root/.ssh/id_dsa.pub dans remotemachine:/home/babar/.ssh/authorized_keys (-rw-------) ), et le répertoire LPATH est créé.
Essayez d'éxécuter le script:
# /root/backup.sh ---- Incremental backup of localmachine ---- Mon Jan 16 06:49:25 GMT 2006 Starting backup of directory /home/barfoo No signatures found, switching to full backup. --------------[ Backup Statistics ]-------------- StartTime 1137394351.70 (Mon Jan 16 06:52:31 2006) EndTime 1137394838.14 (Mon Jan 16 07:00:38 2006) ElapsedTime 486.44 (8 minutes 6.44 seconds) SourceFiles 26330 SourceFileSize 677134571 (646 MB) NewFiles 4185 NewFileSize 125189830 (119 MB) DeletedFiles 0 ChangedFiles 1 ChangedFileSize 2190 (2.14 KB) ChangedDeltaSize 0 (0 bytes) DeltaEntries 4186 RawDeltaSize 99926952 (95.3 MB) TotalDestinationSizeChange 45211649 (43.1 MB) Errors 0 ------------------------------------------------- No old backup sets found, nothing deleted. ---- Finished backup on localmachine ---- Mon Jan 16 07:00:57 GMT 2006
La ligne set -x peut être décommentée pour débugguer le script.
Sauvegarde des clés
Maintenant qu'il fonctionne vous devriez sauvegarder les clés, ailleurs que sur la machine à sauvegarder et la machine de sauvegarde distante. Quelque part, dans un endroit sûr, tel qu'une clé usb :
$ cd /media/usbdisk $ sudo tar zcvf root-$HOSTNAME.tar.gz /root
Vous pouvez aussi avoir besoin de stocker la phrase de chiffrement ssh à proximité.
Pour rendre la machine distante plus sûre, vous devez aussi définir le script de l'utilisateur de sauvegarde scponly.
Le rendre automatique
Vous pouvez maintenant exécuter manuellement le script avec
$ sudo /root/backup.sh
(vous avez besoin d'ajouter la clé ssh au trousseau de clés après un redémarrage).
Pour recréer une sauvegarde complète, ajouter --full. Pour supprimer les anciennes sauvegardes, utiliser --force.
Pour l'ajouter à cron:
$ sudo crontab -e
et mettre quelque chose comme :
# m h dom mon dow command 33 23 * * 1-6 /root/backup.sh # full backup every sunday, deleting old ones 33 23 * * 7 /root/backup.sh --full --force
Plus infos
Pour en savoir plus, man duplicity, ou lisez la page de manuel en ligne à la page internet duplicity
Voir aussi le paquet duply.
