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.