Makina Blog
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.
Le DbToolsBundle est une librairie PHP qui permet notamment de mettre en place un processus d’anonymisation de données. S’agissant à l’heure actuelle d’un bundle Symfony, elle est par conséquent assez couplée au framework. Nous envisageons cependant qu’elle puisse être utilisée indépendamment à plus ou moins court terme.
Lorsque nous avons développé cet outil, l’un de nos objectifs était de mettre à disposition de l’écosystème Symfony une solution simple d’anonymisation pour favoriser les bonnes pratiques liées au RGPD. Pour que l’outil soit adopté, nous avons tenté de répondre aux trois problématiques suivantes :
- Configurer facilement une anonymisation de données
- Mettre en place un workflow simple pour récupérer des données de production anonymisées de manière sécurisée
- Rendre cette anonymisation rapide
Les deux premières problématiques ont déjà été évoquées sur ce blog dans l’article Découvrez le DbToolsBundle. Vous trouverez également des informations plus complètes directement dans la documentation du bundle (ici pour la configuration et ici pour le workflow).
Évoquons ensemble la troisième problématique.
Une application benchmark
Pour évaluer les capacités du DbToolsBundle à anonymiser rapidement des données, nous avons créé une petite application Symfony que vous pouvez retrouver sur GitHub.
Cette application définit 4 connexions pour 4 bases de données gérées par des SGBD différents : PostgreSQL, SQLite, MariaDB et MySQL.
Pour chacune de ces 4 bases de données, nous avons défini les 3 mêmes entités Doctrine :
Customer
- Une adresse e-mail
- Un mot de passe
- Un nom
- Un prénom
- Un entier représentant un âge
- Un numéro de téléphone
Address
- Une rue
- Un code postal
- Une ville
- Un pays
Order
- Un numéro de téléphone
- Une adresse e-mail
- Un montant
- Un message
Ces 3 entités essayent de mimer au mieux une vraie application : chacune d’entre elles définit plusieurs champs à anonymiser.
Ensuite, nous avons lancé la commande db-tools:anonymize avec des jeux de données plus ou moins conséquents.
Le tableau suivant présente les résultats :
Customers | Addresses | Orders | PostgreSQL | SQLite | MariaDB | MySQL |
---|---|---|---|---|---|---|
100 000
|
–
|
–
|
5s
|
7s
|
20s
|
53s
|
500 000
|
–
|
–
|
9s
|
10s
|
37s
|
3m 44s
|
1 000 000
|
–
|
–
|
16s
|
16s
|
1m 23s
|
36m 56s
|
–
|
200 000
|
–
|
6s
|
10s
|
26s
|
42s
|
–
|
–
|
1 000 000
|
16s
|
11s
|
1m 15s
|
25m 31s
|
100 000
|
200 000
|
–
|
7s
|
10s
|
32s
|
1m 16s
|
100 000
|
200 000
|
1 000 000
|
24s
|
25s
|
1m 40s
|
36m 47s
|
Note1 : Les valeurs données sont indicatives et varient légèrement à chaque lancement de la commande, on peut considérer une marge d’erreur de 10%.
Note2 : Ces tests ont été lancés sur une stack Docker qui utilise les images Docker officielles des différentes plateformes de base de données. Aucune configuration n’a été mise en place, c’est ce qui peut expliquer les mauvais résultats pour MySQL : l’image Docker de MySQL n’a pas de configuration particulière mise en place de base, contrairement à celle de MariaDB.
La dernière ligne est sans doute celle la plus représentative d’un cas que l’on pourrait rencontré. Les résultats sont très satisfaisants, on anonymise 3 tables dont une avec 1 million de lignes en 24 secondes avec PostgreSQL !
En regardant les 3 premières lignes, on voit qu’en multipliant le nombre de données à anonymiser par 10, on ne multiplie le temps d’anonymisation que par 3 (au moins pour PostgreSQL et SQLite). Ce résultat est en grande partie dû à la manière dont le DbToolsBundle anonymise les données.
SQL for the win
Avant de proposer le DbToolsBundle à la communauté, nous avons regardé quels étaient les outils PHP existants pour faire de l’anonymisation de données. Ceux que nous avons trouvé mettent tous en place la même approche par batch :
- Charger les données depuis la base
- Anonymiser les données à l’aide d’un script PHP
- Mettre à jour les données dans la base
Cette approche a un avantage, elle permet d’utiliser des librairies existantes comme Faker pour générer de fausses données. Mais elle a un gros inconvénient : elle est très, très, lente.
Avec le DbToolsBundle, nous avons choisi une autre approche : nous anonymisons directement à l’aide de requêtes SQL. Nous utilisons le moteur de base de données pour ce qu’il fait le mieux : traiter de grosses quantités de données.
Pour chaque table de base de données à anonymiser, la librairie génère une unique requête d’update. C’est ce qui explique que lors des tests évoqués dans la section précédente, nous n’observions pas de corrélation linéaire entre le nombre de lignes à anonymiser et le temps d’anonymisation. Pour un moteur de base de données, l’effort à fournir pour mettre à jour des données n’est pas directement proportionnel au nombre de données à modifier.
Ce n’est pas le cas lorsque l’on effectue ces actions par batch. Avec cette méthodologie, le temps d’anonymisation est directement proportionnel au nombre de lignes en base de données. Il n’y a rien à faire, c’est dû à la nature même de l’algorithme.
Il faut noter qu’un gros travail a également été fait pour optimiser ces requêtes d’update. Le DbToolsBundle supporte aujourd’hui 4 moteurs de base de données différents (PostgreSQL, SQLite, MySQL/MariaDB et SQL Server), les requêtes d’update générées par la librairie ont été travaillées de manière à être les plus efficaces possibles en fonction de la plateforme sur lesquelles elles vont être exécutées. Nous avons ainsi, entre la version bêta du DbToolsBundle et sa sortie, divisé par 50 les temps d’anonymisation.
Un article est en cours de rédaction pour vous présentez ces différentes optimisations pour chacun de ces 4 types de moteur de base de données.
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 avancé
Nantes Du 24 au 25 juin 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.
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 !