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.

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.