>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
Python

Come mascherare automaticamente dati del passaporto e numeri di carta dai log

Recentemente stavamo indagando su un incidente in produzione in cui un servizio andato in crash ha scaricato un JSON completo con il body della richiesta dell'utente in ELK. Conteneva un numero di carta di credito, un indirizzo di casa e un numero di telefono. Registrare tutto per scopi di debug è una pratica comune, ma quando questi dump finiscono in storage, i team di sicurezza fanno domande molto scomode. Scrivere pattern regex per ogni piccola cosa diventa tedioso in fretta. Si rompono su formati complessi, perdono nomi e confondono sequenze casuali di numeri con identificatori reali.

Ci sono diversi modi per risolvere questo problema. Uno degli strumenti open-source più maturi disponibili è Presidio, sviluppato dalla community sotto l'organizzazione data-privacy-stack.

Cosa c'è sotto il cofano e perché ne hai bisogno

Presidio aiuta a trovare e mascherare le informazioni di identificazione personale (PII) in testi, fogli di calcolo e persino immagini. Il progetto è stato originariamente creato da ingegneri Microsoft come libreria open, e da allora è passato a un'organizzazione separata, raccogliendo oltre 10.000 stelle su GitHub.

L'idea centrale qui è semplice: dividere il task di protezione della privacy in due passaggi indipendenti — analisi e anonimizzazione.

invece di uno script monolitico, ottieni due moduli separati:

  1. Analyzer — esamina il testo in entrata, trova entità come numeri di passaporto, numeri di telefono, indirizzi email o nomi, e restituisce le coordinate dei risultati insieme a un punteggio di confidenza.
  2. Anonymizer — prende il markup dell'analyzer e applica le regole di trasformazione: sostituisce con placeholder, cripta, maschera con asterischi, o semplicemente rimuove.

Questa separazione è comoda quando devi registrare solo il fatto del rilevamento dei dati senza modificare il testo stesso, o quando vuoi configurare flessibilmente il metodo di mascheramento per diversi tipi di campo.

Come funziona il rilevamento delle entità

Se hai provato a parsare il testo con le espressioni regolari da sole, conosci il loro principale svantaggio: le regex non capiscono il contesto. Troveranno una sequenza di 16 cifre, ma non sapranno se è un numero di carta o uno SKU di un prodotto in magazzino.

Presidio combina più approcci contemporaneamente:

  • Espressioni regolari e checksum (ad esempio, l'algoritmo di Luhn per numeri di carte bancarie o validatori IBAN).
  • Modelli NLP pre-addestrati basati su spaCy o Hugging Face Transformers per il riconoscimento di entità nominate (NER) — persone, luoghi, organizzazioni.
  • Analisi contestuale delle parole. Se una sequenza di numeri è preceduta da parole come "telefono", "tel" o "chiama", il punteggio di confidenza del rilevatore aumenta.
  • Dizionari e liste di stop word.

Esempio Python

Vediamo come appare una pipeline Python di base. Prima, installa i pacchetti:

Per prima cosa, esegui l'analyzer per trovare i punti vulnerabili nella stringa:

Dopo che l'analyzer restituisce gli offset e i tipi di entità, collega il modulo di anonimizzazione:

L'output è una stringa dove i nomi vengono sostituiti con e i contatti vengono sostituiti con e. Se lo desideri, puoi configurare l'hashing, il mascheramento parziale dei caratteri, o la sostituzione con dati falsi tramite Faker.

Aggiungere regole personalizzate

Out of the box, il progetto è ben ottimizzato per formati internazionali: numeri di previdenza sociale USA, carte Visa e Mastercard, numeri di telefono internazionali, email. Per dati locali come passaporti russi, INN o SNILS, dovrai scrivere i tuoi riconoscitori.

È abbastanza semplice da fare usando le classi built-in:

Quando l'analyzer vede una corrispondenza con l'espressione regolare e trova parole dalla lista nelle vicinanze, alza il punteggio di confidenza al massimo.

Altre funzionalità della libreria

Oltre a lavorare con testo normale, il repository contiene moduli helper per task correlati:

  • Anonymizer Image — trova il testo nelle immagini e nelle scansioni PDF tramite OCR (Tesseract) e dipinge sopra i dati personali rilevati con riquadri neri direttamente nei pixel. Utile per elaborare scansioni di passaporti prima di inviarle a servizi esterni.
  • Integrazione con pipeline LLM. Presidio viene spesso usato come middleware prima di inviare prompt a OpenAI o Anthropic: mascheri i dati personali dell'utente dalla richiesta, invii il testo anonimizzato al modello, e sulla via del ritorno, ripristini i dati al loro posto se necessario.
  • REST API su FastAPI, impacchettata in container Docker. Non devi scrivere l'intero servizio in Python — puoi distribuire l'analyzer come microservizio e chiamarlo da backend Go, Java o Node.js.

Possibili sfide

La prima sfumatura è la fame di risorse. Se colleghi transformer pesanti come RoBERTa o BERT per un riconoscimento più accurato delle entità, l'inferenza richiederà memoria e rallenterà l'elaborazione del flusso di dati. Eseguire una pipeline NLP completa in modo sincrono su centinaia di migliaia di RPS sarà pesante — dovrai scaricare il mascheramento su worker asincroni Kafka o Celery.

Il secondo punto riguarda i modelli linguistici per il russo. Il modello base di spaCy gestisce bene l'inglese, ma per il russo dovrai collegare il modello o addestrare il tuo riconoscitore NER sulle specificità del tuo testo.

Applicazioni pratiche

Presidio è utile quando un'azienda ha bisogno di conformarsi al Federal Law 152, al GDPR o all'HIPAA, ma riscrivere l'infrastruttura esistente da zero è troppo costoso.

La libreria si adatta bene a tre scenari:

  • Depurazione di log e trace prima dell'invio a sistemi di monitoraggio (Sentry, OpenTelemetry, ELK).
  • Preparazione di dataset per il training di modelli ML o analisi su dati reali degli utenti.
  • Filtraggio di messaggi in entrata e in uscita in chatbot e sistemi RAG basati su modelli linguistici di grandi dimensioni.

Se stai cercando un toolkit pronto all'uso per il mascheramento dei dati senza dover scrivere parser da zero, il repository merita sicuramente di essere salvato nei preferiti e testato localmente con i tuoi esempi.

Progetti correlati