Mascheramento dei Dati Fai Da Te
Questo articolo descrive come creare una VIEW per visualizzare dati depersonalizzati. La soluzione descritta qui si basa su una soluzione tratta da questo articolo (ottenere una stringa casuale dalla tabella).
Lo scopo principale del mascheramento dei dati è quello di offuscare i dati reali e renderli irrecuperabili. Ma non è sufficiente nascondere semplicemente i dati reali. Molto spesso è necessario che appaiano il più realistici possibile.
Tali requisiti emergono perché il mascheramento dei dati è utilizzato prevalentemente per testare applicazioni e i dati devono apparire il più realistici possibile. Una buona soluzione per questo è utilizzare i dati della tabella effettiva ma prelevarli da righe casuali.
Iniziamo.
Utilizzerò come esempio una tabella chiamata “connections”. Questa tabella include colonne “ID” e “client_port” che dovrebbero essere mascherate. E la colonna “ID” è la chiave primaria della tabella.
Poiché alcune righe potrebbero essere cancellate e l’ID non contiene un valore strettamente coerente, creiamo una tabella con dati collegati al numero di riga. Essenzialmente, è il modo più rapido per PostgreSQL di selezionare i dati in base al numero di riga. Se si utilizza Oracle database, si può saltare questo passaggio.
create table client_port_ids ( rowid serial PRIMARY KEY, id integer ); -- riempire la tabella con numeri di id esistenti. la tabella deve essere riempita prima del mascheramento INSERT INTO client_port_ids (id ) SELECT id FROM connections ORDER BY id;
Poiché Lei desidera che il database mostri gli stessi valori nella riga mascherata ad ogni query SELECT, è necessario creare una tabella per memorizzare il collegamento tra i dati reali e quelli sostituiti.
create table client_port_map ( src integer PRIMARY KEY, dst integer );
Creiamo una funzione di mascheramento per verificare se i dati mascherati non sono stati prelevati prima. E se questi dati sono assenti, la funzione prende i dati da una riga casuale.
CREATE OR REPLACE FUNCTION public.hide_client_port( val integer) RETURNS integer AS $BODY$ DECLARE res integer; sed float; row_count integer; rand_row integer; BEGIN --verifica della mappatura esistente SELECT dst into res FROM client_port_map WHERE src = val; IF FOUND = FALSE THEN --ricerca di una stringa casuale select MAX(rowid) into row_count from client_port_ids; LOOP SELECT floor(random()*row_count) into rand_row; select client_port into res from connections where id = (select id from client_port_ids where rowid = rand_row); EXIT WHEN FOUND = TRUE; END LOOP; --salvataggio del nuovo valore nella mappatura INSERT INTO client_port_map VALUES (val, res); END IF; return res ; END; $BODY$ LANGUAGE plpgsql VOLATILE
Vediamo come vengono mescolate le voci.
Poiché in questo esempio utilizziamo una tabella piccola, alcune voci sostituite corrispondono a quelle reali. Questo perché è impossibile ingannare la teoria della probabilità.
Come potrebbe essere utilizzato questo? Creiamo un nuovo schema con una VIEW utilizzando una tabella con dati reali. E per la tabella “connections” creiamo la seguente VIEW:
CREATE OR REPLACE VIEW public.connection AS SELECT connections.partition_id, connections.id, connections.interface_id, connections.client_host, hide_client_port(connections.client_port) AS hide_client_port, connections.begin_time, connections.end_time, connections.client_host_name, connections.instance_id, connections.proxy_id, connections.sniffer_id FROM connections;
Come si vede, è abbastanza semplice. Ovviamente, questa funzione può essere migliorata. Ad esempio, si potrebbe impiegare un meccanismo per assegnare valori differenti a righe che contengono valori simili. Ma questo è un altro discorso.
Per mascherare i tuoi dati professionalmente, puoi utilizzare il Mascheramento Dinamico dei Dati incluso nel Data Sunrise Database Security Suite.