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''((''/var/duplicity'' peut être éventuellement un lien symbolique vers un autre chemin situé sur une partition plus adaptée quand celle où se trouve ''/var'' ne convient pas au volume des données à sauvegarder))
* La configuration se trouve sous ''/etc/duplicity-backup._to_.conf''
* Le shellscript lancé par cron se trouve sous ''/etc/cron.daily/duplicity-backup''
Pour consulter l'état actuel des sauvegardes de //// vers //// :
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 ====
FIXME 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
baldrick ~$ sudo cat /root/.ssh/id_rsa.pub
**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
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 [[admin:backup#sauvegarde-de-la-config-et-des-clefs-de-chiffrement|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
**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'' :
...
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
#!/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
baldrick ~$ ssh zertrin@quigon.federez.net
quigon ~$ sudo vim /var/duplicity/.ssh/authorized_keys2
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'' :
...
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
# 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._to_.conf \
--restore-file [FILE_TO_RESTORE] [DESTINATION] \
--time [TIME]
avec:
* ''--restore-file'' est équivalent à ''--restore-dir''. ;-) La procédure fonctionne de manière strictement identique pour restaurer un fichier ou un dossier.
* ''[FILE_TO_RESTORE]'' de la forme ''relative/path/to/the/file/in/the/archive''
* ''[DESTINATION]'' de la forme ''/path/to/where/to/place/the/restored/file''
* ''[TIME]'' pour le format, [[http://duplicity.nongnu.org/duplicity.1.html#sect8|cf la doc officielle]]. Exemples qui fonctionnent:
* ''1H30M'' : il y a une heure et trente minutes
* ''12D'' : il y a 12 jours
* ''"2015-12-01T00:00:00"'' le 1er décembre 2015 à minuit
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).
FIXME 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.