Backup de données chez OVH avec duplicity

Divulgâchage : Avec la quantité de données grandissante des arsouyes, nous avons souhaité mettre en place un système de sauvegarde incrémental utilisant le Public Cloud OVH. On va utiliser un stockage dans le cloud et le logiciel duplicity pour y envoyer nos données. Le tout de manière incrémentale.

Article Obsolète : Depuis le 24 mars 2020, et le passage de la version 2 à la version 3 de l’API Keystone par OVH, cet article est obsolète. Veuillez consulter l’article « Mettre en place une sauvegarde chez OVH avec Duplicity » pour la version à jour.

Ayant notre propre serveur dans notre garage, nous nous sommes posé la question de la sauvegarde. Nous avons des disques dur en RAID, ce n’est pas vraiment les crash disque que nous craignons plus qu’un cryptolocker ou un incendie.

Geralt @ Pixabay

Tout copier sur un disque dur externe une fois par mois, le débrancher et le stocker hors de chez nous, c’est un peu has been. On va donc vous expliquer les moyens que nous avons mis en place afin de stocker de manière efficace et automatique nos données.

Choix de la méthode et de l’outil

Tout d’abord, on veut quoi exactement ? Sauvegarder ses données ? Oui, mais quoi d’autre ? Il faut se poser les questions pertinentes afin de déterminer exactement les besoins et en sortir les outils adéquats.

Qu’est ce qu’on sauvegarde?

Pour le moment, uniquement des fichiers. Le plus gros de la sauvegarde sera constitué de photos de famille en JPEG, donc des données déjà compressées, qu’il est inutile de chercher à compresser plus. Le reste étant anecdotique en volume par rapport aux photos et vidéos, car il s’agit surtout de fichiers texte.

congerdesign @ pixabay

Pour résumer, plusieurs giga de données, pas forcément compressibles.

Et on fait quoi maintenant de cette information ?

Maintenant que l’on sait que l’on a plusieurs giga de données à sauvegarder, il ne nous viendrait pas à l’idée de les envoyer toutes les nuits entièrement sur le serveur externe de sauvegarde. Tout d’abord, parce que ça génèrerait un trafic monstre pour pas grand-chose, et également parce que certains opérateurs font payer le trafic entrant…

La solution est donc de faire une sauvegarde incrémentale de nos données. C’est à dire qu’au lieu de les envoyer bêtement toutes les nuits entièrement sur le serveur de backup, on va faire un diff, et n’envoyer que ce qui a changé. Cette sauvegarde incrémentale est tout de même configurée de manière intelligente. C’est à dire qu’il est programmé régulièrement des sauvegardes complètes, pour que le jour où l’on souhaite récupérer nos données, la récupération ne soit pas trop longue.

Et je me débrouille comment avec mes fichiers à envoyer ?

Evidemment, cela serait un gaspillage de place que de copier tous les fichiers à sauvegarder à un endroit, afin de les envoyer ensuite sur le serveur distant. Pour cela, une solution est de créer un répertoire contenant ce que l’on souhaite backuper, mais au lieu d’y coller ce qu’on veut sauvegarder, on se contentera de faire des liens symboliques.

Bien sûr, pour cela, il faut que l’outil de backup gère les liens symboliques, c’est à dire qu’il copie les fichiers correspondants, et non juste les liens, ce qui avouons-le, ne serait pas très utile.

Et mes sauvegardes, elles seront conservées combien de temps ?

Tout dépendra de ce que l’on configurera dans le logiciel. Pour cela, il faut donc un logiciel qui puisse gérer lui-même l’effacement des données trop vieilles. Evidemment, comme nous avons choisi de faire une sauvegarde incrémentale, la quantité de données sur le serveur ne devrait pas exploser, mais comme nous souhaitons quand même faire quelques sauvegardes complètes, on doit s’assurer de ne pas garder des backups trop vieux pour ne pas surcharger inutilement serveur.

Et encore quelque chose ?

Ensuite, le chiffrement des données serait un plus. En cas de compromission du serveur de backup, on pourra ainsi s’assurer que nos photos perso ou nos documents administratifs ne se promènent pas dans la nature.

Au final

À la vue de notre cahier des charges, nous avons opté pour duplicity, parce qu’il regroupait ce dont on avait besoin, qu’il existe de la documentation en ligne, et qu’il est dans les packages Ubuntu, OS de notre NAS.

Choix du serveur de stockage externe

Dans le monde de la sauvegarde dans le cloud, il existe le stockage à froid et le stockage classique dans le cloud. La différence principale entre ces deux types de stockage est qu’il faut un délai pour l’extraction des données dans un stockage à froid.

Stockage à froid. Moritz320 @ pixabay

Cela pouvant poser quelques problèmes car notre solution de sauvegarde incrémentale nécessite de pouvoir accéder rapidement aux données afin de vérifier si elles ont été modifiées ou non… Nous avons donc choisi un stockage classique dans le cloud.

Nous avons choisi la solution Object Storage de OVH . Tout d’abord, parce que ce n’est pas très cher, et en plus, car nous avons déjà un compte chez eux pour certains de nos services, et que ça évite donc de multiplier les comptes clients…

La solution Object Storage ne permet de payer qu’au Go stocké (0.01€ H.T./mois/Go) et au Go sortant (0.01€HT/go)… Autant dire qu’il faut avoir quand même beaucoup de données avant que le coût soit rédhibitoire.

Mise en place

Création du conteneur de stockage chez OVH

Pour commander un Public Cloud, je vous laisse faire. Sachez juste qu’il s’agit des offres professionnelles et que du coup, ils vont vous demander des informations et des copies de pièces d’identité.

Une fois que l’administratif a suivi son cours et que vous avez enfin accès à votre “public cloud”, il suffit de vous connecter sur le manager d’OVH.

Ensuite, dans l’onglet Cloud, dans la partie Serveurs, vous avez accès à votre serveur. Il faut créer un conteneur de stockage.

Pour cela, rien de plus simple, il suffit de cliquer sur créer un conteneur.

créer un conteneur

On vous demandera quel Datacenter, puis le type de conteneur, et enfin de le nommer.

création du conteneur

Vous pouvez choisir le datacenter que vous souhaitez, mais je vous conseille de réfléchir et de prendre le plus près de chez vous.

Pour ce qui est du type de conteneur, vu que l’on cherche juste à sauvegarder des données privées, un conteneur privé sera plus pertinent. Enfin, donnez le nom que vous souhaitez à votre conteneur.

De retour dans Stockage, votre conteneur doit apparaître.

On va ensuite créer un client OpenStack, qui va nous servir pour l’envoi des données dans le conteneur. Pour cela, on va dans Gestion Technique / Openstack Users.

Menu Openstack

Il suffit ensuite de faire Ajouter un utilisateur et de lui donner un nom.

Enfin, on va télécharger le fichier de configuration OpenStack, afin de récupérer les données utiles plus tard pour l’envoi des données. Pour cela, on clique sur les trois petits points à droite de l’utilisateur, puis sur Télécharger un fichier de configuration OpenStack.

Menu pour télécharger le fichier de configuration

Sélectionnez votre Datacenter, cochez la case et c’est parti, vous récupérez un fichier openrc.sh, dans lequel vous trouverez les infos utiles plus tard pour la connexion.

Téléchargement du fichier de configuration

Installation de duplicity

Pour installer duplicity sur notre Ubuntu (on en profite pour mettre les dépôts à jour au passage)

apt-get update
apt-get install duplicity

On utilise ensuite pip pour installer les modules requis par duplicity pour l’authentification Openstack (python-keystoneclient) et le stockage (python-swiftclient).

pip install python-swiftclient python-keystoneclient

Préparation du chiffrement

Pour cela, nous allons générer des clefs. J’ai choisi personnellement d’utiliser la même clef pour chiffrer et pour signer.

 gpg --full-gen-key

Et on se laisse guider pour la génération. Pour la taille des clefs, l’ANSSI donne les règles suivantes :

RègleFact-1 La taille minimale du module est de 2048 bits, pour une utilisation ne devant pas dépasser l’année 2030.

RègleFact-2 Pour une utilisation au-delà de 2030, la taille minimale du module est de 3072 bits.

En suivant les recommandations de la doc de ubuntu, on a choisi 4096 bits. On affiche ensuite les clefs avec la commande suivante :

gpg --list-keys

Ne pas hésiter à exporter ses clefs et les sauvegarder, car si demain, votre NAS flanche et que vos clefs sont uniquement dessus, vous ne pourrez pas récupérer vos sauvegardes sur le serveur de backup.

Le backup en lui-même

Nous avons maintenant tout ce qu’il nous faut pour le backup. Comme on dit, Y a plus qu’a.

Pour cela, on va faire un script qui va tout faire pour nous…

C’est pour cela qu’on a récupéré plus tôt le script openrc.sh, c’est parce qu’il contient des données qui vont nous être utiles.

Dans ce script, on récupère les variables suivantes :

SWIFT_USERNAME
SWIFT_PASSWORD
SWIFT_AUTHURL
SWIFT_AUTHVERSION
SWIFT_TENANTNAME
SWIFT_REGIONNAME

Il nous faudra ensuite les données suivantes :

On peut tout mettre ensemble dans un script pour faciliter l’utilisation :

#!/bin/bash
key=<key id>
src=<src dir>
dest=<dest>

# OpenStack
export SWIFT_USERNAME=<SWIFT_USERNAME>
export SWIFT_PASSWORD=<SWIFT_PASSWORD>
export SWIFT_AUTHURL=<SWIFT_AUTHURL>
export SWIFT_AUTHVERSION=<SWIFT_AUTHVERSION>
export SWIFT_TENANTNAME=<SWIFT_TENANTNAME>
export SWIFT_REGIONNAME=<SWIFT_REGIONNAME>

# GnuPG
export PASSPHRASE=<passphrase>

duplicity --full-if-older-than 1M     \
                --copy-links          \
                --encrypt-key "$key"  \
                --sign-key "$key"     \
                --num-retries 3       \
                --asynchronous-upload \
                --cf-backend swift    \
                --volsize 100         \
                "${src}" "${dest}"
duplicity remove-older-than 2M --force "${dest}"

unset \
    SWIFT_USERNAME    \
    SWIFT_PASSWORD    \
    SWIFT_AUTHURL     \
    SWIFT_AUTHVERSION \
    SWIFT_TENANTNAME  \
    SWIFT_REGIONNAME  \
    PASSPHRASE

Les options sélectionnées pour duplicity sont les suivantes:

La seconde ligne duplicity permet de supprimer les backups trop vieux (2 mois).

Récupération

Nous avons également fait un petit script afin de récupérer les données, en reprenant les mêmes informations. Seule modification, puisque on récupère, la variable src contient maintenant l’adresse du conteneur.

#!/bin/bash
key=<key id>
src=<src>
dest="/tmp" #répertoire où l'on va récupérer la sauvegarde
# OpenStack
export SWIFT_USERNAME=<SWIFT_USERNAME>
export SWIFT_PASSWORD=<SWIFT_PASSWORD>
export SWIFT_AUTHURL=<SWIFT_AUTHURL>
export SWIFT_AUTHVERSION=<SWIFT_AUTHVERSION>
export SWIFT_TENANTNAME=<SWIFT_TENANTNAME>
export SWIFT_REGIONNAME=<SWIFT_REGIONNAME>
duplicity --verbosity notice \
    --encrypt-key "$key"     \
    --sign-key "$key"        \
    --num-retries 3          \
    --cf-backend swift       \
    "$src" "$dest" 2> /dev/null

Pour plus de détails sur la récupération, c’est par là.

Automatisation

Maintenant que l’on a le lieu de stockage, l’outil et le script, on va tout automatiser pour que ça se fasse toutes les nuits.

Pour cela, rien de plus simple : crontab -e Et on ajoute une ligne correspondant au script à lancer. Ici, on lance le script toutes les nuits à minuit.

0 0 * * * <chemin du script>

Pour aller plus loin

Vu que pour le moment, on a quasi 80Go à sauvegarder, même si c’est de l’incrémental, on est bien contents d’avoir la fibre. Nous souhaitions aussi sauvegarder nos projets git, et nous le faisons en utilisant un miroir.