Backup chiffré avec duplicity sur HubiC

EDIT 24/02/2015 : ‘Il n’est plus nécessaire d’utiliser cloudfiles comme backend pour duplicity. À la place, il faut utiliser un backend spécial hubic intégré à duplicity récemment » voir le commentaire de blankoworld

EDIT 02/2015 : suppression du « DeprecationWarning » dans le log.

EDIT 17/02/2014 : suite à des changements sur Hubic.com, Gu1 à mis à jour python-cloudfiles-hubic. J’ai donc mis à jour mon script en conséquence

Hubic GUI avec duplicityMon ADSL est depuis peut chez OVH. De ce fait je bénéficie d’un compte hubiC avec un espace de stockage d’1To. Quelle aubaine pour des sauvegardes ! Mais bon donner mes mails, mes sites, mes documents administratifs à un tiers… bof bof. Il faudrait un minimum de chiffrage !

Et bien comme disait les autres nuls : « Hassan Cehef c’est possible » avec duplicity et python-cloudfiles-hubic !

python-cloudfiles-hubic est nécessaire car duplicity n’intègre pas nativement le service cloud « HubiC » pour une sombre histoire de protocole d’authentification non standard de la part d’OVH (détail par l’auteur)

Installation

On commence par le plus simple (duplicity) :

aptitude install duplicity

Maintenant python-cloudfiles-hubic :

aptitude install python-setuptools git
cd /usr/src
git clone https://github.com/Gu1/python-cloudfiles-hubic.git
cd python-cloudfiles-hubic
python setup.py  install

Utilisation

Dans vos paramètre sur hubic.com dans votre menu « Vos application » il va falloir ajouter une application :

  • Nom : cequevousvoulez
  • Domaine de redirection : http://localhost/

Quand l’application est créer récupérer le « client id » ainsi que le « client secret » dans l’interface

screenshot.62

Quelques petits tests pour la prise en main :

# Désactiver le bash_history (c'est pénible avec les mots de passes)
unset HISTFILE
# Les variables 
export CLOUDFILES_USERNAME=toto@toujours.lui
export CLOUDFILES_APIKEY=je.vais.pas.vous.donner.le.mot.de.passe.de.toto
# CLOUDFILES_AUTHURL="hubic|client id|client secret|http://localhost/"
export CLOUDFILES_AUTHURL="hubic|api_hubic_XXXX|YYYYY|http://localhost/"
# Sauvegarde
duplicity /root cf+http://default
# Observer l'état
duplicity collection-status cf+http://default
# Liste les fichiers distants 
duplicity list-current-files cf+http://default
# Test la restauration d'un fichier 
duplicity  --file-to-restore .bash_alias cf+http://default /tmp/bash_alias_recup

Rendez-vous ensuite dans votre interface hubiC. Et là normalement il y a plein de fichier duplicity-BLABLA-blabla.bla ! On supprime tout ! (c’était juste pour les tests)

Il ne semble pas possible d’écrire dans un sous répertoire. Mais, comme je l’ai signalé dans mon commentaire, il semble possible d’écrire dans un autre « container » sur hubiC (autre que default). Il ne sera visible qu’après modification de l’URL. Exemple si vous avez écrit dans le conteneur backup rendez vous sur l’URL : https://hubic.com/home/browser/#backup

Le script

Voici mon script :

#!/bin/bash

###################################
## Backup sur HubiC avec duplicity
# Script sous licence BEERWARE
# Version 0.4.1 02/2015
###################################

set -eu

##### Paramètres

# Utilisateur Hubic
HUBICUSER="leuserdevotrehubic"
# Mot de passe HubiC
HUBICPASSWORD="lemotdepassedevotrehubic"
# Application client id Hubic
HUBICAPPID="api_hubic_XXXXX"
# Application client secret Hubic
HUBICAPPSECRET="YYYYYY"
# Application domaine de redirection Hubic
HUBICAPPURLREDIRECT="http://localhost/"
# Liste à sauvegarder (voir le man duplicity avec le filelist)
DUPLICITYFILELIST="/etc/backup-`hostname`.filelist"
# Passphrase pour le chiffrement
PASSPHRASE="VotrePassPhraseDeOufQueYaQueVousEtVousSeulQuiSavez:-p"
# Fréquence des sauvegardes complètes
FULLIFOLDERTHAN="1W"
# Rétention des sauvegardes
RETENTION="2M"
# Log d'erreur
LOGERROR="/var/tmp/backup-hubic-error.log"
# Bin de duplicity
DUPLICITY_BIN="/usr/bin/duplicity"
# Email pour les erreurs (0 pour désactiver)
EMAIL="toto@mondomaine.com"
# Envoyer un rapport par email sur l'état des backup
RAPPORT=1
# Log d'erreur
exec 2> ${LOGERROR}

##### Début du script

function cleanup {
	echo "exit..."
	unset CLOUDFILES_USERNAME
	unset CLOUDFILES_APIKEY
	unset PASSPHRASE
        grep -v "has been deprecated" ${LOGERROR} > ${LOGERROR}.tmp
        mv ${LOGERROR}.tmp ${LOGERROR}
	if [ "`stat --format %s ${LOGERROR}`" != "0" ] && [ "$EMAIL" != "0" ] ; then
		cat ${LOGERROR} | mail -s "$0 - Error" ${EMAIL}
	fi
}
trap cleanup EXIT

# Gentil avec le système
ionice -c3 -p$$ &>/dev/null
renice -n 19 -p $$ &>/dev/null

if ! [ -f ${DUPLICITYFILELIST} ] ; then
	echo "Aucun fichier filelist : ${DUPLICITYFILELIST}"
	exit 1
fi

export CLOUDFILES_USERNAME=${HUBICUSER}
export CLOUDFILES_APIKEY=${HUBICPASSWORD}
export CLOUDFILES_AUTHURL="hubic|${HUBICAPPID}|${HUBICAPPSECRET}|${HUBICAPPURLREDIRECT}"
export PASSPHRASE

# Backup 
${DUPLICITY_BIN} --full-if-older-than ${FULLIFOLDERTHAN} / cf+http://default --include-globbing-filelist ${DUPLICITYFILELIST} --exclude '**'

# Suppression des vieux backups
${DUPLICITY_BIN} remove-older-than ${RETENTION} cf+http://default --force

# Rapport sur le backup
if [ "$RAPPORT" != "0" ] && [ "$EMAIL" != "0" ] ; then
        ${DUPLICITY_BIN} collection-status cf+http://default | mail -s "$0 - collection-status" ${EMAIL}
fi

unset CLOUDFILES_USERNAME
unset CLOUDFILES_APIKEY
unset PASSPHRASE

exit 0

A noter que mes bases de données sont dumpées à plat de façon indépendante du script de backup distant (par mysql_dump.sh)

Exemple de fichier filelist :

/etc
/var/backups/mysql
/var/chroot/bind9/etc/bind
/var/lib/mysql
/var/lib/awstats
/var/lib/mailman
/var/spool/cron
/var/vmail
- /var/www/mercereau.info/wp-content/cache/
- /var/www/default
/var/www
/home
- /root/.cpan
- /root/.cache
- /root/.npm
/root
/opt

Attention : les fichiers et répertoires à exclure doivent apparaître avant l’inclusion d’un répertoire parent. En effet, duplicity s’arrête à la première règle qui matche un chemin donné pour déterminer s’il doit l’inclure ou l’exclure. (sources)

Il n’y a plus qu’a le lancer en tâche cron :

44 4 * * *  /usr/local/bin/backup-to-hubic.sh

Ressources

19 réflexions au sujet de « Backup chiffré avec duplicity sur HubiC »

  1. Merci pour ce tuto!! backup depuis le petit kimsufi 2G, parfait!

    Ca manque juste un peu la possibilités des sous dossiers.. (pouvoir segmenter, www, docs perso, système, …)

    Quand est-ce qu’on te paye une bière ? :):):)

  2. Bonsoir,

    Une petite correction/note pour ce script:

    PASSPHRASE=’MonPassPhraseAMoi’

    ==> on met des ‘, car avec des  » j’ai eu quelques soucis (ma passphrase contenait des $ qui étaient interprétés….)

  3. Bon article, mais le problème du cloud, même avec un chiffrement, on donne à un tiers nos données, et si il les conserve, disons 20 ans, pas sûr que le chiffrement soit encore fiable 🙁

    Faudrait rajouter un peu de difficulté, scinder les données en deux avec un xor, et les envoyer sur deux services de cloud différents par exemple.

  4. OVH aurait-il changé certaines partie de l’infrastructure d’HubiC récemment (suite à leur changements d’offres/tarifs début février 2014) ?

    La commande `duplicity ./files cf+http://default` me retourne :

    Connection failed, please check your credentials: TypeError ‘NoneType’ object has no attribute ‘__getitem__’

    J’ai vérifié mes credentials et ait même retiré tout caractères « exotique » pour éviter tout problème dans le script :p

  5. Merci pour la réponse rapide : du coup mes tentatives avec https://github.com/Toorop/HubicSwiftGateway.git, https://github.com/Gu1/python-cloudfiles-hubic.git et https://github.com/guyou/python-cloudfiles-debian.git allaient rester vaines 🙂

    J’ai voulu tester le wrapper conseillé par @Gu1 mais je dois être malchanceux car la page d’ajout d’application sur hubiC (https://hubic.com/home/browser/developers/) semble HS pour le moment : j’ai pu saisir un nom et une URL pour une nouvelle application mais ensuite la page reste grisée avec une liste vide (erreur JS « Uncaught ReferenceError: valkey is not defined« ) 🙁

    On verra demain…

  6. Autre précision, la librairie python-cloudfiles a été déprécié par rackspace en faveur de pyrax. duplicity permet depuis la v0.6.23 d’utiliser pyrax.

    Plutôt que d’implémenter le support de l’auth hubic oauth dans python-cloudfiles, il faudrait le faire dans pyrax.

    Je compte m’en occuper, dès que j’aurais le temps…

    1. Super Gu1 !

      Merci pour toutes ces précisions ! Je n’aurais pas les compétences de t’aider mais n’hésite pas à nous tenir informé si tu avance sur le sujet !

      David

  7. Merci pour les pécisions Gu1.

    La page des applications répondant à nouveau, j’ai pu tester le wrapper pour Swift qui gère l’authentification via l’API que tu as conseillé (https://github.com/puzzle1536/hubic-wrapper-to-swift) : ça fonctionne bien, j’ai accès à mes données hubiC avec le client `swift`.

    En revanche, je ne vois pas comment utiliser ce proxy avec duplicity pour faire mes backup.

    La librairie pyrax est une très bonne chose : devrait uniformiser (et simplifier) le tout (bon, par contre Duplicity 0.6.23 n’est même pas dans Debian Jessie :-/).

  8. J’ai mis à jour mon fork de python-cloudfiles avec le support de l’API OAuth: https://github.com/Gu1/python-cloudfiles-hubic
    J’ai pas encore eu l’occasion de le tester avec duplicity, mais à priori, ça s’utilise pareil qu’avant.
    La seule différence c’est qu’anciennement il fallait mettre juste « hubic » dans l’AUTHURL et maintenant il faut aussi fournir le client_id, client_secret et redirect_url après:
    export CLOUDFILES_AUTHURL='hubic|YOUR_CLIENT_ID|YOUR_CLIENT_SECRET|YOUR_REDIRECT_URL'
    Si des gens se sentent de tester…
    Le code d’auth HubiC pour pyrax est lui aussi quasi prêt, mais il faudrait un changement dans la librairie pyrax elle même pour que je puisse le distribuer:
    https://github.com/rackspace/pyrax/pull/292

    1. Bonjour gnutux,

      Aucune idée !
      Seulement si tu as accès a tes données « en claire » c’est qu’ils doivent avoir la clef de déchiffrement… Donc je préfère re-crypter et posséder la clef de chiffrement !

      David

  9. Bonjour,

    Tout d’abord un grand merci pour votre script qui vient répondre à un réel besoin. J’ai mis la bière au frais.

    J’ai suivi vos instructions mais depuis que je me suis risqué à installer la librairie pyrax avec la commande « pip install git+git://github.com/rackspace/pyrax.git », j’ai l’erreur suivante : « Connection failed, please check your credentials: AuthenticationFailed Incorrect/unauthorized credentials received ».

    La commande duplicity ./files cf+http://default me retourne : « BackendException: CLOUDFILES_USERNAME environment variablenot set. »

    Je suis sous Ubuntu 12.04.3 et je crois que j’ai voulu bidouillé au dessus de mes (très maigres) compétences… mais enfin s’amuser avec son nunux n’est pas un des moindre plaisirs de l’existence.

    PS : très sympa votre lampe d’ambiance.

     

    Jean-Yves

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.