Ceci est une ancienne révision du document !
< retour à la page de l'administration technique
Le nouveau système de sauvegarde utilisant obnam vient d'être mis en place (Zertrin 2016-02-17 00:00).
La doc est en mode release candidate (99 % finie quoi).
EN PHASE DE TEST
Concept de sauvegarde
Backupninja sert pour les sauvegardes automatisées locales (/var/backups
) :
des informations systèmes utiles (dpkg-selections, fstab, lvm…)
des dumps des bases de données MySQL
Obnam sert à effectuer la sauvegarde proprement dite vers les serveurs de destination. Il gère l'aspect snapshot et déduplication des données.
Opérations courantes
La doc concernant la mise en place initiale se situe plus bas.
Faire une sauvegarde
Exemple depuis hexagon vers quigon :
obnam --config /etc/obnam/to_quigon.profile backup
Voir les générations (versions)
Exemple depuis hexagon avec l'archive située sur quigon :
obnam --config /etc/obnam/to_quigon.profile generations
Restaurer des données
Restauration depuis le serveur originel
Ce cas se présente lorsque le serveur originel est toujours “ok” mais qu'on veut restaurer des données perdues/modifiées par inadvertance/…
Restauration via montage FUSE
Exemple depuis hexagon avec l'archive située sur quigon :
Création d'un dossier pour le point de montage
mkdir /path/to/restore-fuse-mountpoint
montage de l'archive en tant que système de fichier FUSE
obnam --config /etc/obnam/to_quigon.profile mount --to /path/to/restore-fuse-mountpoint
Montre les générations accessibles pour la restauration
ls -la /path/to/restore-fuse-mountpoint
Restauration du fichier /etc/postfix/main.cf depuis la dernière génération
cp /path/to/restore-fuse-mountpoint/latest/etc/postfix/main.cf /tmp/main.cf.restored
Démonter le système de fichier FUSE
fusermount -u /path/to/restore-fuse-mountpoint
Restauration depuis une machine tierce
Dans le cas où l'on veut restaurer sur une machine X (pas précédemment inclue dans le système des sauvegardes) les données d'une machine A à partir de la sauvegarde effectuée sur la machine B ou C.
Il faut installer obnam
sur la machine X (merci Captain Obvious !)
Il faut au préalable ajouter la clef publique SSH du compte qui sert à effectuer la restauration dans le ~obnam/.ssh/autorized_keys
sur la machine B (sinon obnam ne pourra pas se connecter en SFTP au repository).
Il suffit ensuite d'utiliser obnam depuis la machine X en précisant
l'option --repository=sftp://obnam@machineB.example.org/~/obnam-repository
pour aller chercher les données sur la machine B
l'option --client-name=machineA
pour restaurer les données de la machine A
l'option --no-default-configs
pour faire fi de toute éventuelle configuration d'obnam déjà présente sur la machine X
Exemple testé ci-dessous : restauration sur gluon (serveur perso de Zertrin) de données de baldrick à partir de la sauvegarde située sur hexagon.
Avec FUSE
Ajout de la clef SSH de zertrin@gluon
dans ~obnam/.ssh/authorized_keys
sur hexagon : exercice laissé au lecteur
Lister les générations disponibles (et en même temps vérifier que la connexion fonctionne) :
obnam --no-default-configs --repository=sftp://obnam@hexagon.federez.net/~/obnam-repository --client-name=baldrick generations
output
2 2016-02-14 22:46:03 .. 2016-02-14 22:57:24 (9013 files, 42206636 bytes)
23 2016-02-14 23:34:11 .. 2016-02-14 23:36:00 (9018 files, 58471331 bytes)
65 2016-02-15 00:33:38 .. 2016-02-15 00:34:21 (9209 files, 81373094 bytes)
87 2016-02-15 01:28:28 .. 2016-02-15 01:29:04 (9147 files, 75389186 bytes)
108 2016-02-15 23:45:34 .. 2016-02-15 23:46:41 (9149 files, 75545016 bytes)
129 2016-02-16 01:40:25 .. 2016-02-16 01:41:06 (9149 files, 75617687 bytes)
150 2016-02-16 03:40:22 .. 2016-02-16 03:40:42 (9149 files, 75617687 bytes)
171 2016-02-16 05:40:21 .. 2016-02-16 05:40:45 (9149 files, 75681743 bytes)
192 2016-02-16 07:40:24 .. 2016-02-16 07:40:44 (9149 files, 75686602 bytes)
213 2016-02-16 09:40:22 .. 2016-02-16 09:40:43 (9149 files, 75687464 bytes)
234 2016-02-16 11:40:29 .. 2016-02-16 11:40:49 (9149 files, 75687464 bytes)
255 2016-02-16 13:40:24 .. 2016-02-16 13:40:46 (9149 files, 75687464 bytes)
276 2016-02-16 15:40:23 .. 2016-02-16 15:40:47 (9149 files, 75687654 bytes)
297 2016-02-16 17:40:30 .. 2016-02-16 17:40:55 (9149 files, 75687654 bytes)
318 2016-02-16 19:40:49 .. 2016-02-16 19:41:23 (9149 files, 75687325 bytes)
mkdir /path/to/obnam_restore_baldrick
obnam --no-default-configs --repository=sftp://obnam@hexagon.federez.net/~/obnam-repository --client-name=baldrick mount --to /path/to/obnam_restore_baldrick
ls -la /path/to/obnam_restore_baldrick
output
total 68
drwxr-xr-x 25 root root 4096 Feb 15 23:46 108
drwxr-xr-x 25 root root 4096 Feb 16 01:41 129
drwxr-xr-x 25 root root 4096 Feb 16 03:40 150
drwxr-xr-x 25 root root 4096 Feb 16 05:40 171
drwxr-xr-x 25 root root 4096 Feb 16 07:40 192
drwxr-xr-x 25 root root 4096 Feb 14 22:57 2
drwxr-xr-x 25 root root 4096 Feb 16 09:40 213
drwxr-xr-x 25 root root 4096 Feb 14 23:36 23
drwxr-xr-x 25 root root 4096 Feb 16 11:40 234
drwxr-xr-x 25 root root 4096 Feb 16 13:40 255
drwxr-xr-x 25 root root 4096 Feb 16 15:40 276
drwxr-xr-x 25 root root 4096 Feb 16 17:40 297
drwxr-xr-x 25 root root 4096 Feb 16 19:41 318
drwxr-xr-x 25 root root 4096 Feb 15 00:34 65
drwxr-xr-x 25 root root 4096 Feb 15 01:29 87
lrwxr-xr-x 25 root root 4096 Feb 16 19:41 latest -> 318
-r--r--r-- 25 root root 4096 Feb 16 19:41 .pid
ls -la /path/to/obnam_restore_baldrick/42
ls -laH /path/to/obnam_restore_baldrick/latest
output
total 28
drwxr-xr-x 6 root root 4096 Feb 14 17:51 data
drwxr-xr-x 112 root root 12288 Feb 16 17:53 etc
drwxr-xr-x 24 root root 4096 Dec 21 17:16 home
drwx------ 17 root root 4096 Feb 16 14:06 root
drwxr-xr-x 14 root root 4096 Feb 14 17:51 var
cp /path/to/obnam_restore_baldrick/42/etc/postfix/main.cf /path/to/destination/main.cf.restored
fusermount -u /path/to/obnam_restore_baldrick
Mise en place initiale d'obnam
Exemple avec hexagon, mais la procédure est la même pour chaque serveur.
Installation d'obnam
Utilisation des dépôts jessie-backports pour avoir une version assez récente. Dans /etc/apt/source.list
ajouter (si nécessaire) :
deb http://http.debian.net/debian jessie-backports main
Puis apt-get update
et avec l'aide d' aptitude
par exemple choisir la version d'obnam provenant des backports.
Préparatifs sur un serveur de destination
Opérations effectuées en root
. Vous pouvez aussi le faire avec sudo
si vous préférez.
Exemple ici avec quigon comme serveur de destination, à répéter pour chaque serveur de destination en adaptant les noms de serveurs.
Ajout de l'utilisateur obnam
:
Pour quigon et baldrick on place le $HOME d'obnam dans /data/obnam
pour profiter de la grosse partition où se trouve /data
quigon ~ # adduser --system --group --disabled-password --shell /usr/lib/sftp-server --home /data/obnam obnam
Pour hexagon on place le $HOME d'obnam dans /home/obnam
pour profiter de la grosse partition où se trouve /home
quigon ~ # adduser --system --group --disabled-password --shell /usr/lib/sftp-server --home /home/obnam obnam
On prépare le fichier .ssh/authorized_keys
pour permettre la connexion par clef publique depuis les autres serveurs.
quigon ~ # cd ~obnam
quigon ~obnam # sudo -u obnam mkdir .ssh
quigon ~obnam # sudo -u obnam touch .ssh/authorized_keys
quigon ~obnam # chmod 600 .ssh/authorized_keys
quigon ~obnam # vim .ssh/authorized_keys # ajouter les clefs publiques de root@hexagon et root@baldrick
On teste si la connexion sans mot de passe fonctionne depuis le serveur de départ (ici exemple avec hexagon) et on en profite pour créer le repository pour la sauvegarde (si pas déjà fait).
hexagon ~ # sftp obnam@quigon.federez.net
sftp> mkdir obnam-repository
sftp> ^D
Configuration d'obnam
Initialisation du répertoire /etc/obnam
:
hexagon ~ # mkdir /etc/obnam && cd /etc/obnam
hexagon obnam # touch obnam_hexagon.conf to_baldrick.profile to_quigon.profile
Contenu des fichiers de config
Le premier fichier (obnam_<servername>.conf
) correspond à la conf spécifique au serveur qui crée et envoie ses sauvegardes. On y trouve notamment la liste des chemins à inclure et ceux à exclure.
Les deux fichiers suivants (to_<servername>.profile
) servent juste à pointer vers le dépôt de sauvegarde sur les deux autres serveurs.
Attention pour les options root
et exclude
: le dernier élément ne doit pas se terminer avec une virgule !
config pour hexagon (2016-02-17 00:00)
- obnam_hexagon.conf
[config]
client-name = hexagon
root = /etc,
/home,
/root,
/var/backups,
/var/lib/ldap,
/var/lib/mailman
exclude = .*/obnam-repository$,
.*/\.cache,
/home/duplicity,
/home/ftp,
/root/.local/share/letsencrypt,
/srv/ftp
log = /var/log/obnam.log
log-level = info
log-max = 1000000
log-keep = 10
log-mode = 0600
one-file-system = yes
keep = 72h,15d,52w,5y
upload-queue-size = 512
lru-size = 1024
- to_baldrick.profile
[config]
repository = sftp://obnam@baldrick.federez.net/~/obnam-repository
- to_quigon.profile
[config]
repository = sftp://obnam@quigon.federez.net/~/obnam-repository
config pour quigon (2016-02-17 00:00)
- obnam_quigon.conf
[config]
client-name = quigon
root = /etc,
/home,
/root,
/srv/dokuwiki,
/var/backups,
/var/lib/ldap,
/var/lib/mailman
exclude = .*/obnam-repository$,
.*/\.cache$,
/home/backup_cyric,
/home/backup_quigon,
/home/kage/Federez,
/home/zertrin/restore-nautilus,
/root/.local/share/letsencrypt,
log = /var/log/obnam.log
log-level = info
log-max = 1000000
log-keep = 10
log-mode = 0600
one-file-system = yes
keep = 72h,15d,52w,5y
upload-queue-size = 512
lru-size = 1024
- to_baldrick.profile
[config]
repository = sftp://obnam@baldrick.federez.net/~/obnam-repository
- to_hexagon.profile
[config]
repository = sftp://obnam@hexagon.federez.net/~/obnam-repository
config pour baldrick (2016-02-17 00:00)
- obnam_baldrick.conf
[config]
client-name = baldrick
root = /etc,
/data/backups/phabricator,
/home,
/root,
/var/backups
exclude = .*/obnam-repository$,
.*/\.cache$,
/home/git,
/root/.local/share/letsencrypt,
log = /var/log/obnam.log
log-level = info
log-max = 1000000
log-keep = 10
log-mode = 0600
one-file-system = yes
keep = 72h,15d,52w,5y
upload-queue-size = 512
lru-size = 1024
- to_hexagon.profile
[config]
repository = sftp://obnam@hexagon.federez.net/~/obnam-repository
- to_quigon.profile
[config]
repository = sftp://obnam@quigon.federez.net/~/obnam-repository
Test première sauvegarde
Exemple depuis hexagon vers quigon:
obnam --config /etc/obnam/to_quigon.profile backup
Purger les vieilles générations selon une politique donnée
L'option keep = 72h,15d,52w,5y
dans le fichier de config correspond à la politique suivante :
garder une génération par heure pendant 72 heures
garder une génération par jour pendant 15 jours
garder une génération par semaine pendant 52 semaines
garder une génération par an pendant 5 ans
En appelant la commande suivante une fois par jour, les générations qui sont superflues sont supprimées de l'archive.
Exemple depuis hexagon avec l'archive située sur quigon :
obnam --config /etc/obnam/to_quigon.profile forget
Mise en place des cron pour obnam
Les crons se trouvent dans /etc/cron.d/obnam-backup
et /etc/cron.d/obnam-forget
Les /etc/cron.d/obnam-backup sur les 3 serveurs
hexagon
- /etc/cron.d/obnam-backup
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
35 0-22/2 * * * root obnam --config /etc/obnam/to_baldrick.profile backup 1>/dev/null
40 1-23/2 * * * root obnam --config /etc/obnam/to_quigon.profile backup 1>/dev/null
quigon
- /etc/cron.d/obnam-backup
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
35 0-22/2 * * * root obnam --config /etc/obnam/to_hexagon.profile backup 1>/dev/null
40 1-23/2 * * * root obnam --config /etc/obnam/to_baldrick.profile backup 1>/dev/null
baldrick
- /etc/cron.d/obnam-backup
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
35 0-22/2 * * * root obnam --config /etc/obnam/to_quigon.profile backup 1>/dev/null
40 1-23/2 * * * root obnam --config /etc/obnam/to_hexagon.profile backup 1>/dev/null
Les /etc/cron.d/obnam-forget sur les 3 serveurs
hexagon
- /etc/cron.d/obnam-forget
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
5 0 * * * root obnam --config /etc/obnam/to_baldrick.profile forget 1>/dev/null
10 0 * * * root obnam --config /etc/obnam/to_quigon.profile forget 1>/dev/null
quigon
- /etc/cron.d/obnam-forget
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
5 0 * * * root obnam --config /etc/obnam/to_baldrick.profile forget 1>/dev/null
10 0 * * * root obnam --config /etc/obnam/to_quigon.profile forget 1>/dev/null
baldrick
- /etc/cron.d/obnam-forget
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
5 0 * * * root obnam --config /etc/obnam/to_hexagon.profile forget 1>/dev/null
10 0 * * * root obnam --config /etc/obnam/to_baldrick.profile forget 1>/dev/null
. . . 0 . . . H -> B -> Q
55 5 <-----------------+ ^ |
. + . | forget |
. | . +---------+
. | . seulement à 0h05
50 | 10 <----+
H <- B <- Q . | |
| ^ . | . |
| backup | +-----+ . | . | H <- B <- Q
+---------+ | | . +---+ | ^
heures impaires | 45 +----------------+-----------------+ 15 | forget |
| . | . +---------+
| . | . seulement à 0h10
| . | .
| |
+----> 40 | 20
. | .
H -> B -> Q . | .
^ | . + .
| backup | +------------------> 35 25
+---------+ . . . 30 . . .
heures paires
Installation de backupninja
Backupninja sert à créer des backups des informations système ainsi que de la base de donnée MySQL automatiquement.
Pour info, les backups créés par backupninja sont stockés dans /var/backups
. Ce dossier est inclus dans la sauvegarde d'obnam ce qui permet d'externaliser les backups effectués par backupninja.
apt-get install hwinfo debconf-utils backupninja
Désactiver l'envoi de mails en cas de succès : dans /etc/backupninja.conf
mettre/changer reportsuccess = no
.
Activer les backups des infos systèmes ( mettre lvm = no
pour les systèmes sans LVM comme quigon)
Ajouter le fichier /etc/backup.d/10.sys
- /etc/backup.d/10.sys
packages = yes
partitions = yes
dosfdisk = yes
hardware = yes
luksheaders = no
lvm = yes
# packagesfile = /var/backups/dpkg-selections.txt
# selectionsfile = /var/backups/debconfsel.txt
# partitionsfile = /var/backups/partitions.__star__.txt
# hardwarefile = /var/backups/hardware.txt
# luksheadersfile = /var/backups/luksheader.__star__.bin
# If vservers = yes in /etc/backupninja.conf then the following variables can
# be used:
# vsnames = all | <vserver1> <vserver2> ... (default = all)
Activer les backups pour la base de donnée MySQL ( uniquement sur hexagon et baldrick)
Ajouter le fichier /etc/backup.d/20.mysql
- /etc/backup.d/20.mysql
### backupninja MySQL config file ###
# hotcopy = < yes | no > (default = no)
# make a backup of the actual database binary files using mysqlhotcopy.
hotcopy = no
# sqldump = < yes | no > (default = no)
# make a backup using mysqldump. this creates text files with sql commands
# sufficient to recontruct the database.
#
sqldump = yes
# sqldumpoptions = <options>
# (default = --lock-tables --complete-insert --add-drop-table --quick --quote-names)
# arguments to pass to mysqldump
# sqldumpoptions = --add-drop-table --quick --quote-names
# compress = < yes | no > (default = yes)
# if yes, compress the sqldump output.
compress = yes
# dbhost = <host> (default = localhost)
# backupdir = <dir> (default: /var/backups/mysql)
# where to dump the backups. hotcopy backups will be in a subdirectory
# 'hotcopy' and sqldump backups will be in a subdirectory 'sqldump'
backupdir = /var/backups/mysql
# databases = <all | db1 db2 db3 > (default = all)
# which databases to backup. should either be the word 'all' or a
# space separated list of database names.
databases = all
configfile = /etc/mysql/debian.cnf
Le système de sauvegarde documenté ci-dessous utilisant duplicity
avec le wrapper duplicity-backup.sh
est en train d'être migré vers une nouvelle solution utilisant obnam
. (Zertrin 2016-02-14 23:15) NE PLUS UTILISER
Duplicity
Backup interserveurs en mode push a l'aide de duplicity et son wrapper duplicity-backup.
Le wrapper pour duplicity se trouve sous /root/scripts/duplicity-backup
Les sauvegardes se trouvent sur chaque serveur dans le répertoire
/var/duplicity
1)
La configuration se trouve sous /etc/duplicity-backup.<machine1>_to_<machine2>.conf
Le shellscript lancé par cron se trouve sous /etc/cron.daily/duplicity-backup
Pour consulter l'état actuel des sauvegardes de <machine1> vers <machine2> :
sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.machine1_to_machine2.conf -s
Situation actuelle
hexagon → quigon (2015-09-14 21:00)
INCLIST=( "/etc" \
"/root" \
"/home" \
"/srv" \
"/var/lib/ldap" \
"/var/lib/mailman" \
)
EXCLIST=( "/home/duplicity" \
"/home/ftp" \
"/root/.cache/duplicity" \
)
hexagon → baldrick (2015-09-14 21:00)
INCLIST=( "/etc" \
"/root" \
"/home" \
"/srv" \
"/var/lib/ldap" \
"/var/lib/mailman" \
)
EXCLIST=( "/home/duplicity" \
"/home/ftp" \
"/root/.cache/duplicity" \
)
quigon → hexagon (2015-09-14 21:00)
INCLIST=( "/etc" \
"/home" \
"/root" \
"/srv" \
"/var/lib/mailman" \
)
EXCLIST=( "/root/backup_quigon" \
"/root/backup_cyric" \
"/root/.cache/duplicity" \
"/home/zertrin/restore-nautilus" \
)
quigon → baldrick (2015-09-14 21:00)
INCLIST=( "/etc" \
"/home" \
"/root" \
"/srv" \
"/var/lib/mailman" \
)
EXCLIST=( "/root/backup_quigon" \
"/root/backup_cyric" \
"/root/.cache/duplicity" \
"/home/zertrin/restore-nautilus" \
)
baldrick → hexagon (2015-06-07 01:00)
INCLIST=( "/etc" \
"/home" \
"/root" \
"/data/backups/phabricator" \
)
EXCLIST=( "/root/.cache/duplicity" )
baldrick → quigon (2015-06-07 01:00)
INCLIST=( "/etc" \
"/home" \
"/root" \
"/data/backups/phabricator" \
)
EXCLIST=( "/root/.cache/duplicity" )
Détails techniques
Mise en place initiale
PAS ENCORE ADAPTÉ/MIS EN FORME : ne pas utiliser tel quel ! Mais l'idée générale y est et devrait suffire à reproduire.
Procédure à ne faire que si l'on part de zéro sur tous les serveurs (pas de backups en place)
Voir la procédure
nautilus ~ # aptitude install duplicity
nautilus ~ # ssh-keygen -t rsa -b 2048
nautilus ~ # l /root/.ssh
nautilus ~ # cat /root/.ssh/id_rsa.pub
nautilus ~ # ssh zertrin@quigon.federez.net
zertrin@quigon:~$ sudo adduser --system --group --disabled-password --shell /usr/lib/sftp-server --home /var/duplicity duplicity
zertrin@quigon:~$ cd /var/duplicity
zertrin@quigon:~$ sudo -u duplicity mkdir .ssh
zertrin@quigon:~$ sudo -u duplicity touch .ssh/authorized_keys2
zertrin@quigon:~$ vim .ssh/authorized_keys2
zertrin@quigon:~$ chmod 600 .ssh/authorized_keys2
zertrin@quigon:~$ ^D
nautilus ~ # sftp duplicity@quigon.federez.net
sftp> mkdir nautilus
sftp> ^D
nautilus ~ # gpg --gen-key
nautilus ~ # gpg --gen-key
nautilus ~ # mkdir scripts && cd scripts
nautilus scripts # git clone git://github.com/zertrin/duplicity-backup.git
nautilus scripts # cd duplicity-backup
nautilus duplicity-backup (master) # cp duplicity-backup.conf.example /etc/duplicity-backup.conf
nautilus duplicity-backup (master) # vim /etc/duplicity-backup.conf
nautilus duplicity-backup (master) # ./duplicity-backup.sh -c /etc/duplicity-backup.conf -b
nautilus duplicity-backup (master) # vim /etc/cron.daily/duplicity-backup
nautilus duplicity-backup (master) # chmod +x /etc/cron.daily/duplicity-backup
Extension sur un nouveau serveur
Si au moins un des serveurs a déjà été configuré (voir procédure précédente) et qu'on désire préparer un autre serveur pour effectuer des sauvegardes via duplicity-backup.
Voir la procédure
Pour cette procédure, le nouveau serveur est baldrick et le serveur déjà configuré précédemment est hexagon. Pensez à adapter les noms de serveurs partout où il faut dans votre situation.
Installation de duplicity
baldrick ~$ sudo aptitude install duplicity
Génération d'une clef ssh pour root
seulement si nécessaire (pas encore de /root/.ssh/id_rsa{,.pub}
présents)
baldrick ~$ sudo ssh-keygen -t rsa -b 2048
<ne pas entrer de mot de passe>
baldrick ~$ sudo cat /root/.ssh/id_rsa.pub
<copier la clef publique de root@baldrick>
Mise en place connexion SFTP par clef SSH vers le serveur de destination
Ajout de la clef SSH de root@baldrick aux clef autorisées à se connecter à hexagon avec le login duplicity.
baldrick ~$ ssh zertrin@hexagon.federez.net
hexagon ~$ sudo vim /var/duplicity/.ssh/authorized_keys2
<ajouter la clef publique de root@baldrick à la fin>
hexagon ~$ ^D
On teste si la connexion sans mot de passe fonctionne et on en profite pour créer le dossier de destination de la sauvegarde.
baldrick ~$ sudo sftp duplicity@hexagon.federez.net
sftp> mkdir baldrick
sftp> ^D
Récupération du wrapper duplicity-backup.sh
Le wrapper est placé dans /root/scripts/duplicity-backup
.
baldrick ~$ sudo mkdir /root/scripts
baldrick ~$ sudo git clone git://github.com/zertrin/duplicity-backup.git /root/scripts/duplicity-backup
Import des clefs GPG de chiffrement et de signature
Pour se simplifier la vie, on importe les données issues d'une sauvegarde de la config et des clefs de chiffrement effectuée préalablement sur un autre serveur où duplicity-backup a déjà été mis en place.
Au préalable, transférer une de ces sauvegardes (.tar.gpg) dans le dossier courant
baldrick ~$ gpg -d duplicity-backup-2013-07-25.tar.gpg | tar x
gpg: données chiffrées avec CAST5
Entrez la phrase de passe : (cf. password/duplicity-backup)
Sinon toute autre méthode pour récupérer les deux clefs privées sous format texte convient aussi :)
Passons à l'import des clefs GPG à proprement parler :
baldrick ~$ sudo gpg --import duplicity-backup-2013-07-25/duplicity-backup-encryption-secret.key.txt
baldrick ~$ sudo gpg --import duplicity-backup-2013-07-25/duplicity-backup-sign-secret.key.txt
baldrick ~$ sudo gpg --edit-key 8B97F497
gpg> trust
Quelle est votre décision ? 5
Voulez-vous vraiment attribuer une confiance ultime à cette clef ? (o/N) o
gpg> quit
baldrick ~$ sudo gpg --edit-key 9ED0EF7B
<idem>
Copie d'une config existante de duplicty-backup et paramétrage
Parce que le sysadmin est fainéant, on se contente de copier la config d'un autre serveur et de l'adapter ;)
baldrick ~$ sudo cp /root/duplicity-backup-2013-07-25/duplicity-backup.hexagon_to_quigon.conf /etc/duplicity-backup.baldrick_to_hexagon.conf
baldrick ~$ sudo rm -rf /root/duplicity-backup-2013-07-25
baldrick ~$ sudo vim /etc/duplicity-backup.baldrick_to_hexagon.conf
Adapter les variables DEST
, INCLIST
et EXCLIST
:
- duplicity-backup.baldrick_to_hexagon.conf
...
DEST="ssh://duplicity@hexagon.federez.net/baldrick"
...
INCLIST=( "/etc" \
"/root" \
"/home" \
)
...
EXCLIST=( )
...
Sauvegarde initiale
Ceci effectuera la première sauvegarde (complète).
baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -b
Si tout va bien cette sauvegarde apparait dans le résultat de la commande suivante :
baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -s
Mise en place du cronjob
baldrick ~$ sudo vim /etc/cron.daily/duplicity-backup
- duplicity-backup
#!/bin/sh
test -x /root/scripts/duplicity-backup/duplicity-backup.sh || exit 0
cd /root/scripts/duplicity-backup
LANG=C ./duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf --backup
baldrick ~$ sudo chmod +x /etc/cron.daily/duplicity-backup
Test du cronjob :
baldrick ~$ sudo /etc/cron.daily/duplicity-backup
baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -s
Si tout va bien, bravo c'est fini !
Ajout de nouvelles destinations de sauvegarde
Seulement si le serveur auquel on ajoute une nouvelle destination de sauvegarde a déjà été configuré une première fois (voir procédure ci-dessus).
Voir la procédure
Mise en place connexion SFTP par clef SSH vers le serveur de destination
Ajout de la clef SSH de root@baldrick aux clefs autorisées à se connecter.
baldrick ~$ sudo cat /root/.ssh/id_rsa.pub
<copier la clef publique de root@baldrick>
baldrick ~$ ssh zertrin@quigon.federez.net
quigon ~$ sudo vim /var/duplicity/.ssh/authorized_keys2
<ajouter la clef publique de root@baldrick à la fin>
quigon ~$ ^D
On teste si la connexion sans mot de passe fonctionne et on en profite pour créer le dossier de destination de la sauvegarde.
baldrick ~ # sudo sftp duplicity@quigon.federez.net
sftp> mkdir baldrick
sftp> ^D
Copie du fichier de config et paramétrage
On crée un fichier de config par couple source → destination.
baldrick ~$ sudo cp /etc/duplicity-backup.baldrick_to_hexagon.conf /etc/duplicity-backup.baldrick_to_quigon.conf
baldrick ~$ sudo vim /etc/duplicity-backup.baldrick_to_quigon.conf
Adapter les variables DEST
, INCLIST
et EXCLIST
:
- duplicity-backup.baldrick_to_quigon.conf
...
DEST="ssh://duplicity@quigon.federez.net/baldrick"
...
INCLIST=( "/etc" \
"/root" \
"/home" \
)
...
EXCLIST=( )
...
Sauvegarde initiale
baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_quigon.conf -b
Si tout va bien la sauvegarde initiale apparait dans le résultat de la commande suivante :
baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_quigon.conf -s
Adaptation du cronjob pour effectuer la sauvegarde vers la nouvelle destination
baldrick ~$ sudo vim /etc/cron.daily/duplicity-backup
- duplicity-backup
# ajouter cette ligne à la fin
LANG=C ./duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_quigon.conf --backup
Test du cronjob :
baldrick ~$ sudo /etc/cron.daily/duplicity-backup
baldrick ~$ sudo /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf -s
Si tout va bien, bravo c'est fini !
Sauvegarde de la config et des clefs de chiffrement
Très important ! Chaque admin technique devrait générer ces sauvegardes pour lui-même et les conserver en lieu sûr (i.e. pas sur les serveurs où elles ont été générées). Sans ces données il sera difficile de restaurer les données. (et même impossible si les clefs GPG sont perdues)
Ces archives sont générées à l'aide de l'option --backup-script
du wrapper duplicity-backup.sh.
Ceci génère une archive TAR chiffrée symétriquement avec GPG. Le mot de passe utilisé est le même pour tous les serveurs et se trouve dans /root/passwords/duplicity-backup
Dans l'archive se trouve tout ce qui est nécessaire pour effectuer une restauration des données à partir d'un autre serveur (fichier de config + clefs GPG de signature et de chiffrement).
hexagon ~ # /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.hexagon_to_quigon.conf --backup-script
You are backing up:
1. /root/scripts/duplicity-backup/duplicity-backup.sh
2. GPG Secret encryption key: 8B97F497 and GPG secret sign key: 9ED0EF7B
3. Config file: /etc/duplicity-backup.hexagon_to_quigon.conf
Backup tarball will be encrypted and saved to: /root/duplicity-backup-2013-07-25.tar.gpg
>> Are you sure you want to do that ('yes' to continue)?
yes
Encrypting tarball, choose a password you'll remember...
IMPORTANT!!
>> To restore these files, run the following (remember your password):
gpg -d duplicity-backup-2013-07-25.tar.gpg | tar x
Procédure de restauration
Dans tous les cas il est nécessaire de diposer de la clef de déchiffrement correspondant à la clef GPG 8B97F497
Restaurer depuis le serveur d'origine
On suppose ici le cas où un fichier ou dossier a été modifié ou supprimé par mégarde et qu'on cherche à restaurer celui-ci tel qu'il était auparavant, le tout depuis le serveur d'origine.
C'est la situation la plus simple car duplicity-backup.sh a déjà été mis en place et est configuré.
Voici la commande générique :
serveur1 ~ # /root/scripts/duplicity-backup/duplicity-backup.sh \
--config /etc/duplicity-backup.<machinededépart>_to_<machinedarrivée>.conf \
--restore-file [FILE_TO_RESTORE] [DESTINATION] \
--time [TIME]
avec:
Exemple de restauration du fichier /etc/postfix/main.cf
tel qu'il était il y a 12 jours sur le serveur hexagon depuis le backup effectué sur quigon. Le fichier restauré est enregistré sous
/root/main.cf.restored
.
hexagon ~ #/root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.hexagon_to_quigon.conf --restore-file etc/postfix/main.cf /root/main.cf.restored --time 12D
Exemple de restauration du dossier /etc/apache2
tel qu'il était il y a 1 heure et demi sur le serveur baldrick depuis le backup effectué sur hexagon. Le dossier restauré est enregistré sous
/root/etc-apache2.restored
.
baldrick ~ # /root/scripts/duplicity-backup/duplicity-backup.sh -c /etc/duplicity-backup.baldrick_to_hexagon.conf --restore-dir etc/apache2 /root/etc-apache2.restored --time 1H30M
Restaurer depuis une autre machine que le serveur d'origine
On suppose ici que l'on a plus accès au serveur d'origine (exemple perte du disque-dur) et qu'on veuille restaurer les données sauvegardées sur une autre machine.
On suppose aussi que l'on dispose des éléments suivants :
Fichier tar contenant le backup du script et la configuration. Ce fichier est sensé avoir été créé à l'aide de l'option --backup-script
du wrapper duplicity-backup.sh et la procédure est documentée ci-dessus.
Passphrase de la clef de chiffrement (à FedeRez c'est la clef GPG 8B97F497
)
Il est très important de s'assurer que ces éléments aient été bien conservés en dehors des serveurs (par exemple dans une base KeePass de plusieurs admin tech de FedeRez).
finir la doc. En attendant voici l'idée générale :
Installer duplicity et mettre en place le wrapper duplicity-backup.sh comme documenté ci-dessus.
Utiliser le fichier de config et les clefs GPG issues de la sauvegarde du script pour restaurer les données de la même manière que documenté dans la section précédente.