Makina Blog
DbToolsBundle : l'outil Symfony pour anonymiser vos bases de données
L'équipe PHP est fière de vous présenter son nouveau bundle à destination des développeurs Symfony : sauvegardez, restaurez et anonymisez simplement vos bases de données !
Introduction
Le DbToolsBundle n'a qu'un seul objectif : simplifier la vie des développeurs Symfony quand ils utilisent une base de données.
Pour vous faire une idée des possibilités offertes par le DbToolsBundle, la suite de cet article décrit trois cas d'utilisations classiques. Mais avant de rentrer dans le vif du sujet, la section suivante présente l'historique du bundle Symfony.
Historique du DbToolsBundle
Depuis plusieurs années sur nos différents projets, nous réutilisons un ensemble de commandes Symfony pour réaliser certaines opérations sur nos bases de données :
- Sauvegarder et restaurer une base de données
- Anonymiser des données provenant d'un environnement de production
- Avoir quelques statistiques sur la base de données
Aujourd'hui, ces commandes ont été largement éprouvées, nous avons donc décidé de les rassembler dans un bundle et d'en faire profiter à toute la communauté Symfony.
La création de ce bundle a aussi été l'occasion :
- D'industrialiser la partie anonymisation de données
- De faire une jolie documentation [en] que l'on a essayé de rendre la plus complète possible
- De unit-tester l'ensemble du bundle
- De rendre compatible le bundle avec d'autres SGBDR, le bundle étant à l'origine dédié à PostgreSQL
Utilisation 1 - Sauvegarder et restaurer sa base de données lors d'un déploiement
Dans la vie d'un projet, nous sommes souvent amenés à déployer des nouvelles versions sur différents environnements. Une migration, même en ayant pris toutes les précautions possibles, ça peut… rater. C'est pourquoi en général, on sauvegarde de la base de données avant de lancer la mise à jour.
Avec le DbToolsBundle, faire une sauvegarde est aussi simple que de lancer la commande suivante :
console db-tools:backup
Le DbToolsBundle va alors aller chercher le bon programme de sauvegarde - pg_dump, mysqldump, etc. - en fonction de votre base de données, et l'utiliser avec les bons paramètres. La sauvegarde est placée dans un répertoire configurable du disque dur.
Cette commande propose également de nettoyer du disque, les sauvegardes existantes considérées comme obsolètes.
Maintenant, imaginons que votre migration n'était finalement pas si robuste et qu'un problème est apparu au moment de la lancer. Vous ne comprenez pas immédiatement le problème : le plus sage est sans doute de revenir à la version précédente pour le moment.
Pour restaurer votre base de données, lancez :
console db-tools:restore
Cette commande va lister les sauvegardes présentes sur le disque dur et vous demander laquelle vous souhaitez restaurer. Comme pour la commande de sauvegarde, le DbToolsBundle va utiliser le bon programme en fonction de votre base de données.
Pour en savoir plus sur les configurations possibles de ces deux commandes et les différentes options qu'elles proposent, rendez-vous sur la section dédiée de la documentation [en].
Utilisation 2 - Anonymiser des données de production pour les utiliser sur un environnement local
Partons du scénario suivant :
Vous avez besoin de récupérer chez vous des données de production, mais vous ne souhaitez pas vous retrouver avec des données sensibles sur votre environnement local.
Après avoir lancer la commande db-tools:backup sur votre environnement de production, vous venez de télécharger le fichier de sauvegarde sur votre ordinateur. Vous utilisez alors la commande db-tools:restore pour injecter ces données dans votre base de données locale.
Mais en faisant ça, vous injectez aussi des données sensibles, et ça, vous ne le souhaitez pas. Premièrement, parce que c'est sans doute illégal, tout au moins en Europe avec le RGPD. Deuxièmement, parce que vous ne voulez pas avoir les données personnelles des utilisateurs de votre site ou des utilisateurs de votre client chez vous !
Pour éviter ça, vous avez besoin d'un processus d'anonymisation.
Ça peut être assez compliqué et très consommateur en temps de réaliser une anonymisation complète et efficace. Le DbToolsBundle se propose de le faire à votre place.
Paramétrer une anonymisation devient aussi simple que d'ajouter quelques attributs PHP8 sur vos entités Doctrine.
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use MakinaCorpus\DbToolsBundle\Attribute\Anonymize;
#[ORM\Entity()]
#[ORM\Table(name: 'customer')]
class Customer
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 180, unique: true)]
#[Anonymize(type: 'email')] // <== C'est par ici la magie !
private ?string $emailAddress = null;
// ...
}
Avec la configuration ci-dessus, en lançant la commande db-tool:anonymize sur un fichier de sauvegarde, toutes les adresses e-mails de vos utilisateurs seront anonymisées. À la sortie, chaque adresse e-mail aura la forme "[hash de l'adresse d'origine]@example.com".
Ici l'exemple est très basique, pour en apprendre plus sur les possibilités d'anonymisation avec le DbToolsBundle, référez-vous à la section dédiée de la documentation [en].
Selon les recommandations du RGPD, vous ne pouvez pas lancer l'anonymisation sur votre environnement local : votre fichier de sauvegarde contient des données sensibles et ces données sensibles ne devraient jamais transiter par un environnement non-sécurisé.
À la place, nous pouvons par exemple utiliser l'environnement de préproduction pour effectuer cette tâche :
console db-tools:anonymize /chemin/vers/mon-backup.sql
À la sortie de cette commande, le fichier mon-backup.sql sera anonymisé. Vous pouvez maintenant le télécharger sur votre machine et l'importer sur votre environnement local avec la commande db-tools:restore et l'option --filename pour spécifier le fichier à restaurer.
Pour avoir une vue d'ensemble sur le fonctionnement de cette commande et sur comment mettre un place un workflow d'anonymisation RGPD-compatible, référez-vous à la section dédiée de la documentation [en].
Utilisation 3 - Avoir des statistiques sur sa base de données lorsqu'on n'a pas de vrai monitoring
Sur des petits projets, nous n'avons pas toujours le budget pour avoir un vrai outil de monitoring pour la base de données. Bien souvent, pour aller voir ce qu'il se passe, nous n'avons qu'un accès CLI via une connexion SSH.
Dans ce cas, en général pour avoir des statistiques sur la base, nous nous retrouvons à copier/coller de grosses requêtes SQL dans un prompt de shell. C'est fastidieux et la sortie n'est pas toujours facile à lire.
Si le contenu du paragraphe précédent vous est familier, essayez de lancer :
console db-tools:stats
Cette commande vous retourne un beau tableau rempli de statistiques sur votre base de données. Et honnêtement, rien que cette commande pourrait justifier l'installation sur votre projet du DbToolsBundle !
Des options sont disponibles pour obtenir différentes statistiques, plus d'informations dans la section dédiée de la documentation [en].
Un bundle Symfony communautaire
Pour finir cette présentation, nous voulions insister sur le fait que nous souhaitons que le DbToolsBundle soit un outil communautaire.
Vous pouvez contribuer au bundle [en] en lui-même mais il est également possible de contribuer en créant et distribuant des packs d'anonymiseurs [en].
Si vous avez lu la partie sur l'anonymisation de la documentation du bundle [en], vous avez pu constater que le bundle fournit un certain nombre de ces anonymiseurs. Mais ceux-ci ne peuvent pas couvrir tous les cas d'usage.
Plutôt que de faire grossir le bundle en y ajoutant tous les anonymiseurs possibles et imaginables, nous avons choisi d'avoir une approche plus modulaire et de donner la possibilité à chacun de fournir à la communauté sa propre collection : des packs d'anonymiseurs.
Certains de ces packs sont considérés comme "officiels" [en], cette liste ne demande qu'à grossir !
La vidéo de Yoan Bernabeu parle du DBToolsBundle (à la 12 min 19s)
Visionnez la vidéo 4 méthodes/outils pour backup vos bases de données (#Postgres). Développé pour la communauté par notre équipe #PHP, le DbToolsBundle vous permet de sauvegarder, restaurer et anonymiser vos données !
En savoir plus sur le DbToolsBundle
En tout cas, nous avons hâte de connaître les retours de développeurs Symfony sur notre travail, les issues sont bien sûr ouvertes sur le dépôt GitHub du projet, alors n'attendez plus :
composer require makinacorpus/db-tools-bundle
Pour plus d'information sur le DbToosBundle, retrouvez directement :
- Son code source sur GitHub
- Sa documentation complète sur ReadTheDocs
- Son paquet composer sur Packagist
Formations associées
Formations Outils et bases de données
Formation PostgreSQL
Nantes Du 11 au 13 décembre 2024
Voir la formationFormations Outils et bases de données
Formation Git, gestionnaire de versions
Nantes Du 25 au 26 février 2025
Voir la formationActualités en lien
DbToolsBundle : sortie de la version 1.2
Découvrez les nouveautés de cette nouvelle version ainsi que les fonctionnalités à venir de la prochaine version majeure.
Access Control, bibliothèque PHP pour gérer des droits d’accès
Suite à un projet de gestion métier opérationnel dont la durée de vie et la maintenance sont à long termes, nous avons expérimenté un passage de celui-ci sur l’architecture hexagonale et la clean architecture.
L’anonymisation sous stéroïdes avec le DBToolsBundle
Le DbToolsBundle permet d’anonymiser des tables d’un million de lignes en seulement quelques secondes. Cet article vous présente la méthodologie mise en place pour arriver à ce résultat.