Programmation

Comment générer automatiquement des dumps MySQL chiffrés ?

2 minutes de lecture

Tout le monde sait que les sauvegardes sont importantes, qu’il s’agisse d’une panne de système ou simplement de vouloir revenir à un état antérieur suite à une erreur.
Souvent, les sauvegardes sont effectuées par des tâches Cron. Dans la plupart des cas, cependant, un simple dump MySQL est généré sans que le contenu ne soit chiffré.
Dans cet article, je décris comment créer des sauvegardes à l’aide de GPG sans utiliser de mot de passe fixe. Comme il peut y avoir plusieurs administrateurs de base de données capables de restaurer les sauvegardes, chaque administrateur autorisé doit pouvoir restaurer la sauvegarde avec sa propre phrase secrète.

#!/bin/bash

BACKUP_DIR=/var/backup/auto/mysql
DATE=$(date -I)
TARGET_DIR=$BACKUP_DIR/$DATE
mkdir -p $TARGET_DIR

DATABASES=$(mysql -uadmin -B -s -e »show databases; »)

for db in $DATABASES; do
TARGET=$TARGET_DIR/$db.sql.gz.gpg
echo -n dumping $db to $TARGET …
mysqldump -uadmin $db | gzip | gpg -rCAFEBABE -rAFFE4711 -rAFFEFACE -e – > $TARGET
if [ $PIPESTATUS -eq 0 ]; then echo OK; else echo ERROR; fi
done

La variable BACKUP_DIR indique l’endroit où les sauvegardes doivent être stockées. Un répertoire avec la date au format AAAA-MM-JJ (date -I) est créé en dessous, dans lequel les dumps des différentes bases de données sont déposés. Si tu souhaites générer plus d’une sauvegarde par jour, tu peux adapter cette commande.

Exemple de sortie :

…
dumping mysql to /var/backup/auto/mysql/2012-04-06/mysql.sql.gz.gpg …OK
dumping test to /var/backup/auto/mysql/2012-04-06/test.sql.gz.gpg …OK
…

Ce qu’il faut adapter dans ce script, ce sont les clés/ID des destinataires, c’est-à-dire les personnes autorisées à déchiffrer les données ultérieurement. Dans cet exemple, trois destinataires sont indiqués :

gpg -rCAFEBABE -rAFFE4711 -rAFFEFACE

Chaque destinataire a la possibilité de déchiffrer les fichiers de sauvegarde. GPG détermine automatiquement la clé pour le « déchiffreur » :

gpg -d mysql/2012-04-06/test.sql.gz.gpg | gunzip | head -n 5

You need a passphrase to unlock the secret key for
user: « XZY »
2048-bit ELG-E key, ID AFFEFACE, created…
Enter passphrase:

gpg: encrypted with 2048-bit RSA key, ID CAFEBABE…
gpg: encrypted with 2048-bit ELG-E key, ID AFFE4711…
gpg: encrypted with 2048-bit ELG-E key, ID AFFEFACE…

La sortie réelle apparaît alors dans STDOUT :

-- MySQL dump 10.13 Distrib 5.1.56, for redhat-linux-gnu (x86_64)
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.1.56

Si tu n’as pas encore beaucoup manipulé GnuPG et l’interface en ligne de commande MySQL, tu devrais tenir compte des points suivants avant d’exécuter l’exemple :
– Les clés de tous les destinataires doivent être signées/approuvées au préalable afin que le script de sauvegarde ne passe pas en mode interactif.
– Le mot de passe pour l’accès à la base de données est défini par défaut dans le fichier ~/.my.cnf dans la section [client].

Bonne chance pour les tests et l’intégration.
C.