diff options
author | Sébastien Dailly <sebastien@chimrod.com> | 2021-11-18 15:14:25 +0100 |
---|---|---|
committer | Sébastien Dailly <sebastien@chimrod.com> | 2021-11-18 15:15:02 +0100 |
commit | eff766cefa1c05fe5ce3fe27f12593108681d575 (patch) | |
tree | 294fa9d00c077990a66168af546167f69dfd1a5b /content/Informatique | |
parent | f15d4362cd04499fee00d7d25bcab6658519806a (diff) |
Sauvegardes avec duplicity
Diffstat (limited to 'content/Informatique')
-rw-r--r-- | content/Informatique/2022-09-cold.rst | 372 |
1 files changed, 372 insertions, 0 deletions
diff --git a/content/Informatique/2022-09-cold.rst b/content/Informatique/2022-09-cold.rst new file mode 100644 index 0000000..00c265c --- /dev/null +++ b/content/Informatique/2022-09-cold.rst @@ -0,0 +1,372 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +==================================== +Les sauvegarde avec ovh et duplicity +==================================== + +:date: 3020-09-02 +:tags: sauvegarde, gpg +:status: draft + +Le problème avec les sauvegardes est de savoir où les mettre. La plupart du +temps nous n’en avons pas besoin (et le plus longtemps possible souhaitons le…) +et les supports sur lesquels nous les entreposons vieillissent. À noter qu’il +est également recommandé de réaliser doubler les sauvegardes (principe 3-2-1), +ce qui s’avère fastidieux si l’on fait cela nous même à la maison. + +Une solution est de mettre les sauvegarde dans le cloud, mais cela implique +alors un problème de sécurité : tout ce qui est en ligne est publique. De plus, +cela met dans la balance la question du cout des sauvegardes, toutes les +solutions ne se valent pas, et le volume n’et pas négligeable… + +Une solution pour cela est d’utiliser le principe des sauvegardes à froid : les +sauvegardes sont en quelque sorte *givrées* et ne sont pas disponibles de +suite en cas de besoin (quelques heures sont nécessaires pour les récupérer). +Par contre, l’avantage est le cout qui est beaucoup moins onéreux qu’un espace +de stockage disponible en ligne. Voici par exemple les tarifs pour le stockage +à froid chez OVH : + +=========================== ======================== +Action Prix +=========================== ======================== +Stockage froid sécurisé 0,002 € HT/mois/Go +Trafic entrant 0,01 € HT/Go +Trafic sortant 0,01 € HT/Go +=========================== ======================== + +L'inconvénient étant une non-disponibilité immédiate des fichiers archivés. +Cela en soit ne pose pas de problème pour sauvegarder ses photos, mais cela +empêche de mettre en place une sauvegarde incrémentale, puisqu'il est +nécessaire pour l'outil de sauvegarde de pouvoir comparer la liste des fichiers +archivés afin de savoir lesquels mettre à jour. + +Il faut donc trouver une solution qui, en plus de chiffrer les données avant de +les envoyer en ligne, conserve un moyen de mettre à jour les sauvegardes sans +avoir besoin de les dégeler avant. + +.. contents:: + :depth: 1 + +Présentation de la solution +=========================== + +Utiliser le stockage à froid pour y mettre les archives, et le stockage à chaud +pour toutes les données d'index. De cette manière l'application est capable de +récupérer les métadonnées afin d'identifier les données à mettre à jour en +temps réel, et la récupération des sauvegardes, elle, se fera uniquement sur +les données ayant été dégelées. + +Voir le guide d'OVH disponible à l'adresse suivante : https://docs.ovh.com/gb/en/storage/pca/duplicity/ + +Création des accès +================== + +Création +-------- + +Commencer par se créer un compte sur l'environnement d'OVH + +.. image:: {static}/images/ovh_cold/user.png + :class: floatright + :alt: Création d’un nouvel utilisateur + +Lors de la création de l'utilisateur, s'assurer que le role `ObjectStore +Operator` est bien activé. Il n'est pas nécessaire que notre utilisateur ait +tous les roles (nous voulons juste faire une sauvegarde). + +Identifiant +----------- + +.. image:: {static}/images/ovh_cold/config.png + :class: floatleft + :alt: Récupération de l’identifiant + +L'ensemble des informations du compte peuvent ensuite être récupérées dans un +fichier texte (sauf le mot de passe qui est à noter), ce fichier va nous servir +à générer la configuration de duplicity + +Configuration +============= + +Pour générer la configuration, le script `gen_config.sh` va produire le fichier +json avec les valeurs nécessaires (URL, mot de passe, identifiant etc) + +.. admonition:: Sécurité + :class: danger + + Attention ! Le fichier json contient le mot de passe en clair, attention à ne + pas conserver le fichier, ou restreindre les droits afin d’empêcher que + celui-ci ne soit exposé. + +.. figure:: {static}/images/mimetypes/application-x-executable.png + :alt: get the file + :align: center + :target: {static}/resources/backup/gen_config.sh + + Télécharger + +Il faut lui donner en paramètre le fichier téléchargé, et la configuration à +lancer : + +.. code-block:: console + + $ ./gen_config.sh ./user_duplicity.sh config.json backup_name + Please enter your OpenStack Password: XXXXX + $ + +Notre fichier json va devenir la destination de nos sauvegardes. Puisqu’il +contient toutes les directives nécessaires, il suffit d’indiquer à duplicity de +l’utiliser comme emplacement de sauvegarde et l’application sera capable +d’orienter les fichiers vers le stockage à froid ou non automatiquement. + +Sauvegarder et consulter les sauvegardes +======================================== + +Sauvegarde +---------- + +Une fois le script généré, on peut lancer une syncronisation complète avec la +commande suivante : + +.. code-block:: bash + + duplicity \ + --encrypt-key ${enc_key} \ + --sign-key ${sign_key} \ + --file-prefix-manifest 'hot_' \ + --file-prefix-signature 'hot_' \ + --file-prefix-archive 'cold_' \ + full ${source} \ + "multi:$(realpath config.json)?mode=mirror&onfail=abort" + +Les mises à jour (delta) uniquement sont lancé en remplaçant :literal:`full` par +:literal:`incremental` : + +.. code-block:: bash + + duplicity \ + --encrypt-key ${enc_key} \ + --sign-key ${sign_key} \ + --file-prefix-manifest 'hot_' \ + --file-prefix-signature 'hot_' \ + --file-prefix-archive 'cold_' \ + incremental ${source}" \ + multi:$(realpath config.json)?mode=mirror&onfail=abort" + +Lister les sauvegardes +---------------------- + +Une fois la sauvegarde fait, nous avons la possibilité de consulter les +sauvegarde réalisées en accédant juste aux métadonnées avec la commande +:literal:`collection-status` : + +.. code-block:: console + + $ duplicity \ + --file-prefix-manifest 'hot_' \ + --file-prefix-signature 'hot_' \ + --file-prefix-archive 'cold_' \ + collection-status \ + "multi://$(realpath config.json)?mode=mirror&onfail=continue" + MultiBackend: pca://duplicity: 7 files + MultiBackend: swift://duplicity_hot: 14 files + Last full backup date: Wed Sep 2 09:36:13 2020 + Collection Status + ----------------- + Connecting with backend: BackendWrapper + Archive dir: … + + Found 2 secondary backup chains. + … + + Found primary backup chain with matching signature chain: + ------------------------- + Chain start time: Wed Sep 2 09:36:13 2020 + Chain end time: Wed Sep 2 12:01:17 2020 + Number of contained backup sets: 5 + Total number of contained volumes: 0 + Type of backup set: Time: Num volumes: + Incremental Wed Sep 2 09:38:09 2020 0 + Incremental Wed Sep 2 11:32:19 2020 0 + Incremental Wed Sep 2 12:00:56 2020 0 + Incremental Wed Sep 2 12:01:17 2020 0 + ------------------------- + No orphaned or incomplete backup sets found. + +Contrôles et restauration +========================= + +Pour les opérations de contrôles et de restauration, je propose de commencer +par récupérer les fichiers gelés et les conserver en local. De cette manière +nous pourrons : + +1. Contrôler l’intégriter de la sauvegarde +2. Procéder à une restauration de test de celle-ci. + +Dégeler les fichiers en masse +----------------------------- + +L’interface d’OVH permet de dégeler un fichier, mais celle-ci n’est pas +pratique pour procéder à cette opération en masse. Pour ce faire, nous allons +nous connecter en SFTP directement, pour lancer l’opération de récupération. + +.. image:: {static}/images/ovh_cold/degel.png + :class: floatright + :alt: Attente du dégel des données + +Il faut se connecter au serveur suivant : + +.. code-block:: bash + + . user_duplicity.sh + sftp pca@gateways.storage.${OS_REGION_NAME}.cloud.ovh.net + +Le mot de passe de l'utilisateur est composé ainsi : + +.. code-block:: bash + + ${OS_TENANT_NAME}.${OS_USERNAME}.${OS_PASSWORD} + +.. admonition:: Compte d’accès + :class: note + + L’utilisateur est toujours :literal:`pca`, c’est à travers le mot de passe + qu’OVH identifie les ressources auxquelles nous sommes censer accéder. + +Une fois connecté en sftp, il est possible de lancer le dégel de l'ensemble des +fichiers dans un répertoire donné sans passer par l'interface. Cela peut être +utile pour préparer une restauration (duplicity stocke ses fichiers en lots de +200Mo) + +.. code-block:: console + + + > cd backup_name + > get * + +La commande va échouer (impossible de récupérer les fichiers car ceux-ci sont +gelés), mais la demande sera transmise, et les fichiers vont passer en +préparation pour restauration. + +Création d’une configuration locale +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +De la même manière que nous avions préparé un script pour générer un fichier de +configuration pour duplicity afin de sauver nos données, nous allons générer un +fichier qui va créer une configuration *locale* dans laquelle l’ensemble des +données seront chargées à partir du répertoire dans lequel nous aurons sauvé +nos fichiers. + +De cette manière, nous nous affranchissons des contraintes de temps (et du +réseau) pour toutes les opérations qui ont besoin de charger chaque archive. + +.. figure:: {static}/images/mimetypes/application-x-executable.png + :alt: get the file + :align: center + :target: {static}/resources/backup/gen_config_local.sh + + Télécharger + +Afficher les fichiers sauvegardés +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Pour lancer cette commande, il est nécessaire que les fichiers soient dégelés, +ou travailler sur les fichiers locaux. + +.. code-block:: console + + $ duplicity \ + --file-prefix-manifest 'hot_' \ + --file-prefix-signature 'hot_' \ + --file-prefix-archive 'cold_' \ + list-current-files \ + "multi:$(realpath config.json)?mode=mirror" + MultiBackend: pca://duplicity: 7 files + MultiBackend: swift://duplicity_hot: 14 files + Synchronizing remote metadata to local cache... + GnuPG passphrase for decryption: + MultiBackend: pca://duplicity: 7 files + MultiBackend: swift://duplicity_hot: 14 files + Last full backup date: Wed Sep 2 09:36:13 2020 + Wed Sep 2 09:28:55 2020 . + Sat Jan 27 17:44:34 2018 fichier1 + Sat Jan 27 17:44:34 2018 fichier2 + +.. admonition:: Mot de passe GPG + :class: note + + Lors de la restauration, duplicity demande le mot de passe GPG. Nous pouvons + valider dans rien saisir à ce moment là car nous utilisons la clef GPG pour + déchiffrer le contenu des archives. + +Il est possible d'ajouter une version spécifique en précisant l'heure de la +sauvegarde souhaitée : + +.. code-block:: console + + $ duplicity \ + --file-prefix-manifest 'hot_' \ + --file-prefix-signature 'hot_' \ + --file-prefix-archive 'cold_' \ + list-current-files --time 20200902T072859Z \ + "multi:$(realpath config.json)?mode=mirror" + +Restauration +------------ + +Sans paramètre donnés, c’est la restauration de la dernière sauvegarde qui +est exécutée : + +.. code-block:: console + + $ duplicity \ + --encrypt-key ${enc_key} \ + --sign-key ${sign_key} \ + --file-prefix-manifest 'hot_' \ + --file-prefix-signature 'hot_' \ + --file-prefix-archive 'cold_' \ + "multi:$(realpath config.json)?mode=mirror&onfail=continue" \ + $(path/to/restore) + +.. admonition:: Restauration d’une version donnée + :class: note + + Là encore, si nous ajouter la date de la sauvegarde, nous allons récupérer + une version donnée : + + .. code-block:: console + + $ duplicity \ + --encrypt-key ${enc_key} \ + --sign-key ${sign_key} \ + --file-prefix-manifest 'hot_' \ + --file-prefix-signature 'hot_' \ + --file-prefix-archive 'cold_' \ + --time 20200902T072859Z \ + "multi:$(realpath config.json)?mode=mirror&onfail=continue" \ + $(path/to/restore) + + +Utiliser duply +============== + +Duply est une application de sauvegarde basée sur duplicity. Elle permet de +faciliter les commandes et la configuration en fournissant une interface plus +simple — basée sur des fichiers de configuration plutôt que des lignes de +commande à rallonge. Les commandes qui sont présentes ci-dessus restent +valide ! + +Duply permet par contre de sauver sa configuration dans un fichier unique, qui +sera complété à l'aide de variables d'environnement dans bash. Cela permet donc +de le configurer de manière assez simple. + +Restauration +------------ + +Pour restaurer, il suffit de récupérer les fichiers *gelés* les fichiers +d'index peuvent rester sur le cloud. + +Le script de génération des fichiers de configuration a un cas particulier lors +de la commande `RESTORE`, il va en effet génerer un fichier allant chercher les +fichier en local plutôt que sur le serveur d'OVH. |