SICUREZZA NELLE APPLICAZIONI I primi lavori sulla sicurezza informatica erano basati sul paradigma “riempi e rattoppa”, in cui gli analisti cercavano e riparavano i difetti. Spesso veniva assegnato ad un team di esperti di prima qualità il compito di provare la sicurezza di un sistema cercando di provocarne il malfunzionamento. Il test era considerato una prova della sicurezza: se il sistema resisteva agli attacchi era considerato sicuro. La scoperta dei problemi, a sua volta, portava ad una rapida attività di patching (“rattoppo”) del sistema per riparare o ripristinare la sicurezza. Tuttavia, gli sforzi per produrre una patch erano largamente inutili, e rendevano il sistema meno sicuro anziché più sicuro, perché spesso introducevano nuovi difetti. Un modo per affrontare i potenziali problemi è cercare di anticiparli. ERRORI DI PROGRAMMI NON MALEVOLI I programmatori e altri sviluppatori commettono molti errori, la maggior parte dei quali non è intenzionale né malevole. Vi sono 3 tipi di errori classici: 1. Buffer overflow: Un buffer overflow è l’equivalente informatico di versare 2 litri d’acqua in una brocca dalla capacità di un litro. Un buffer è uno spazio di memoria in cui possono essere conservati i dati. Poiché la memoria è finita, anche la capacità del buffer è finita. Sarebbe utile se, durante l’esecuzione, il sistema producesse un messaggio d’errore per avvisare del superamento dei limiti da parte dell’indice. Sfortunatamente, in alcuni linguaggi le dimensioni del buffer non devono essere predefinite, pertanto non vi è modo di rilevare un errore di superamento dei limiti. I casi più interessanti avvengono quando il sistema possiede lo spazio immediatamente successivo all’array in overflow. Il riversamento nell’area di codice o dei dati di sistema produce risultati simili a quelli per lo spazio utente. Supponiamo che una persona ostile comprende il danno che può essere arrecato da un buffer overflow. In primo luogo, l’aggressore può sostituire il codice nello spazio del sistema. Se l’aggressore riesce ad ottenere il controllo mascherandosi come sistema operativo, può eseguire molti comandi da una posizione di privilegio. Pertanto, sostituendo alcune istruzioni subito dopo il ritorno dalla sua procedura, l’aggressore può ottenere di nuovo il controllo del sistema operativo. Se il buffer overflow avviene nello spazio del codice di sistema, l’aggressore inserisce semplicemente i dati di overflow che corrispondono al codice macchina per le istruzioni. 2. Mediazione incompleta: La mediazione incompleta è un altro problema di sicurezza che ci affligge da decenni. Accade quando l’interazione fra 2 componenti del software è parziale: è stata trasferita una parte delle informazioni senza però essere gestita completamente. Sostanzialmente vengono accettati dei dati senza essere certi di averne verificata la sostanza, senza aver completato le diverse fasi che prevedono il passaggio dei dati. 3. Errori dovuti allo scarto fra tempo di controllo e tempo di utilizzo: Il terzo difetto di programmazione analizzato riguarda la sincronizzazione. Per migliorare l’efficienza, i processori e i sistemi operativi moderni solitamente cambiano l’ordine in cui sono eseguite le istruzioni. La falla “tempo di controllo/tempo di utilizzo” riguarda la mediazione eseguita con un attacco. È nota anche come falla di sincronizzazione o di serializzazione. Si supponga che una richiesta di accedere ad un file venga presentata come una struttura dati, contenente il nome del file e la modalità di accesso. Una volta data l’autorizzazione, il lavoro viene posto in una coda di operazioni da svolgere. Normalmente, il mediatore per il controllo degli accessi riceve la struttura dati, determina se l’accesso dovrebbe essere consentito, quindi rifiuta l’accesso e si ferma, oppure consente l’accesso e inoltra la struttura dati al gestore. Per eseguire questa sequenza di autorizzazioni, il mediatore del controllo degli accessi dovrebbe osservare il nome del file, e potrebbe confrontare i nomi nella tabella o copiare il nome del file nella sua area di memorizzazione. Il confronto della copia lascia la struttura dati nell’area dell’utente, sotto il suo controllo. A questo punto la falla di mediazione incompleta può essere sfruttata. Mentre il mediatore controlla i diritti d’accesso per il file, l’utente potrebbe cambiare il descrittore del nome. ANALISI DEL RISCHIO L’analisi del rischio è un insieme di tecniche sistematiche atte a evidenziare potenziali stati rischiosi del sistema. Può aiutare a mettere in luce i problemi della sicurezza e ad identificare quindi le strategie di prevenzione o attenuazione per affrontarli. Le fonti dei problemi possono essere nascoste in qualsiasi prodotto del processo di sviluppo o manutenzione, non solo nel codice. Per questo l’analisi del rischio riguarda l’intero sistema, e non solamente il codice. L’analisi dovrebbe iniziare quando lo sviluppatore comincia a pensare alla costruzione di un nuovo sistema, e dovrebbe proseguire nell’intero ciclo di vita del sistema. Numerose tecniche supportano l’identificazione e la gestione di rischi potenziali. Tra le più efficaci vi sono: HAZOP (studi del rischio e dell’operatività): Una tecnica di analisi strutturale che individua i punti di rischio dell’applicazione in base alle esperienze passate, e li classifica per poter preparare il test opportuno. FMEA (analisi degli effetti e delle modalità di malfunzionamento): Una tecnica bottom-up applicata a livello delle componenti del sistema. È un’analisi fatta in funzione dell’effetto che può avere un possibile malfunzionamento in una certa parte del programma. Vengono prese le singole funzioni e si esamina cosa implica l’eventuale fallimento nelle funzioni di livello superiore. FTA (analisi della struttura degli errori): Una tecnica top-down che parte dall’analisi di un ipotetico malfunzionamento rischioso del sistema, e poi si procede dall’alto verso il basso per cercare di capire quali sono le parti coinvolte nel fault. È esattamente il contrario dell’analisi FMEA. Si decide la tecnica più appropriata in base alla comprensione delle cause e degli effetti. TEST Il test è un processo che trova posto nel settore della qualità del prodotto: il suo scopo è rendere il prodotto privo di malfunzionamenti o tolleranze agli errori. Mira più ad un analisi funzionale che ad un analisi di sicurezza. Il malfunzionamento di un solo controllo espone una vulnerabilità che non viene migliorata da nessuna aggiunta di controlli funzionanti. La complicazione principale quando si effettua un test è però che non si può osservare solo l’unico comportamento che porta il programma a funzionare correttamente: si deve tenere conto anche delle centinaia di modalità in cui il programma potrebbe non funzionare. L’insieme delle tecniche appropriate per il test di un dato sistema dipende dalla dimensione del sistema, dal dominio dell’applicazione, dalla quantità del rischio e da molti altri fattori. BUONA PROGETTAZIONE Per la progettazione di software sicuro: Utilizzo di fault-tolerance Disponibilità di una politica coerente per la gestione dei malfunzionamenti Acquisizione della logica di progettazione e della cronologia Utilizzo di schemi di progettazione I progettisti dovrebbero cercare di anticipare gli errori e gestirli in modo da ridurre al minimo e massimizzare la sicurezza e la protezione. Un rilevamento attivo degli errori potrebbe essere messo in pratica adottando una filosofia di reciproco sospetto. Possiamo anche utilizzare la ridondanza, confrontando i risultati di 2 o più processi per vedere se sono in accordo prima di usarne il risultato in un’attività. Se la correzione di un errore è troppo rischiosa, sconveniente o costosa, è possibile ricorrere alla fault-tolerance, isolando il dominio provocato dall’errore e riducendo al minimo le interruzioni per gli utenti. SISTEMI OPERATIVI Un sistema operativo deve principalmente controllare l’accesso condiviso e implementare un’interfaccia che permetta gli accessi stessi. Oltre a queste 2 funzioni svolge attività di supporto, incluse l’identificazione, l’autenticazione, la denominazione, la schedulazione dei processi, l’archiviazione dei files, il recupero e il riutilizzo di oggetti, e la comunicazione tra processi. Le funzioni principali di un sistema operativo possono essere distinte in: Controllo dell’accesso Gestione dell’identità e delle credenziali Flusso di informazioni Analisi e protezione dell’integrità L’obiettivo di un sistema operativo è quello d frapporsi tra l’utente e l’hardware su più livelli. Di fatto assume implicitamente una forma di protezione, poiché offrendo dei servizi di livello più alto possono avvenire accessi indesiderati o non protetti alla memoria, a tutti quegli elementi che hanno a che vedere con l’hardware correlato alla gestione della memoria. Oggi troviamo sistemi operativi semplici (single task) e complessi (multi-task). Un sistema operativo supporta la multiprogrammazione, pertanto i sistemi hanno sviluppato alcuni modi per proteggere il lavoro di un utente dall’interferenza maliziosa o involontaria di un altro utente. OGGETTI PROTETTI La nascita della multiprogrammazione ha sottolineato l’esigenza di proteggere la configurazione di un sistema informatico. Memoria Periferiche di I/O condivisibili, come i dischi Periferiche di I/O seriali Sottoprocedure e programmi condivisibili Reti Dati condivisibili METODI DI PROTEZIONE DEI SISTEMI OPERATIVI La base della protezione è la separazione, cioè la capacità di mantenere gli oggetti di un utente separati da quelli di altri utenti. Bisogna poter separare tra di loro gli elementi dell’informazione che si deve proteggere. In un sistema operativo la separazione avviene in 4 modi canonici, che possono essere applicati ed incrociati in funzione delle caratteristiche del sistema, per creare una divisione dei contenuti: 1. Separazione fisica: Diversi processi impiegano diversi oggetti fisici (unità, dischi, blocchi, periferiche I/O, ecc.). 2. Separazione temporale: I processi con diversi requisiti di protezione vengono eseguiti in tempi diversi. 3. Separazione logica: Le risorse, che sono sullo stesso supporto fisico, possono venire rappresentate logicamente divise. Gli utenti operano nell’illusione che non esistano altri processi. 4. Separazione crittografica: I processi nascondono dati e calcoli in modo che siano incomprensibili ai processi esterni. Gli oggetti sono nelle stesse partizioni fisiche, accessibili contemporaneamente, ma hanno differenti chiavi d’accesso. In ogni caso la separazione è solo una parte della risposta. Vogliamo separare gli utenti e i loro oggetti, ma occorre anche essere in grado di fornire la condivisione per alcuni degli oggetti. Un valido sistema operativo deve garantire la protezione su ognuno dei diversi livelli. Non proteggere (problemi di costi) Isolare l’informazione Condividere tutto o niente Condividere tramite limitazione dell’accesso Condividere per competenza Limitare l’uso di un oggetto Un dato sistema operativo è in grado di fornire diversi livelli di protezione per oggetti, utenti o situazioni differenti. PROTEZIONE DELLA MEMORIA E DELL’INDIRIZZAMENTO Il problema più ovvio della multiprogrammazione consiste nell’evitare che un programma influisca su dati e programmi presenti nello spazio di memoria di altri utenti. SEGMENTAZIONE La segmentazione richiede la semplice divisione di un programma in parti separate: ogni parte possiede un’unità logica in relazione al suo intero codice o ai suoi dati. Ogni segmento ha un nome unico. È possibile fare riferimento ad un elemento di codice o dati all’interno di un segmento. Dal punto di vista logico, un programmatore crea un programma come un lungo insieme di segmenti: questi segmenti possono essere riposizionati in modo separato, così che ognuno possa essere collocato dove la memoria è libera. PAGINAZIONE Un’alternativa alla segmentazione è la paginazione. Il programma viene diviso in parti di uguali dimensioni chiamate pagine, mentre la memoria è divisa in unità di uguali dimensioni chiamate page frame. Come per la segmentazione, ciascun indirizzo in uno schema di paginazione è un oggetto formato da 2 parti. A differenza della segmentazione, tutte le pagine nel sistema di paginazione hanno la stessa dimensione fissa. CONTROLLO DEGLI ACCESSI AGLI OGGETTI GENERAL PURPOSE La protezione della memoria è un caso specifico del problema più generale della protezione degli oggetti. Abbiamo individuato diversi obiettivi complementari nella protezione degli oggetti: Controllare ogni accesso Aumentare il privilegio minimo Assicurare un utilizzo accettabile DIRECTORY Un modo semplice ed efficiente per proteggere un oggetto consiste nell’impiegare un meccanismo che funziona come una directory di files. Questo approccio è facile da implementare perché si ha un elenco per ogni utente, e un nome per tutti gli oggetti a cui l’utente può accedere. In ogni elenco della directory si stabilisce il tipo di protezione (rwx) per ogni singolo livello. Tuttavia, possono sorgere diverse difficoltà. Una difficoltà riguarda la revoca dell’accesso: se il proprietario A ha passato all’utente B il diritto di leggere il file F, viene creata una voce per F nella directory per B. Questa garanzia di accesso implica un livello di fiducia tra A e B. Se in seguito A mette in dubbio quella fiducia, potrebbe voler revocare i diritti di accesso di B. LISTA DI CONTROLLO DEGLI ACCESSI (ACL) Una rappresentazione alternativa più puntuale ma meno efficiente è la lista di controllo degli accessi. Esiste una lista di questo tipo associata ad ogni oggetto sensibile, e vi sono contenuti gli utenti o i processi abilitati a fare un certo tipo di operazioni. Questo approccio differisce dall’elenco della directory perché esiste un elenco di controllo degli accessi per oggetto; la directory viene invece creata per soggetto. MATRICE DI CONTROLLO DEGLI ACCESSI Come alternativa possiamo utilizzare una matrice di controllo degli accessi, una tabella bidimensionale in cui ciascuna riga rappresenta un soggetto, ciascuna colonna rappresenta un oggetto e ciascuna voce indica l’insieme di diritti di accesso del soggetto all’oggetto. Vi sono tante matrici quante sono le operazioni possibili, e per ognuna di queste operazioni si specifica se vi sono permessi o divieti all’utilizzo. In un certo senso è l’insieme dei 2 approcci precedenti. CAPABILITY Una capability è un token (gettone) che conferisce al soggetto possessore diritti e autorizzazioni per disporre di un particolare tipo di accesso ad un oggetto. Viene associato all’utente che ha certi privilegi. Affinché la capability offra una protezione valida, il token non deve essere falsificabile. ROLE-BASED Il controllo di accesso “role-based” è l’estensione del concetto di capability, che permette di associare privilegi a dei gruppi, definendo un insieme di ruoli. AUTENTICAZIONE UTENTE Un sistema operativo basa buona parte della sua protezione sulla conoscenza degli utenti del sistema. Solitamente, per confermare l’identità di un utente i meccanismi di autenticazione adottano uno di questi 3 requisiti: 1. Qualcosa che l’utente conosce 2. Qualcosa che l’utente possiede 3. Qualcosa che l’utente è PASSWORD COME AUTENTICATORI Il meccanismo di autenticazione più diffuso per gli utenti di un sistema operativo è la password. Le password sono parole in codice che dovrebbero essere note solo all’utente e al sistema. Presentano qualche imperfezione durante l’uso: Perdite Utilizzo Divulgazione Revoca Oltre al nome e alla password, possiamo ricorrere ad altre informazioni aggiuntive disponibili per l’autenticazione degli utenti. Vengono utilizzate per rafforzare l’autentificazione specificando quando, dove, con chi, a chi, ecc. Fare uso di ulteriori informazioni per l’autenticazione si definisce “autenticazione multifactor”. Due forme di autenticazione, sottintendendo che siano valide, sono meglio di una sola; al crescere del loro numero, però, cresce il numero degli inconvenienti. TIPICHE DEBOLEZZE Le password sono soggette agli attacchi a vocabolario. Sono attacchi esaustivi basati su un vocabolario di password e sulle loro modalità di costruzione note, legate soprattutto alla lingua che si utilizza ma che in termini semantici sono basate sullo stesso tipo di criterio. Le password possono essere sia prevedibili che probabili: lo studio delle password ha portato alla conclusione che ci siano password più probabili delle altre, e quindi facilmente prevedibili tramite lo studio della persona. Un altro parametro che incide sulla sicurezza della password è la frequenza con cui un eventuale attaccante può provare, in relazione al numero di tentativi possibili del sistema. MEMORIZZAZIONE DELLA PASSWORD La memorizzazione della password può avvenire in chiaro o tramite creazioni di combinazioni di informazioni che ne rendano difficile l’utilizzo all’eventuale attaccante. In alternativa, vengono previsti meccanismi di crittazione della password o è possibile passarla dall’hash per renderla poco comprensibile. Ma non basta conservare la password crittata, bisogna garantire che sia sicuro tutto il flusso che va dall’acquisizione della password fino alla memorizzazione o alla verifica della stessa. La soluzione è l’inserimento di salt. Si aggiunge un’informazione che è a conoscenza sia del sistema che acquisisce la password, che del sistema che la deve verificare, che però è legata in qualche maniera ad elementi che permettono di renderla univoca. Salt è un modo per rendere meno evidente qual è la parte di codice della password. Serve ad aumentare la robustezza della memorizzazione della password, e quindi ad evitare che un estraneo che possa leggere il contenuto della password, seppure crittata, ne possa fare un uso diretto. L’obiettivo del salt è che la stessa password abbia codifiche differenti. Garantisce che se la stessa password viene memorizzata in 2 sessioni o 2 sistemi differenti, ciò che viene caricato nel file non è mai lo stesso. INVECCHIAMENTO DELLA PASSWORD Bisogna definire delle strategie per garantire che la password non sia usa usata troppe volte. Il tempo di vita della password è strettamente correlato al numero di volte che questa viene utilizzata. ONE TIME PASSWORD (OTP) In termini di sicurezza sono strumenti comparabili alla firma digitale, e ne costituiscono un’alternativa valida. È un metodo molto semplice ed economico, e non ha bisogno di ulteriori dispositivi hardware integrati (smart card, ecc.). Sono password monouso che vengono utilizzate solo una volta, basate su algoritmi che permettono di ricostruire ogni volta quale sarà la password successiva, attraverso un generatore di numeri casuali. Il sistema autenticatore rispetto a colui che si autentica condivide il seme che viene fissato per produrre la sequenza di password successive. Bisogna prevedere un foglio di carta da condividere tra il server ed utente, ed aggiornare di volta in volta. Questo tipo di meccanismo necessita dell’equivalente della Certificate Revocation List. SISTEMI OPERATIVI TRUSTED Un sistema operativo si dice “trusted” se fornisce in un modo coerente ed efficace i seguenti servizi: Protezione della memoria Protezione dei files Controllo degli accessi agli oggetti generici Autenticazione dell’utente Per poter ottenere la certificazione, fin dalla fase di progettazione, bisogna seguire dei modelli ben precisi che impongono l’organizzazione, ma soprattutto il flusso delle informazioni. Per questo i sistemi operativi tradizionali (Windows, Unix, Mac) non hanno il bollino “trusted”, ma preferiscono adoperare criteri di usabilità. Esistono però delle versioni trusted di questi operativi che sono state riprogettate e ridefinite. I 4 principali sostegni di un sistema trusted sono: 1. Policy: Ogni sistema può essere descritto dai suoi requisiti. 2. Modello: Per creare un sistema operativo trusted i progettisti devono ritenere che il sistema proposto soddisferà i requisiti, proteggendo al contempo le relazioni e gli oggetti appropriati. 3. Progetto: Dopo avere scelto un modello di sicurezza, i progettisti scelgono un mezzo per implementarlo. 4. Fiducia: È radicata in 2 aspetti, funzionalità e garanzie. Un software si dice trusted se il codice è stato rigorosamente sviluppato e analizzato, dando motivo di credere che faccia soltanto ciò per cui è stato realizzato e nulla di più. Per poter riporre fiducia in un programma occorrono analisi e test rigorosi per verificare alcune caratteristiche chiave: Correttezza funzionale: Il programma esegue ciò per cui è stato realizzato. Preservamento dell’integrità: Il programma preserva la correttezza dei dati che elabora. Privilegi limitati: Il programma può accedere a dati riservati. Livello di fiducia appropriato. Il software trusted viene spesso utilizzato come un mezzo sicuro per consentire ad utenti generici di accedere a dati critici. MODELLI DI SICUREZZA I modelli vengono spesso utilizzati per descrivere, studiare o analizzare una particolare situazione o relazione. Sono strumenti formali utilizzati per: Verificare la completezza e la coerenza di una particolare politica. Documentare una politica. Aiutare a concettualizzare e progettare un’implementazione. Controllare se un’implementazione soddisfa i requisiti. BELL-LA PADULA Il modello Bell-La Padula è uno dei primi modelli realizzati, molto nitido e abbastanza facile da tracciare, utilizzabile quando è importante mantenere la segretezza. Rappresenta una descrizione formale dei percorsi consentiti per il flusso delle informazioni in un sistema sicuro. L’obiettivo del modello è identificare le vie di comunicazione attraverso cui passano le informazioni, in maniera tale da garantire che queste informazioni mantengano il grado di riservatezza previsto. Bell e La Padula si sono ispirati in maniera diretta al meccanismo di trasmissione delle informazioni all’interno dei sistemi di sicurezza di agenzie spionistiche all’interno di strutture militari. È un sistema che ha una logica di base di tipo gerarchico. I criteri generali su quello che può essere fatto sull’informazione vengono definiti da 2 proprietà, che caratterizzano il flusso sicuro delle informazioni: 1. Proprietà della sicurezza semplice: Un soggetto s può avere l’accesso in lettura ad un oggetto o soltanto se la confidenzialità di o è minore della confidenzialità di s. 2. Star property: Un soggetto s che ha accesso in lettura ad un oggetto o può avere accesso in scrittura ad un ulteriore oggetto p solo se la confidenzialità di o è minore di quella di p. Tale proprietà viene utilizzata per impedire la scrittura su un livello inferiore. BIBA Il modello Biba rappresenta la controparte del modello precedente, per la protezione dell’integrità dei dati. Mentre il modello Bell-La Padula si concentra sull’individuazione dei canali di comunicazione e quindi il semplice accesso all’informazione, questo si concentra sul mantenimento dell’integrità dell’informazione affinché non venga danneggiata. I 2 modelli possono essere contemporaneamente presenti, dato che uno ha come obiettivo la confidenzialità, mentre l’altro ha la garanzia dell’integrità. GRAHAM-DENNING Graham e Denning hanno introdotto il concetto di sistema formale di regole di protezione. Hanno costruito un modello con proprietà di protezione generiche, che formerà le basi per 2 modelli successivi di sistemi di sicurezza. Il modello Graham-Denning opera su un insieme di soggetti S, un insieme di oggetti O, un insieme di diritti R e una matrice di controllo degli accessi A. La matrice contiene una riga per ogni soggetto e una colonna per ogni soggetto e ogni oggetto. I diritti di un soggetto su un altro soggetto o su un oggetto sono mostrati dal contenuto di un elemento della matrice. Per ogni oggetto, un soggetto stabilisce che il proprietario ha diritti speciali; per ogni soggetto, un altro soggetto stabilisce che il controller ha diritti speciali. TAKE-GRANT Un modello finale di sistema di protezione è il sistema Take-Grant. Questo modello presenta solo 4 operazioni primitive generiche: crea, revoca, prendi e garantisci. Crea e revoca sono simili alle operazioni del modello Graham-Denning, prendi e garantisci sono 2 tipi di operazioni nuove, che presuppongono la sussistenza di specifici diritti: Crea: Il soggetto s crea l’oggetto o, con i diritti di accesso r su o. Revoca: Il soggetto s revoca i propri diritti di accesso r su o. Garantisci: Il soggetto s garantisce ad o i diritti di accesso r su p. Prendi: Il soggetto s prende da o i diritti di accesso r su p. SSH: È un protocollo di rete che prevede il trasferimento dei dati e funzionalità di manipolazione. Solitamente si usa la porta 22. Non prevede né autenticazione né sistemi di sicurezza. PHISHING: Un utente ingenuo può trovarsi a inserire dati personali in un sistema malevolo che ne impersona uno degno di fiducia. SNIFFING: Intercettazione ostile delle comunicazioni. SPOOFING: È una situazione in cui una persona o un programma si mascherano da un altro tramite dati falsificati e accedono a privilegi illegittimi. DATABASE Sui database le problematiche più grosse sono legate al fatto che possono essere ottenute informazioni in maniera indiretta. Non solo si devono evitare i classici problemi dovuti ad accessi indesiderati e all’autenticazione, ma si deve anche garantire che nell’utilizzo del database non sia possibile accedere all’informazione. Possono essere ottenute informazioni anche senza fare una richiesta specifica. Pur non facendo un’interrogazione diretta sul database, proprio per la loro struttura estremamente interrogabile, si può cercare di ottenere informazioni estraendole da alcuni tipi di query soprattutto di tipo cumulativo (anche mediante intersezioni). I requisiti basilari per la protezione dei sistemi di database non sono diversi da quelli degli altri sistemi informatici. I problemi principali sono: Integrità fisica del database: I dati del database devono essere immuni da problemi fisici. Integrità logica del database: La struttura logica del database deve essere protetta. Integrità dell’elemento: I dati contenuti in ogni elemento devono essere precisi. Verificabilità: È possibile rintracciare chi o cosa ha eseguito l’accesso (storia dei dati). Controllo degli accessi: Un utente deve avere accesso solo ai dati autorizzati. Autenticazione utente: Ogni utente viene positivamente identificato. Disponibilità: Gli utenti sono abilitati ad accedere al database in generale. AFFIDABILITA’ E INTEGRITA’ In generale, nell’ambito dell’affidabilità, esistono tutta una serie di problematiche legate alle funzioni del sistema operativo che ospita il database. Quando gli ingegneri del software affermano che il software garantisce affidabilità, intendono dire che può lavorare per lunghi periodi di tempo senza problemi. Gli utenti si aspettano ovviamente che un database sia affidabile, perché solitamente i dati sono importanti per esigenze di business ed organizzative. Un database protegge da eventuali perdite e danni ai dati in modi diversi. Le questioni relative all’affidabilità e all’integrità dei database sono su 3 livelli: 1. Ridondanza: Molti database mantengono informazioni aggiuntive per rilevare le incongruenze interne nei dati. Una forma di ridondanza è costituita dai codici di correzione e rilevamento degli errori, come i bit di parità. Questi codici possono essere applicati a singoli campi, a record o all’intero database. Maggiore è il numero di informazioni fornite, maggiore è lo spazio richiesto per memorizzare i codici. In teoria non ci dovrebbe essere ridondanza, ma in pratica è spesso frequente per motivi di efficienza, o di normalità di gestione delle operazioni. Ovviamente deve anche essere gestita la coerenza. Abbiamo 2 livelli possibili: uno è quello in cui deleghiamo all’applicazione e l’altro, quando queste funzioni sono presenti all’interno del Database Engine, è quello di utilizzare i vincoli certi che permettono di garantire che queste operazioni vengono effettuate. 2. Monitor: In un database, il monitor è l’unità responsabile dell’integrità strutturale del database stesso. Un monitor può verificare i valori inseriti per assicurarne la coerenza con il resto del database o con le caratteristiche di un particolare campo. 3. Confronto di intervallo: Un monitor di confronto di intervallo verifica ogni nuovo valore per assicurarsi che si trovi all’interno di un intervallo accettabile. Se il valore dei dati è al di fuori dell’intervallo, viene rifiutato e non viene inserito nel database. I confronti di intervallo possono essere impiegati per assicurare la coerenza interna di un database. I filtri sono un’alternativa più generica per controllare la forma dei dati. I controlli di questo tipo sono utili per testare i dati inseriti col database. DATI SENSIBILI I dati sensibili sono quei dati che contengono delle informazioni che non dovrebbero essere rese pubbliche, ma che devono essere accessibili solo alle persone autorizzate. Determinare quali dati e campi siano sensibili dipende dal singolo database e dal contenuto dei dati. Il problema più difficile, ma anche più interessante, è il caso in cui alcuni ma non tutti gli elementi del database sono sensibili. Possono inoltre esistere vari gradi di sensibilità. I fattori che possono rendere sensibili i dati sono diversi: Sensibili per contenuto (valore) Provenienti da una fonte sensibile Dichiarati sensibili Parti sensibili: attributo o record Sensibili in relazione ad informazioni divulgate in precedenza I dati possono essere sensibili, ma possono esserlo anche le loro caratteristiche. Per determinare la sensibilità dei dati è necessario considerare tutti questi tipi di divulgazione: Dati esatti: La divulgazione più grave è quella del valore esatto di un elemento che contiene dati sensibili. Un cattivo programma di gestione del database può inoltre consegnare i dati sensibili per errore. Limiti: Un’altra esposizione è la divulgazione dei limiti di un valore sensibile, cioè l’indicazione che un valore sensibile g è compreso tra 2 valori L e H. Risultato negativo: A volte è possibile scrivere una query per determinare un risultato negativo. In pratica, si può sapere che z non è il valore di g. Esistenza: L’esistenza stessa dei dati è un dato sensibile, indipendentemente dal loro effettivo valore. Valore probabile: In base a certe osservazioni ottenute tramite query, si può non ottenere il valore esatto di un certo elemento, ma una buona probabilità che quel particolare dato sensibile abbia un certo valore. INFERENZA L’inferenza è un metodo per dedurre o derivare dati sensibili da dati non sensibili (pubblicamente accessibili), e può essere considerata una vulnerabilità sottile nella protezione dei database. 1. Attacco diretto: In un attacco diretto, un utente cerca di determinare i valori dei campi sensibili eseguendo le ricerche con query dirette a pochi record. La tecnica di maggior successo consiste nel produrre una query così specifica da corrispondere ad un unico elemento di dati. 2. Attacco indiretto: Un’altra procedura usata dalle organizzazioni che raggruppano dati sensibili prevede la pubblicazione delle sole caratteristiche statistiche. Le organizzazioni eliminano i singoli nomi, indirizzi o elementi che permettono il riconoscimento di un singolo individuo. Vengono quindi pubblicate solo statistiche neutrali come una somma, un conteggio o una media. L’attacco indiretto cerca di dedurre un risultato individuale basato su uno o più calcoli statistici effettuati al di fuori del database. Somma: Un attacco mediante una somma cerca di dedurre un valore da una somma riportata. Conteggio: Il conteggio può essere combinato alla somma per produrre risultati ancora più rivelatori. Media: La media aritmetica permette una divulgazione esatta, se chi ne fa uso è capace di manipolare il dato della popolazione. Mediana: Con un processo leggermente più complicato è possibile determinare il valore individuale della mediana. 3. Attacchi di tracker: L’attacco di tracker può influenzare il gestore del database durante l’individuazione dei dati desiderati, utilizzando query aggiuntive che producono piccoli risultati. Il tracker aggiunge altri record da recuperare per 2 query diverse; i 2 insiemi di record si annullano l’un l’altro, lasciando solo i dati o le statistiche desiderati. VULNERABILITA’ DEL SISTEMA LINEARE Un tracker è un caso specifico di una vulnerabilità più generica. È possibile determinare una serie di query che restituiscono i risultati relativi ad insiemi diversi. Un’altra possibilità è il fatto di riuscire a tracciare la storia di quello che avviene, cioè avere in qualche maniera l’informazione delle query che sono avvenute. Tracciando le operazioni, in base alle modifiche che hanno certi record, o quali record sono coinvolti in determinate query, si punta all’informazione indiretta. Per poter fare questo tipo di attacco, bisogna avere una certa comprensione dello schema che sta dietro. I controlli che possono essere fatti contro l’inferenza sono: Controllo della query: Una forma di protezione complessa impiega un’analisi sintattica e semantica della query, che non sia delegata solo al database, difficile da applicare ed efficace solo contro gli attacchi diretti. Una query e le sue implicazioni vengono analizzate per distinguere se fornire o no un risultato. Tale approccio implica la manutenzione di una cronologia delle query per ogni utente e la valutazione di una query nel contrasto delle inferenze possibili. Controllo degli elementi: Possono essere implementati diversi approcci: 1. Non vengono date risposte, se il numero di elementi coinvolti in una risposta aggregata non è superiore ad una certa soglia. 2. I risultati possono essere forniti solo in maniera combinata (per intervallo, per elementi, per arrotondamenti, ecc.). Queste 2 soluzioni vengono spesso combinate, ma sostanzialmente evitano che si possa avere aggregati singoli, ma vengono forniti in formato grafico o tabellare. Per cui non si ottiene il dato diretto, ma solo informazioni generali. 3. Campionamento casuale: Invece di utilizzare tutti i record coinvolti se ne utilizza solo una certa parte ritenuta sufficiente per dare l’informazione aggregata. Il risultato non sarà sempre lo stesso e, se il campionamento viene applicato in maniera corretta (e su dati corretti), sarà significativo poiché l’errore sarà solo sulla parte meno importante del dato. Questo non permette all’attaccante di sfruttare queste informazioni. 4. Perturbazione casuale dei dati: Prima di esporre il dato viene cambiato. AGGREGAZIONE L’aggregazione, collegata al problema dell’inferenza, mira alla creazione di risultati sensibili partendo da input meno sensibili. È possibile fare operazioni di tipo aggregato sul sistema. Avendo tutte le informazioni (media, conteggio, somma) si può cercare di ricostruire i dati sorgenti, solo quando il numero di record coinvolti sono pochi. Tipicamente l’inferenza risulta essere molto efficace quando ci sono gruppi dei sottoinsiemi dell’aggregazione dei dati, relativi ad un numero limitato di elementi, righe o record. Poiché in questo caso, fin quando i record risultano essere limitati, l’informazione aggregata coincide quasi completamente con l’informazione puntuale. DATABASE MULTILIVELLO Il database multilivello è un qualsiasi sistema in cui la sensibilità dell’informazione non è una proprietà dell’attributo, ma dipende da altri elementi che fanno da contorno all’attributo stesso. Si ha una sorta di gerarchia in cui il dato sensibile è legato solo al contesto considerato dell’attributo. Partizionamento: Il controllo più ovvio per i database multilivello è il partizionamento, che ne aumenta l’efficienza. Il database viene diviso in database separati, ciascuno con un diverso livello di sensibilità. Si stabiliscono delle regole delle regole di accesso differenti, che permettono di controllare e limitare il tipo di accesso record per record. Crittazione: Se i dati sensibili sono crittati, un utente che li riceve accidentalmente non è in grado di interpretarli. Quindi, ogni livello di dati sensibili può essere memorizzato in una tabella crittata a chiave unica per il livello di sensibilità. Blocco dell’integrità: Il blocco dell’integrità è un modo per fornire integrità e accesso limitato ad un database. Blocco della sensibilità: Il blocco della sensibilità è una combinazione di un identificatore univoco e del livello di sensibilità. PROCESSO “TRUSTED FRONT-END” Un “trusted front-end” opera in modo simile al monitor di riferimento. Questo approccio riconosce che molti database sono stati costruiti e distribuiti senza considerare la sicurezza multilivello. Il concetto di front-end sfrutta l’esperienza e gli strumenti esistenti, migliorandone la sicurezza con minime modifiche al sistema. L’approccio per ottenere le informazioni è mediato dal front-end. I passi tipici di questo schema sono: L’utente si identifica, si autentica e fornisce le proprie informazioni di riferimento. Ciò significa che l’utente invia una query al front-end. Il front-end fa la verifica delle credenziali ed invia le query al database non fidato. Il database accede ai dati interagendo solo con il controllore fidato, il front-end che garantisce l’isolamento. Il database restituisce i dati al front-end. Il front-end analizza i dati. Il front-end non fidato si occupa della formattazione e del dialogo con l’utente. Il problema è che si hanno delle informazioni contenute in un database che non è possibile considerare fidato. La soluzione è creare un “cuscinetto” fra l’utente, o l’informazione che viene esposta, e il database, che contiene effettivamente le informazioni. Il front-end quindi si occupa essenzialmente di 2 cose: 1. Gestire l’utente, ammesso che questo non sia gestito da un database privato. 2. Fare in maniera che le query che vengono inviate al database non fidato, che non rispetta i requisiti visti in precedenza, siano opportunamente controllate ed eventualmente filtrate nella risposta, affinché non possano esporre dei dati che non devono essere esposti. In un certo senso si comporta con la stessa logica di un proxy, solo che viene fatto a livello delle query. Filtri commutativi: Un filtro commutativo è un processo che forma un interfaccia tra l’utenza e il database. Il filtro cerca di trarre vantaggio dall’efficienza della maggior parte dei database. DATA MINING Le applicazioni di “data mining” sono applicazioni che fanno ricerche tra i dati. Il data mining impiega statistiche, apprendimento delle macchine, modelli matematici, ricerche di pattern e altre tecniche ancora per estrapolare modelli e relazioni da grandi database. Gli strumenti del data mining comprendono l’associazione, le sequenze, la classificazione, il raggruppamento e la previsione. In genere le query del database sono manuali, invece il data mining è più automatico. Il data mining presenta relazioni probabili, non necessariamente causa-effetto. Il data mining migliora la sicurezza del computer, ed è molto diffuso per analizzare sistemi di dati.