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
.
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 (167) ,
- PostgreSQL (406) ,
- PostgreSQL Anonymizer (13) ,
- anonymisation (8) ,
- data masking (3) ,
- RGPD (7) ,
- Rust (3) ,
- extension (9) ,
- planetpgfr (14)