Eymoutiers, le 15 novembre 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 deuxième épisode, voyons comment exporter des données anonymisées avec l’outil pg_dump.

Photo Credit CotonBro

Logo PostgreSQL Anonymizer

Créer un pipeline d’anonymisation

PostgreSQL Anonymizer propose plusieurs approches d’anonymisation parmi lesquelles l’export anonymisé est probablement la plus populaire. Son principe est évident : exporter une base de données dans un fichier SQL en y appliquant directement les règles de masquage pour ensuite l’utiliser pour alimenter des environnements secondaires : instances de développement, de formations, de CI/CD, etc.

De cette manière, les données personnelles ne quittent jamais l’instance de production, ce qui réduit la surface d’attaque et limite les contraintes juridiques. En particulier, les personnes ayant accès à l’export anonymisé ne sont pas considérées comme des « opérateurs de traitement » aux yeux du RGPD, puisqu’elles n’ont pas accès aux données personnelles.

Utiliser les outils classiques de Postgres

Imaginons une base nommée foo. Pour exporter cette base, on va utiliser la commande pg_dump habituelle avec un utilisateur masqué que nous appelerons ici dump_anon :

CREATE ROLE dump_anon LOGIN PASSWORD 'CHANGE-ME-15794548';
ALTER ROLE dump_anon SET anon.transparent_dynamic_masking = TRUE;
SECURITY LABEL FOR anon ON ROLE dump_anon IS 'MASKED';

Cet utilisateur doit avoir accès en lecture seule aux données à exporter :

GRANT pg_read_all_data TO dump_anon;

Alternativement, si vous utilisez la version 13 de PostgreSQL ou si vous souhaitez définir une politique de sécurité plus fine, vous pouvez rédiger des règles plus précises :

GRANT USAGE ON SCHEMA public TO dump_anon;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO dump_anon;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO dump_anon;

GRANT USAGE ON SCHEMA bar TO dump_anon;
GRANT SELECT ON ALL TABLES IN SCHEMA bar TO dump_anon;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA bar TO dump_anon;

On peut maintenant lancer l’export avec pg_dump :

pg_dump foo [...] --user dump_anon --no-security-labels --file=foo_anonymized.sql

À vous d’adapter cette ligne de commande selon vos besoins et votre contexte ! La plupart des options de pg_dump sont supportées, notamment --format=custom.

Vous pouvez maintenant restaurer le fichier foo_anonymized.sql dans une instance secondaire.

Anonymiser un fichier SQL

Ce n’est pas tout, il est aussi possible d’anonymiser un fichier SQL grâce à l’image docker de PostgreSQL Anonymizer.

Pour cela on rédige les règles d’anonymisation dans un fichier rules.sql que l’on injecte dans l’image en même que le fichier dump.sql et l’on récupère en sortie l’export anonymisé.

IMG=registry.gitlab.com/dalibo/postgresql_anonymizer
ANON="docker run --rm -i $IMG /dump.sh"
cat dump.sql rules.sql | $ANON > anon_dump.sql

Cette méthode extrêmement simple est idéale pour anonymiser les données directement à l’intérieur d’une chaîne de traitement ou d’un pipeline de CI.

Bonus : Définir un ratio d’échantillonnage

Comme dit plus haut, les exports anonymisés sont utilisés pour alimenter des instances de tests ou de développement. Dans ces usages, il est souvent souhaitable de réduire la taille de l’export en ignorant une partie des données. C’est ce que l’on appelle l’échantillonnage : pour nourrir une instance de développement un export de 33% des données réelles est souvent largement suffisant.

Pour cela, on se base sur la syntaxe de la commande TABLESAMPLE :

SECURITY LABEL FOR anon ON TABLE public.customer IS 'TABLESAMPLE BERNOUILLI(33)';
SECURITY LABEL FOR anon ON TABLE public.product IS 'TABLESAMPLE BERNOUILLI(100)';
SECURITY LABEL FOR anon ON TABLE public.order IS 'TABLESAMPLE BERNOUILLI(20)';
--etc.

Cette fois la commande pg_dump retournera un sous-ensemble de la base originale. Attention toutefois, si certaines tables ont des contraintes d’intégrités référentielles, vous n’avez aucun garantie qu’elles seront respectées. Pour réaliser de l’échantillonage tout en respectant l’intégrité référentielle, l’outil pg_sample vous sera plus utile.

À vous de jouer !

En soi, l’export anonymisé n’est pas une nouvelle fonctionnalité de PostgreSQL Anonymizer. En version 1.x, nous proposions déjà un outil (nommé pg_dump_anon) pour cela. Mais grâce aux avancées techniques de la version 2.0, cet outil n’est plus nécessaire et si vous l’utilisez actuellement vous pouvez l’abandonner les yeux fermés au profit de pg_dump !

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

DALIBO est le spécialiste français de PostgreSQL®. Nous proposons du support, de la formation et du conseil depuis 2005.