Database
Anonymisation des données (Microsoft Presidio)
Anonymisation de la base de données
L’objectif est d’anonymiser les données issues de l’environnement de production avant toute utilisation en environnement non‑prod (développement, test, démo). Nous prévoyons d’utiliser Microsoft Presidio pour détecter et masquer les PII (Personally Identifiable Information) et données sensibles.
Pourquoi anonymiser ?
- Conformité (RGPD) et principe du moindre privilège.
- Réduire le risque en cas de fuite sur des environnements non sécurisés comme la prod.
- Permettre des tests réalistes sans exposer de vraies identités.
Approche retenue
- Microsoft Presidio pour la détection (Analyzer) et l’anonymisation (Anonymizer) des PII.
- Cibles principales (à adapter selon le schéma) :
- Noms, adresses e‑mail, numéros de téléphone.
- Adresses postales, dates de naissance.
- Identifiants internes et références métiers sensibles (via recognizers personnalisés).
- Langue: configuration avec modèles FR (ex: spaCy
fr_core_news_md) + règles/custom recognizers.
Architecture d’intégration
- Déploiement recommandé de Presidio via ses services Docker (REST) :
presidio-analyzerpresidio-anonymizer
- Le serveur (
apps/server) ou un job ETL appelle ces services pour traiter des dumps ou flux texte. - Variables d’environnement proposées : Les URLs dépendent de votre compose/K8s; adaptez les noms de service et ports.
PRESIDIO_ANALYZER_URL=http://presidio-analyzer:<analyzer-port>
PRESIDIO_ANONYMIZER_URL=http://presidio-anonymizer:<anonymizer-port>Exemple (appel REST en TypeScript)
// Exemple simplifié: masquer email et téléphone dans un texte libre
// À intégrer côté job d’export/anonymisation
const analyzerUrl = process.env.PRESIDIO_ANALYZER_URL!;
const anonymizerUrl = process.env.PRESIDIO_ANONYMIZER_URL!;
async function anonymizeText(text: string) {
const analyzeRes = await fetch(`${analyzerUrl}/analyze`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text,
language: "fr",
entities: ["EMAIL_ADDRESS", "PHONE_NUMBER", "PERSON", "LOCATION"],
}),
});
const results = await analyzeRes.json();
const anonymizeRes = await fetch(`${anonymizerUrl}/anonymize`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text,
anonymizers: {
DEFAULT: { type: "mask", maskingChar: "*", charsToMask: 100 },
EMAIL_ADDRESS: { type: "replace", newValue: "[EMAIL]" },
PHONE_NUMBER: { type: "replace", newValue: "[PHONE]" },
},
analyzeResults: results,
}),
});
const { text: anonymized } = await anonymizeRes.json();
return anonymized;
}Modes d’usage
- Batch sur dump SQL/CSV: pipeline ETL qui lit chaque champ/ligne, applique Presidio, réécrit un dump anonymisé importable.
- Endpoints d’export: anonymiser à la volée les exports destinés aux environnements non‑prod.
- Colonnes structurées: appliquer masquage/pseudonymisation déterministe (hash salé) pour préserver la jointure sans révéler la donnée brute.
Politique d’anonymisation (exemple)
- Non réversible (masquage/remplacement) pour noms, e‑mails, téléphone, adresses postales.
- Pseudonymisation déterministe (hash salé) pour identifiants utiles aux corrélations inter‑tables.
- Reconnaissance étendue via recognizers custom pour termes métiers (ex: numéros de dossier).
- Journalisation: tracer le job, la date, la version de la politique appliquée.
Qualité et tests
- Échantillons de validation avec métriques Presidio (rappel/précision sur PII cibles).
- Revue manuelle ponctuelle sur données déjà anonymisées.
- Surveiller le drift (nouveaux formats/PII) et mettre à jour les recognizers.
Limitations et points d’attention
- Le texte libre reste difficile: ajuster modèles FR et règles.
- Risques de faux positifs/négatifs: prévoir des revues et itérations.
- Les champs déjà chiffrés ne sont pas traitables sans déchiffrement contrôlé.
Prochaines étapes
- Ajouter un
docker-composepour Presidio (Analyzer/Anonymizer) dans l’outillage d’ops. - Créer un job d’anonymisation (script/worker) côté
apps/serverou pipeline externe. - Définir la politique par table/colonne et les recognizers personnalisés.
- Intégrer des tests automatiques et un run obligatoire avant tout import en non‑prod.
Kalli