Mettre en place une solution de création de backups simple.


Le jour du drame.

Il y a quelques mois (en février) le disque dur de mon PC m’avait lâché. Par chance, j’avais installé FreeBSD quelques jours auparavant. J’avais donc créé des backups de mes données, et heureusement pour moi parce que ce n’est pas ce que je fais le plus souvent en fait…

Eh oui, on n’y croit jamais au début. Avant la catastrophe, on se dit que ça n’arrive qu’aux autres (à moins bien sûr qu’on tourne sous Vista), toussa… Mais non, non. La perte de données touche statistiquement au moins une fois tout le monde :p Pour prendre le minimum de risque, il est ainsi conseillé de faire de la redondance : copier nos fichiers à plusieurs endroits pour éviter les problèmes le jour où un support casse.

Les solutions disponibles.

La plupart des  utilisateurs font ça à la main. C’est-à-dire qu’ils prennent soin de copier les choses importantes manuellement sur clef USB, CD, etc. C’est une méthode que je trouve fastidieuse, et qui donc est faillible. En effet, la personne qui passe plus de temps à faire des backups qu’à justement réaliser les fichiers qu’il sauvegarde n’en fera pas beaucoup…

Plusieurs solutions automatiques existent, comme la mise en place de disques durs en RAID 1 matériel, l’utilisation de logiciels permettant de copier le contenu d’un ordinateur sur un autre comme Bacula ou si l’on est un gros taré, l’utilisation de systèmes de fichiers réseaux comme GlusterFS ou Moose qui supportent la redondance sur des centaines de serveurs différents. Le problème avec ses façons de faire, c’est qu’elles ont toutes un coût : l’achat d’un disque dur supplémentaire pour la première astuce, achats d’ordinateurs supplémentaires pour les seconds. De plus, la sécurité au final n’est peut être pas tellement avérée que ça. Effectivement, en RAID 1, si l’un de vos disques flanche, les données seront encore disponibles. Par contre si votre maison crame, je pense que les deux seront grillés, donc la solution est vaine. La bonne manœuvre serait peut être d’utiliser Dragula ou un système de fichier réseaux pour faire une sauvegarde sur un serveur dédié bien planqué dans un datacenter loin de tout ça, mais encore une fois le problème du coût s’impose.

Et le cloud alors ?

L’idée serait de trouver quelque chose permettant d’avoir un coût nul (on oublie donc l’achat de matériel), et en même temps de protection efficace des données (ne pas mettre la sauvegarde au même endroit que l’original). J’ai vite pensé au cloud, et notamment à Dropbox comme support. En effet, la société à tout ce qu’il faut pour effectuer en son sein une politique de redondance correcte, pourquoi donc ne pas l’utiliser ?

Évidemment, ce qui est publié là dessus ne nous appartient pas. Pour éviter les fuites malencontreuses, on aura à à s’assurer de bien chiffrer les données avant de les uploader sur le service ! C’est vrai, la solution est discutable : mettre ses infos « perso » sur quelque chose d’aussi foireux que Dropbox, même chiffré, ce n’est pas super… De plus, rien ne nous dit que Dropbox ne fermera pas notre compte du jour au lendemain. C’est des risques à prendre en considération dans le choix de notre méthode. Pour moi, celle-ci est adéquate : ce que je sauvegarde n’est en général rien de critique ni vital. Si je perds ces données, je survivrai, si elles sont publiées au grand jour, aussi.

Mettre en place la solution.

Je ne pense pas qu’il soit nécessaire de protéger les dizaines de To de films et musiques téléchargés, mais plus les archives de conversations, documents réalisés, ou toute autre chose pas retrouvable sur Internet. De plus, l’espace de stockage sur Dropbox est limité.

Partant de ce principe, j’ai décidé d’uniquement effectuer une sauvegarde d’un seul dossier sur mon ordinateur contenant les liens symboliques de tout ce qui doit l’être. De cette façon, je peux aisément contrôler si je n’ai rien oublié, et ça ne me met pas le bordel partout.

J’ai ainsi réalisé un script Python qui procède comme suit :

  • Création d’une archive en .tar.gz2 du dossier à sauvegarder.
  • Chiffrement de l’archive.
  • Copie de l’archive chiffrée sur le dossier correspondant à mon dépôt Dropbox.
  • On ne garde que les cinq derniers backups et supprimons les plus anciens pour ne pas saturer Dropbox.
  • On allume Dropbox pour synchroniser le dossier.

 

#!/usr/bin/python2

import tarfile  #Utilisé pour la création de l'archive.
import os       #Utilisé pour le lancement de Dropbox.
import time     #Utilisé pour savoir quel jour on est.
import gnupg    #Utilisé pour chiffrer l'archive.
import shutil   #Utilisé pour déplacer des fichiers.
import sys      #Utilisé pour pouvoir auto-killer le script.
import syslog   #Utilisé pour la gestion des logs avec Syslog.

#J'utilise syslog pour la gestion des logs. Je ne parle pas de ça dans cet article.
syslog.openlog('Backup Dropbox', 0, syslog.LOG_LOCAL0)

gpg_location = '/home/spydemon/.gnupg'                  #Chemin du répertoire contenant les clefs GPG.
gpg_name = '57A4E4DA37D1E36C8B39565E6A19667F2AD97121'   #Nom de la clef à utiliser
folder_to_save = '/opt/saved'                           #Dossier à sauvegarder
folder_dropbox = '/opt/dropbox/Dropbox/backups'	        #Dépôt Dropbox

#Nous créons le nom de l'archive (la date actuelle).
name_root = '' + time.strftime("%y%m%d")
#Puis on intègre le nom dans les chemins et extensions des archives à créer (chiffrée et claire)
name_clear_archive = ''.join(['/tmp/', name_root, '.tar.bz2'])
name_crypted_archive = ''.join(['/tmp/', name_root, '.bin'])

#Création de l'archive avec tout le contenu du fichier à chiffrer.
archive = tarfile.open(name_clear_archive, 'w:bz2')
archive.add(folder_to_save)
archive.close()

#On vérifie l'archive, écris les logs et quittons le script si l'archive n'est pas bonne.
if tarfile.is_tarfile(name_clear_archive):
	syslog.syslog(syslog.LOG_DEBUG, "Archive correcty created.")
else:
	syslog.syslog(syslog.LOG_ERR, "Creation of the archive failed.")
	sys.exit()

#On utilise GPG pour chiffrer l'archive.
gpg = gnupg.GPG(gnupghome=gpg_location)
archive = open(name_clear_archive, 'rb')
gpg.encrypt_file(archive, gpg_name, output=name_crypted_archive)
archive.close()

#On bouge l'archive chiffrée dans le dossier correspondant au dépôt Dropbox.
try:
	shutil.move(name_crypted_archive, folder_dropbox)
except:
	syslog.syslog(syslog.LOG_ERR, "A mistake occurs when we move the archive.")

#On supprime l'archive claire.
os.remove(name_clear_archive)
syslog.syslog(syslog.LOG_DEBUG, "Archive crypted moved, and archive clear deleted.")

#Nous ne conservons que les cinq backups les plus jeunes.
list_elements = []
values = os.walk(folder_dropbox)                                #Obtention de tout les fichiers du répertoire.
for value in values:
	for element in value[2]:
		list_elements.append(element.split('.')[0])     #On ne conserve que la partie du nom du fichier qui contient la date du backup.

list_elements.sort()            #On trie toutes les dates de façon à ce que les plus anciennes soient en premier.
list_elements.reverse()         #On inverse l'ordre pour avoir les plus récentes en premier.

#Suppressions des anciens backups si il y en a plus de 5.
i = 0
for element in list_elements:
	if i > 4:
		os.remove(''.join([folder_dropbox, '/', element, '.bin']))
		syslog.syslog(syslog.LOG_DEBUG, ''.join(["Removing of the element : ", element, ".bin"]))
	i += 1

#On vérifie si Dropbox tourne déjà sur le PC.
dropbox_running = False
for line in os.popen('ps -A'):
	if line.count('dropbox') == 1:
		dropbox_running = True

#Si Dropbox ne tourne pas, on le lance.
if dropbox_running == False:
	syslog.syslog(syslog.LOG_DEBUG, "Dropbox is not running. So we run it.")
	os.system('dropboxd start')
else:
	syslog.syslog(syslog.LOG_DEBUG, "Dropbox already running. So nothing to do.")

syslog.syslog(syslog.LOG_INFO, ''.join(['Update of ', name_root, ' done.']))

Pour effectuer la mise à jour automatique, il suffit de créer une règle crontab à la fréquence désirée. Pour ma part, j’ai choisi de la faire quotidiennement à 23h, voici donc la règle que j’ai écrite :

% crontab -l
00 23 * * * /opt/backup-folder.py

Si un jour un problème survient, je n’aurai qu’à me connecter sur mon compte Dropbox depuis un autre ordinateur, de récupérer mon fichier chiffré, et de le déchiffrer à l’aide de gpg. Ahh en parlant de ça, conservez bien votre clef privée AILLEURS que dans le backup, car la clef chiffrée ne vous aidera pas à déchiffrée quoi que ce soit 😀

C’en est tout pour l’astuce du jour ! J’espère que ce script vous sera utile, et vous évitera quelques cataclysmes 😉


Crédit images :


Une réponse à “Mettre en place une solution de création de backups simple.”