miXen
PL/SQL Data Masking

miXen e' un package per Oracle RDBMS che consente 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 in PL/SQL, ed e' quindi utilizzabile su database Oracle. miXen consente sia di mascherare i dati con viste SQL che di generare file di export con dati anonimizzati mediante datapump.

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

Ho fretta!

Basta installare miXen lanciando gli script che contengono il package, il package body e le tabelle di appoggio. Le funzioni di miXen sono immediatamente disponibili e possono essere richiamate facilmente in SQL o con il Datapump:

expdp scott/tiger \   tables=emp \
   remap_data=scott.emp.ename:mixen.rnd_surname_us \
   remap_data=scott.emp.sal:mixen.rnd_int_100 \
   remap_data=scott.emp.com:mixen.rnd_int_100 \
   remap_data=scott.emp.hiredate:mixen.add_date_1y \   directory=dpump_dir dumpfile=masked_emp.dmp

Con questo singolo comando viene generato un file di export con i dati mascherati dalle funzioni di miXen.
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 da datapump per generare file di export anonimizzati. La creazione delle viste o degli script di export 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 nell'header del package.
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_role;

La vista di esempio e' molto semplice ma e' possibile utilizzare tutte le funzioni miXen e quelle dell'SQL per alterare i valori desiderati nelle viste.

Per utilizzare la vista:

-- Come utente finale
create synomym emp for scott.masked_emp;
...

select * from emp;

In questo modo l'accesso ai dati mascherati non presenta differenze rispetto all'utilizzo delle tabelle originali. Non e' necessaria alcuna modifica applicativa ma solo l'utilizzo di GRANT e la generazione dei sinonimi. Le viste sono tipicamente autorizzate in sola lettura.
Con questa tecnica non e' necessario allocare spazio ulteriore.

Utilizzo con datapump

Una seconda, importante, necessita' del data masking e' quella di generare i dati per gli ambienti di sviluppo/test/collaudo/... partendo dai dati di produzione.
Con miXen e' molto semplice effettuare il mascheramento dei dati direttamente dall'ambiente di partenza, con un'unica operazione, applicando le funzioni ai parametri di datapump:

expdp scott/tiger \   tables=emp,dept \   remap_data=scott.emp.ename:mixen.lst_surname_us \
   remap_data=scott.emp.sal:mixen.rnd_int_100 \
   remap_data=scott.emp.com:mixen.rnd_int_100 \
   remap_data=scott.emp.hiredate:mixen.add_date_1y \   remap_data=scott.dept.loc:mixen.rnd_city_us \   directory=dpump_dir dumpfile=masked_emp_dept.dmp

In questo modo i dati vengono mascherati all'origine e non richiedono ulteriori trattamenti: il file di export generato e' immediatamente utilizzabile negli ambienti di destinazione.

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 e molto piu' approfondita. Da questo punto di vista e' utile il tool DBSAT fornito da Oracle.

Installazione

miXen e' costituito da un package e dal package body. Per alcune funzioni sono inoltre necessarie tabelle di anagrafica (eg. mixen.mx_city_it) che contengono liste di valori o di codici.

E' fortemente consigliato installare il package e le tabelle di appoggio su uno schema dedicato ed adeguatamente protetto.

E' disponibile un'applicazione APEX per la gestione dei parametri di esecuzione e per l'amministrazione delle tabelle di supporto.

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 e' stato utilizzato il package standard dbms_random, inoltre sono state utilizzate le molteplici funzioni di conversione Oracle. 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.
miXen non e' adatto alla crittografia dei dati: per tale scopo e' consigliato l'uso del DBMS_OBFUSCATION_TOOLKIT o di tool specifici. 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.

Oracle fornisce il prodotto Oracle Data Masking Pack, integrato con le altre soluzioni Oracle (eg. RAT: Real Application Testing). Oracle Data Masking Pack fornisce una soluzione molto piu' ampia di miXen che e' un'alternativa piu' semplice ed applicativa al data masking.


Titolo: miXen: package PL/SQL per il 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