Eymoutiers, le 10 octobre 2024
Après plusieurs mois de développement, la version 2.0 de PostgreSQL Anonymizer est entrée en phase bêta et c’est l’occasion pour nous de lancer une série d’articles pour présenter ses nouvelles capacités en avant-première !
Pour ce premier aperçu technique, voyons comment générer des données factices (également appelées «données synthétiques»).
Pourquoi c’est important ?
PostgreSQL Anonymizer 2.0 propose une large gamme de fonctions pour générer des données factices mais réalistes. Ces fonctions sont utiles pour écrire des règles de masquage et remplacer des données sensibles par des données qui « ont l’air vraies ».
Mais ce n’est pas le seul intérêt de ces fonctions. En fait, on peut également les utiliser dès les premiers pas d’un nouveau projet : lors de la conception d’un modèle de données, il est essentiel de « peupler » les tables avec des données pour ne pas démarrer les développements « à vide ».
Considérons une nouvelle application qui doit s’appuyer sur une table customer
classique :
CREATE TABLE public.customer (
id INT PRIMARY KEY,
firstname TEXT,
lastname TEXT,
email TEXT
);
On voudrait insérer 2000 personnes dans cette table, mais comment faire puisque l’application n’existe pas encore ?
Pourquoi c’est compliqué ?
Évidement, insérer 2000 fois Jean Dupont
dans la table n’est pas vraiment
une option ! Toute la difficulté est donc de produire de données réalistes
et adaptées au contexte.
Par exemple, si l’application est destinée à des usagers adultes, on voudra que les dates de naissance soient comprises entre 1950 et 2006.
C’est ici qu’entre en jeu PostgreSQL Anonymizer avec son large panel de fonctions de randomisation et ses générateurs de données factices
INSERT INTO customer
SELECT
i*100+pg_catalog.random(0,99), -- avoid collisions !
anon.dummy_first_name(),
anon.dummy_last_name(),
anon.dummy_free_email()
FROM generate_series(1,2000) i;
NB : La fonction random(x,y)
est une des nouveautés de PostgreSQL 17 !
Pour les versions antérieures, la fonction anon.random_int_between(x,y)
est
une alternative équivalente.
Au total, PostgreSQL Anonymizer fournit plus de 70 fonctions de génération
de données factices ! Elles ont toutes le prefixe dummy_
. La liste complète
est disponible dans la section Advanced Faking de la documentation :
https://postgresql-anonymizer.readthedocs.io/en/latest/masking_functions/#advanced-faking
Ce qui nous donne :
SELECT * FROM customer LIMIT 2;
id | firstname | lastname | email
-----+-----------+----------+----------------------
143 | Eloisa | Beer | mavis_ab@hotmail.com
200 | Braden | Hagenes | ariel_nam@yahoo.com
Imaginons maintenant que l’application doit stocker des numéros de téléphone et
qu’elle est destinée au marché français. On peut alors utiliser la fonction
anon.dummy_phone_number()
:
SELECT anon.dummy_phone_number();
dummy_phone_number
-------------------
648-881-1114
Cela fonctionne, mais le format ne correspond pas à celui des numéros de téléphone français.
Pour obtenir des valeurs factices adaptées au contexte local, on peut simplement
ajouter le suffixe _locale
à la fin de la fonction et préciser que l’on
souhaite un numéro français :
ALTER TABLE customer ADD COLUMN phone TEXT;
UPDATE customer SET phone = anon.dummy_phone_number_locale('fr_FR');
Ce qui nous donne :
SELECT * FROM customer LIMIT 2;
id | firstname | lastname | email | phone
--------+-----------+----------+----------------------+----------------
115076 | Zelda | Robel | afton_eos@gmail.com | 05 38 16 52 85
123886 | Kamille | Ernser | kiera_ut@hotmail.com | 04 24 18 60 76
Au total et à ce jour, 7 locales sont disponibles partiellement ou intégralement : ar_SA, en_US, fr_FR, ja_JP, pt_BR, zh_CN, zh_TW.
On l’aura compris : générer des données factices de bonne qualité n’est pas une mince affaire ! Plutôt que de développer cette fonctionnalité ex-nihilo dans PostgreSQL Anonymizer, nous avons choisi de nous appuyer sur la librairie fake-rs qui supporte à la fois de nombreuses locales et un large éventail de catégories.
Le projet PostgreSQL Faker est désormais en fin de vie
Si vous avez déjà utilisé PostgreSQL Anonymizer, vous connaissez peut-être également l’existence de l’extension PostgreSQL Faker qui répondait auparavant à ce besoin de données factices. Pour différentes raisons, nous avons choisi de geler ce projet et d’intégrer cette fonctionnalité directement dans PostgreSQL Anonymizer.
Le projet PostgreSQL Faker est donc désormais déprécié et tous ses utilisateurs et utilisatrices sont encouragés à migrer progressivement vers PostgreSQL Anonymizer 2.0.
À vous de jouer !
Tous ces nouveaux générateurs de données factices sont encore en phase bêta ! N’hésitez pas à les tester et à partager vos commentaires et vos usages. Comment générez-vous les données factices pour remplir vos tables ? Est-ce que cette nouvelle fonctionnalité répond à votre besoin ? Etc…
Pour toute demande ou idée, ouvrez un ticket via le lien ci-dessous et parlons-en !
https://gitlab.com/dalibo/postgresql_anonymizer/-/issues
PS: Cet article a été rédigé sans l’assistance d’une intelligence artificielle.
- Dalibo (166) ,
- PostgreSQL (403) ,
- PostgreSQL Anonymizer (13) ,
- anonymisation (8) ,
- data masking (3) ,
- RGPD (7) ,
- Rust (3) ,
- extension (9) ,
- planetpgfr (12)