.. -*- 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.