miXen
MySQL Data Masking

miXen e' un utility per MySQL costituita da una serie di funzioni e di tabelle che permettono di mascherare i dati come richiesto dalle normative di sicurezza o piu' in generale per proteggere i dati aziendali.

Il Data Masking (mascheramento dei dati) e' una tecnologia che le piu' recenti normative per la sicurezza dei dati prevedono in modo esplicito, per citarne alcune: GDPR (General Data Protection Regulation, per la protezione dei dati personali), SOX (Sarbanes-Oxley Act of 2002, per la protezione dei dati finanziari), PCI-DSS (Payment Card Industry Data Security Standard, standard internazionale a protezione dei dati delle carte di credito), HIPAA (Health Insurance Portability and Accountability Act, legge USA a protezione dei dati personali e sanitari), ...

miXen e' realizzato con una serie di Stored Routine MySQL. miXen consente sia di mascherare i dati con viste SQL che di modificare dati su database differenti.

Nel seguito sono riportate le informazioni di interesse su miXen organizzate in paragrafi specifici: Introduzione, Funzioni, Utilizzo con viste, Utilizzo su stage area, Installazione, Varie ed eventuali.

Ho fretta!

Basta installare miXen lanciando gli script che contengono il database. Le funzioni di miXen sono immediatamente disponibili e possono essere richiamate facilmente in SQL:

select empno, mixen.rnd_surname_us(ename) ename,  
  job, mgr,  
  mixen.add_date_1y(hiredate) hiredate,  
  mixen.rnd_int_100(sal) sal,  
  mixen.add_int_100(comm) comm,  
  deptno
from emp; 

Utile? Continua a leggere!

Introduzione

miXen e' un package che consente di mascherare i dati come richiesto dalle attuali stringenti normative di sicurezza o piu' in generale per proteggere i dati.

miXen contiene diverse funzioni per mascherare i dati in modo non reversibile basate su liste di valori o con dettagli generati casualmente, ...
miXen contiene funzioni utili per l'utente o il DBA italiano (eg. calcolo del codice fiscale) ma anche funzioni valide in tutto il mondo (eg. controllo di SSN, IBAN) e puo' essere facilmente esteso.
miXen utilizza una serie di tabelle di supporto per la generazione di valori verosimili: cognomi, nomi, citta', ... le tabelle sono nazionalizzate e possono essere estese/sostituite con dati personalizzati.

Per il mascheramento dei dati vengono utilizzate tecniche diverse: generazione casuale di numeri o di stringhe, modifica dei valori, utilizzo di liste di valori (eg. cognomi italiani), valori mascherati (eg. XXXX-XXXX-123), ... Le diverse tipologie di funzioni sono riconoscibili dal prefisso della funzione. Sono inoltre presenti funzioni di utilita' per il calcolo del codice fiscale, per il controllo del numero di partita IVA corrette o delle carte di credito, ...
Le funzioni di miXen possono essere utilizzate per creare viste con dati mascherati oppure possono essere richiamate dall'SQL per modificare i dati e renderli anonimizzati. La creazione delle viste o degli script SQL puo' essere automatizzata partendo da tabelle di assessment dati.

Funzioni

miXen contiene diverse funzioni organizzate in gruppi diversi a secondo della tecnica di mascheramento utilizzata:

L'elenco completo delle funzioni disponibili in miXen e' riportato in questo elenco.
Alcune funzioni sono particolarmente interessanti e vanno meglio descritte...

rnd_smart() modifica i caratteri in una stringa in modo casuale ma mantenendone il formato: sostituisce numeri con numeri, maiuscole con maiuscole, ... mentre lascia inalterati i caratteri speciali ed i separatori. Applicata ad esempio ad un numero di telefono la stringa prodotta avra' numeri diversi ma lo stesso formato del numero originale.
rnd_date_1970() restituisce una data casuale tra epoch (01-01-1970) ed il 31-12-1999 [NdA che corrispondono approssimativamente a I miei primi 40 anni].
chk_PIVA_it() verifica che si tratti di una Partita IVA corretta utilizzando il codice di controllo contenuto nel numero stesso [NdA non effettua un controllo sull'esistenza dell'azienda come sarebbe possibile fare sui siti istituzionali quali quello dell'Agenzia Entrate]. Analogamente avviene per chk_ccard() (carte di credito), chk_IBAN() (conti in formato IBAN): le funzioni verificano il codice di controllo presente nel numero stesso. Anche chk_CF_it() controlla solo il codice di controllo, e' pero' possibile effettuare un controllo piu' completo su un'anagrafica confrontando il valore del codice fiscale con quello generato da bld_CF_it(). chk_SSN_us() controlla solo il formato poiche' il codice sanitario USA non prevede codici di controllo.
fix_name_it() restituisce il valore "MARIO".

Entrambe le tipologie di funzioni [NdE rnd_ e lst_] possono generare collisioni [NdE ed a maggior ragione le msk_ e fix]: va quindi posta molta attenzione ad eventuali indici univoci.

Le funzioni rnd_ restituiscono valori casuali che non dipendono dal valore in input, le funzioni lst_ utilizzano seed correlati ai valori passati in input. In entrambe i casi non e' facile risalire ai dati originali. Tuttavia con le funzioni lst_ esiste una correlazione con i dati di origine. E' quindi opportuno utilizzare le funzioni rnd_ piuttosto che le funzioni lst_ quando possibile perche' queste ultime possono consentire di risalire a parte dei dati originali.

Utilizzo con viste

Il piu' diretto e semplice utilizzo di miXen e' nella creazione di viste con dati mascherati.
In questo modo possono essere presentati dati differenti a gruppi di utenti differenti applicando il principio del minimo privilegio.

Per la creazione della vista:

-- Come utente SCOTT
create view masked_emp as
select empno, mixen.rnd_surname_us(ename) ename,  
  job, mgr,  
  mixen.add_date_1y(hiredate) hiredate,  
  mixen.rnd_int_100(sal) sal,  
  mixen.add_int_100(comm) comm,  
  deptno
from emp; 

GRANT SELECT ON masked_emp TO enduser;

Per rendere piu' semplice e trasparente l'accesso ai dati nella versione anonimizzata su MySQL e' opportuno creare un secondo schema o database con tutte le viste necessarie e far accedere a tale database con USE. Non e' quindi necessaria alcuna modifica applicativa ma solo l'utilizzo di GRANT e la connessione al database corretto. Le viste sono tipicamente autorizzate in sola lettura.
Con questa tecnica non e' necessario allocare spazio ulteriore.

Utilizzo con mysqldump

Teoricamente mysqldump non supporta il datamasking... ma un possibile trucco e':
 mysqldump ... -w "0=1 union select empno, mixen.rnd_surname_us(ename) ename, ... from emp" scott emp

I limiti sono molti... pero' funziona!

Utilizzo su aree di stage

L'utilizzo di un'area di stage consente di modificare i dati a piacimento e con piu' passaggi. La tecnica consiste nel ribaltare i dati dello schema di produzione su un secondo schema sulla stessa base dati; quindi i dati vengono modificati mascherando ogni informazione.
In effetti con tale tecnica miXen non e' strettamente necessario poiche' sarebbe sufficiente una serie di semplici UPDATE SQL, tuttavia miXen contiene diverse funzioni di utilita' che possono essere utilizzate semplificando le procedure di masking.

update dept
   set loc=mixen.rnd_city_us(loc);

Particolarmente utili sono le tabelle di supporto che compongono miXen (eg. nomi, cognomi, citta' italiani o stranieri) che possono essere sfruttate per mascherare i dati originali utilizzando valori verosimili.

L'utilizzo di aree di stage semplifica l'esecuzione del datamasking ma richiede uno spazio maggiore e... non bisogna sbagliare schema nell'applicare il masking!

Analisi dei dati

Questo documento non tratta in nessun modo le fasi di assessment e di analisi del dato che debbono essere svolte prima di decidere cosa mascherare e come.

Tale analisi deve precedere l'utilizzo di miXen.
Alcune funzioni di miXen possono essere utili per verificare il contenuto dei dati...

select count(*) Totale,
       sum(mixen.chk_name_it(colonna_misteriosa)) match_nomi,
       sum(mixen.chk_surname_it(colonna_misteriosa)) match_cognomi,
       sum(mixen.chk_city_it(colonna_misteriosa)) match_citta,
       sum(mixen.chk_CF_it(colonna_misteriosa)) match_CF
  from tabella_misteriosa;

E' chiaro tuttavia che la determinazione dei dati personali, sensibili, critici, ... richiede un'analisi differente.

Installazione

miXen e' costituito da una serie di tabelle e di Stored Routines/FunctionsMySQL. Per alcune funzioni sono inoltre necessarie tabelle di anagrafica opzionali (eg. mixen.mx_city_it) che contengono liste di valori o di codici.

E' fortemente consigliato installare miXen su un database chimato mixen.

Il codice e gli esempi contenuti in questa pagina o nei link citati sono utilizzabili liberamente. miXen e' in costante fase di sviluppo, per avere un aggiornamento scriveteci.

Varie ed eventuali

Per l'implementazione della maggioranza delle funzioni sono state utilizzate le funzioni random standard, inoltre sono state utilizzate le molteplici funzioni di conversione MySQL. Il codice e' stato ottimizzato per consentirne l'utilizzo anche con database di notevoli dimensioni.

In ogni caso miXen non deve e non puo' essere utilizzato come strumento per la crittografia dei dati.
La maggioranza delle funzioni di miXen sono non reversibili quindi si perdono dati e potenzialmente si creano collisioni: questi limiti sono piu' che accettabili (anzi sono opportuni) per generare i casi di prova per un ambiente di test ma non in generale.

miXen e' disponibile anche come package PL/SQL per Oracle [NdA in effetti e' nato su Oracle].


Titolo: miXen: MySQL Data Masking
Livello: Medio (2/5)
Data: 1 Ottobre 2017
Versione: 1.0.2 - 25 Maggio 2018
Autori: mail [AT] meo.bogliolo.name, Fabio Bottiglieri