# Sicurezza dei sistemi operativi

La sicurezza dei sistemi operativi riveste un ruolo chiave nella nostra società: infatti con la diffusione in tutti gli ambiti dei calcolatori è aumentata la necessità di proteggere la loro integrità. Le grandi aziende in ambito commerciale, finanziario, sociale, sanitario e via dicendo hanno una mole di dati importanti da tenere al sicuro da frodi e concorrenti interessati a tali informazioni.
Nei moderni sistemi operativi, grazie all'implementazione della multiprogrammazione, più utenti possono alternarsi nell'accesso al sistema e nell'utilizzo delle applicazioni. La protezione dei programmi e dei dati di ciascun utente diventa un problema primario di questi sistemi. La protezione deve essere sia verso gli altri utenti locali, che verso utenti remoti, verso programmi malevoli di vario genere e verso eventi inaspettati.

## Protezione
### Oggetti Protetti

Il suo scopo principale è il rafforzamento della protezione degli oggetti del sistema operativo, quali:
* memoria
* periferiche di I/O condivisibili, come i dischi
* periferiche di I/O riutilizzabili in serie, come stampanti e unità nastro
* sottoprocedure e programmi condivisibili
* reti
* dati condivisibili.
La base della protezione è la separazione, vale a dire la capacità di mantenere gli oggetti di un utente separati da quelli di un altro utente, la separazione tra utenti può essere ottenuta in vari modi:
* Separazione fisica: è un tipo di separazione in cui i vari processi utilizzano diversi oggetti fisici, come possono essere stampanti separate, per l'output che richiede diversi livelli di autorizzazione;
* Separazione temporale: è una separazione dove i processi richiedono diversi livelli di protezione e quindi devono essere eseguiti in tempi diversi;
* Separazione logica: è un tipo di separazione che si crea dando all'utente l'illusione che il sistema operi senza altri processi in corso;
* Separazione crittografica: simile alla precedente, ma qui il sistema nasconde appositamente via software i processi in corso rendendoli incomprensibili per il processo che si sta attualmente eseguendo.
Questi sono solo i principali tipi di separazione di processi, ma volendo si possono usare anche tecniche miste, che ne combinano due o più per garantire maggior sicurezza.

### Metodi di protezione dei Sistemi Operativi

Separazione fisica e temporale sono efficaci, ma anche rigide, tantoché possono portare ad un uso poco efficiente delle risorse di sistema; ecco perché è conveniente scaricare gli oneri della protezione al sistema operativo stesso, in modo da consentire l'esecuzione contemporanea di processi aventi esigenze diverse.
Una delle prime cose da fare è quella di separare gli utenti e i loro oggetti, ma in alcuni casi bisogna anche essere in grado di fornire la condivisione per alcuni di questi oggetti. Per esempio, due utenti con livelli di protezione diversi possono voler invocare il medesimo algoritmo di ricerca, o eseguire una chiamata alla stessa funzione, quindi gli utenti devono essere in grado di condividere gli algoritmi e le funzioni senza compromettere la stabilità del sistema. La protezione da parte del sistema operativo può avvenire in vari modi:
* Nessuna protezione: si ha così una condivisione incontrollata, di solito si applica questa soluzione quando le procedure sensibili sono eseguite in istanze separate;
* Isolamento: non si ha alcun tipo di condivisione, in questi casi il sistema operativo fornisce l'isolamento dei processi, ovvero i diversi processi in esecuzione non sono consapevoli della presenza degli altri: ogni processo ha i propri oggetti e file;
* Condividi tutto o non condividi niente: in questo modo il proprietario dell'oggetto in questione lo dichiara pubblico o privato, quando dichiarato pubblico diventa disponibile per tutti gli utenti, invece se dichiarato proprietario è disponibile solo per l'utente che l'ha creato;
* Condivisione mediante controllo degli accessi di soggetti a oggetti: qui il sistema controlla la possibilità offerta a ciascun utente di accedere a un oggetto, questo perché il controllo degli accessi viene implementato per un utente e un oggetto specifico, inoltre un elenco di azioni accettabili guida il sistema operativo che stabilisce se un utente può o meno avere accesso ad un particolare oggetto.
* Condivisione mediante lista delle capacità per soggetto: è un tipo di protezione che estende la condivisione con accesso limitato e permette la creazione e la gestione dinamica dei diritti di condivisione per gli oggetti.
* Condivisione mediante limitazione dell'uso di oggetti: ha lo scopo di limitare gli accessi a un oggetto, ed anche lo stesso utilizzo dell'oggetto dopo l'avvenuto accesso, ad esempio un utente può essere in grado di visualizzare un documento importante ma non di stamparlo.

### Protezione Hardware

Alcuni tipi di protezione possono essere incorporati tramite meccanismi hardware che controllano l'utilizzo efficiente della memoria, questi hanno il vantaggio di garantire una protezione robusta senza costi aggiuntivi. Il problema che la protezione hardware è chiamata a risolvere, è il confinamento delle azioni di ciascun programma alla propria area di memoria. I metodi hardware più usati si basano sulla protezione degli indirizzi e della memoria e sono i seguenti: recinto, riposizionamento, registri di base e di confine, architettura etichettata, segmentazione e paginazione.

#### Recinto

È il modo più semplice per implementare un meccanismo di protezione in memoria, la sua funzione principale è quella di impedire ad un programma malevolo o difettoso di intaccare la parte di memoria dove risiedono i processi del sistema operativo. Il recinto non fa altro che confinare gli utenti all'esterno dell'area di memoria adibita al sistema operativo. Esistono diverse implementazioni del recinto.
In un tipo di implementazione questa prevedeva l'uso di un indirizzo di memoria predefinito, cosicché il sistema operativo risiedeva da una parte mentre l'utente sta in un'altra. Il grande svantaggio di questo tipo di implementazione è il fatto che al sistema sarà sempre assegnata una quantità di spazio di memoria predefinita a causa dell'indirizzamento fisso, che esso la usi o meno.
Un altro tipo di implementazione si basa sull'uso di un registro hardware detto registro recinto, questo registro contiene l'indirizzo di memoria in cui finisce il sistema operativo. Con l'uso del registro per il recinto si elimina lo svantaggio precedente, così la posizione del recinto può essere cambiata dinamicamente.
Poiché il registro protegge solo in una direzione, non è in grado di proteggere un utente dagli eventuali danni arrecati dai processi di un altro utente, ecco perché questo tipo di protezione può essere usata solo per i sistemi operativi monoutente.

#### Riposizionamento

Questa tecnica di protezione è detta anche relocation. Il riposizionamento è il processo che consente di fingere che un processo inizi dall'indirizzo 0 e permette la modifica di tutti gli indirizzi, in modo tale da riflettere l'indirizzo effettivo in cui si trova il programma in memoria. Questa tecnica comporta semplicemente l'aggiunta di un incremento costante ad ogni indirizzo del programma. Il riposizionamento viene di solito usato insieme al registro recinto, poiché quest'ultimo può costituire un dispositivo di riposizionamento hardware. Il contenuto del registro recinto viene sommato all'indirizzo di ogni cella del programma e questo fa in modo di riposizionare l'indirizzo iniziale, così facendo, ci si assicura che nessun processo possa accedere a porzioni di memoria con indirizzi inferiori a quella dell'indirizzo recinto.

#### Registri di base e di confine

Questa tecnica è un'estensione del riposizionamento, e risulta essere molto utile negli ambienti multiutente. In questo tipo di sistemi operativi la macchina non può conoscere a priori in quale parte di memoria sarà caricato il programma che poi dovrà essere eseguito, a questo punto interviene il registro di riposizionamento che risolve il problema fornendo un indirizzo di base, d'ora in poi tutti gli indirizzi all'interno di un programma sono offset rispetto a quell'indirizzo di base. Un registro recinto variabile viene anche detto registro di base. Per conoscere la quantità di spazio allocato e anche utile creare un secondo registro recinto variabile, che a differenza del primo sarà chiamato registro di confine, mentre il primo ha il compito di fornire un confine inferiore il secondo ne delimita uno superiore. Così facendo gli indirizzi di un programma vengono confinati, all'interno dello spazio compreso tra i registri base e di confine. Grazie a questa tecnica è possibile garantire gli indirizzi di un programma dalle modifiche apportate da un altro utente. Quando avviene un cambio utente, il sistema operativo apporta un cambiamento nei contenuti dei registri di base e di confine per riflettere il reale spazio di indirizzamento dell'utente. Il termine commutazione di contesto sta a indicare l'insieme delle operazioni che il sistema deve eseguire per effettuare un cambio utente.

#### Architettura Etichettata

I registri di base e di confine sono già una protezione più che sufficiente, ma forniscono un servizio di condivisione tutto o niente, cioè o un programma permette l'accesso e la modifica a tutti i suoi dati oppure lo nega, in taluni casi però è conveniente proteggere solo alcuni valori e non tutti.
La maniera più semplice che consente una condivisione parziale del contenuto di un programma è lo spostamento, degli indirizzi interessati in uno spazio contiguo, ma questo modo di procedere non è realizzabile quando gli elementi da spostare sono troppi, come il contenuto di un array, grandi record o strutture. L'architettura etichettata rappresenta in queste situazioni un'alternativa, in questa tecnica ogni cella della memoria possiede uno o più bit aggiuntivi, che permettono l'identificazione dei diritti di accesso a quella parola. Questi bit aggiuntivi possono essere impostati solo da particolari istruzioni privilegiate e ogni volta che si accede a tali indirizzi si va a controllare lo stato dei bit aggiunti. Così facendo si possono avere diversi permessi alle varie parti di un programma, ad es. una posizione di memoria può avere dei diritti per l'esecuzione, un'altra può essere accessibile per la sola modifica e così via.
Ormai questa tecnica è sempre più in disuso poiché comporterebbe modifiche radicali a quasi tutto il codice del sistema operativo, alcuni dei pc che usano questo tipo di protezione sono l'Intel I960 e l'IBM System/38.

#### Segmentazione

Si basa sulla suddivisione del programma in parti separate, ogni segmento è un'unità logica (una struttura dati, un sottoprogramma, ecc.). La segmentazione permette la divisione di un programma in segmenti separati, con diritti di accesso differenti. Inoltre i segmenti sono riallocabili e questo permette una gestione più efficiente della memoria. Ogni elemento di codice interno al segmento di memoria è individuabile mediante una coppia di valori: nome e offset, il primo costituisce il nome del segmento che contiene gli elementi, il secondo contiene invece lo scostamento dall'inizio del segmento. Con la segmentazione è anche possibile parlare di virtualizzazione della memoria, essa consiste nel trasferimento in memoria di massa, di segmenti di codice non in uso.

#### Paginazione

La paginazione o paging, rappresenta una valida alternativa alla segmentazione ed è molto usata nei sistemi operativi per realizzare la multiprogrammazione. Con questa tecnica il programma viene diviso in parti uguali chiamate quadri di pagina. Ogni elemento del quadro di pagina così come per la segmentazione viene individuato mediante un indirizzo composto da due parti, pagina e offset. La paginazione è molto simile alla segmentazione, l'unica differenza è che i blocchi in cui viene diviso il programma sono blocchi a dimensione fissa, che di solito è una potenza di 2.

### Meccanismi di protezione
#### Domini di protezione

È necessario definire un modo, per proibire ai processi di accedere a quegli oggetti per cui non sono stati autorizzati. Ma prima di discutere i vari meccanismi di protezione è bene definire il concetto di dominio, per dominio si intende una coppia formata da oggetto e diritto. Un diritto in questo caso è il permesso che l'utente ha di poter eseguire un'azione o meno su di un oggetto, a seconda che esso sia permesso o no dal sistema. Di solito un dominio è associato ad un singolo utente, ma non è sempre così, volendo il concetto di dominio è generalizzabile a più utenti, purché questi facciamo tutti parte dello stesso gruppo.
Un principio essenziale nel creare un dominio è quello del principio dell'autorità minima, detto anche POLA (principle of least authority), questo stabilisce che un dominio è più sicuro quando è stato creato col numero minimo di oggetti e privilegi che gli permettono il normale funzionamento. In ogni momento ciascun processo può potenzialmente essere eseguito in un qualche dominio di protezione, volendo durante l'esecuzione è anche possibile che un processo passi da un dominio all'altro.
Ad esempio in ambiente Unix il dominio di un processo è visto da un UID (ID utente) o da un GID (ID di gruppo). Quando l'utente si connette il sistema carica l'UID o il GID contenuti nella sua voce nel file delle password. Se si hanno a disposizione tutti i domini ovvero tutte le combinazioni di UID e GID è possibile elencare tutti gli oggetti a cui si può accedere e con quali diritti per ognuno di loro. Può anche capitare che esistano due processi con lo stesso dominio ciò significa che entrambi i processi potranno essere visti dal medesimo oggetto e avranno entrambi gli stessi diritti (lettura, scrittura, esecuzione).
Un aspetto importante è come il sistema tiene traccia degli oggetti appartenenti a un determinato dominio, sebbene sia usata raramente è possibile pensare che il sistema elenca in una tabella detta matrice estesa tutti i suoi domini, con i rispettivi diritti per ogni oggetto. Le righe specificano i domini e le colonne gli oggetti, quindi ogni quadrato della tabella elenca i diritti che quell'oggetto ha per quel particolare dominio.

#### Lista Controllo Accessi

Poiché la maggior parte dei domini non ha accesso alla maggior parte degli oggetti, si incontrano alcuni problemi nella creazione della matrice, in quanto memorizzare una matrice che è per la maggior parte vuota è controproducente per il consumo di risorse del sistema. Quindi si usano due approcci diversi, la memorizzazione per righe e quella per colonne. La memorizzazione per colonne è detta Access Control List (ACL), questa tecnica consiste nell'associare ciascun oggetto a una lista (ordinata) contenente tutti i domini a cui è consentito accedervi e delle operazioni lecite. Supponiamo che esistano tre processi: A, B e C e tre file F1, F2 ed F3, per evitare complicazioni si suppone che a ogni dominio corrisponde un utente, quindi abbiamo tre utenti che sono A, B e C. Per ogni file viene quindi creata una ACL, non è detto che questa al suo interno faccia riferimento a un solo utente, ad esempio il file F1 può avere benissimo due voci che si riferiscono agli utenti B e C con diritti di accesso differenti. Qualsiasi accesso al file da parte di utenti che non sono inclusi nella sua ACL viene automaticamente negato dal sistema. Infine è da notare che i diritti di accesso non sono assegnati al processo, bensì ai singoli utenti. Fino ad ora abbiamo supposto che ad ogni processo fosse assegnato un singolo utente UID, ma volendo è possibile anche introdurre gruppi di utenti GID. Ogni qual volta viene fatta una richiesta di accesso ad un oggetto, si controlla se nell'ACL è presente l'UID o il GID del chiamante, se questo è presente si permette l'accesso, altrimenti lo si nega. Con l'ACL è possibile introdurre il concetto di wildcard, per esempio se un utente fa parte di più gruppi avrà accesso a tutti i suoi oggetti, indipendentemente dal gruppo con cui l'utente è connesso, questo tipo di approccio però ha lo svantaggio di creare un ambiente poco circoscritto. Infine nel caso in cui si voglia revocare o modificare l'accesso a un file, da parte di un utente o gruppo, basta modificare la lista controllo accessi relativa a quel file.

#### Capability

Un altro modo per trattare la matrice estesa è memorizzarne gli elementi per riga, così facendo a ogni processo è associato un elenco di oggetti a cui si può accedere rispettando i diritti di acceso che sono memorizzati nel dominio. Questo modo di vedere la matrice è detto lista delle capability o semplicemente C-list, invece i singoli elementi che fanno parte del dominio sono detti capability.
Ad ogni soggetto è associata una lista che contiene gli oggetti accessibili dallo stesso e i suoi relativi diritti di accesso. Ogni capability garantisce al proprietario determinati diritti di accesso su alcuni oggetti presenti nel suo dominio. Volendo si può fare in modo che le liste delle capability per ogni proprietario siano esse stesse degli oggetti e come tali possono essere puntate da altre liste di capability.
Naturalmente si deve evitare la manomissione delle liste e la loro protezione può essere implementata secondo tre modalità diverse. La prima richiede l'utilizzo di un'architettura etichettata che è stata trattata precedentemente e consiste in una riprogettazione hardware della memoria, dove ogni cella ha un bit extra che indica se la parola puntata contiene o meno una capability. Un altro metodo si basa sul tenere traccia delle C-list all'interno del sistema operativo. Per fare riferimento alle capability si specifica ogni volta la loro posizione nella lista capability.
Infine l'ultimo metodo consiste nel criptare la C-list e tenerla all'interno dello spazio utente. Quando un processo cliente manda il segnale di accesso al computer remoto, il server crea l'oggetto e genera un numero lungo casuale detto campo di controllo che viene associato all'oggetto stesso. Il campo di controllo non viene mai rimandato all'utente in maniera così trasparente, quello che l'utente riceve è la capability, questa contiene l'ID del server, il numero dell'oggetto per cui si tenta l'accesso e i suoi diritti, infine nelle capability c'è un ultimo campo composto dalla concatenazione dell'oggetto, dei diritti e del campo di controllo, tramite una funzione monodirezionale di sicurezza criptografica. Se l'utente vuole accedere all'oggetto deve passare al server la capability, da questa ne estrae il numero dell'oggetto, dopodiché estrae l'ultimo campo e lo decripta, solo se il campo decriptato di quell'oggetto corrisponde a quello che il server ha memorizzato nella sua capability si permette l'accesso.
Tuttavia questa implementazione non permette una cancellazione selettiva delle capability, ma a differenza dell'ACL non serve nessun controllo all'accesso, infatti con le ACL potrebbe rendersi necessaria anche una lunga ricerca all'interno della lista di controllo accessi.

#### Sicurezza Multilivello

Questa sicurezza viene implementata in ambiti particolari, dove è necessario un controllo obbligatorio degli accessi, per assicurare che le politiche di sicurezza siano garantite dal sistema, l'ente definisce delle regole in merito a chi può accedere a che cosa e queste regole non possono essere modificate dai singoli utenti. I modelli di sicurezza multilivello più usati sono due: il modello Bell-La Padula e il modello Biba.

##### Modello Bell-La Padula

Questo è il modello più usato, inizialmente fu progettato per scopi militari, ma successivamente ha trovato applicazioni anche in altri ambiti. Data una gerarchia con diversi livelli di sicurezza, questo modello fa sì che i processi possano leggere solo verso il basso della gerarchia e scrivere verso l'alto e mai il viceversa. Il modello Bell-La padula ha delle regole ferree su come le informazioni possono circolare, queste sono principalmente due:
* Proprietà di sicurezza semplice: stabilisce che un processo eseguito al livello k di sicurezza può leggere solo oggetti del suo livello o di livelli inferiori;
* Proprietà *: questa regola impone che un processo eseguito a un livello di sicurezza può scrivere solo oggetti al suo livello o a un livello superiore.
Si può dimostrare che se il sistema applica rigorosamente queste due proprietà, nessuna informazione riesce a fuoriuscire da un livello superiore verso uno inferiore, ma naturalmente il suo comportamento deve essere garantito dal sistema operativo. Un modo con cui il sistema operativo può garantire il suo corretto funzionamento è assegnando ad ogni utente un livello di sicurezza e una volta che quest'ultimo si è connesso, la shell ne acquisisce i diritti e li eredita a tutti i suoi figli. Così facendo nel caso in cui un processo in esecuzione al livello k tenta di accedere ad oggetti con un livello superiore il sistema deve negare la richiesta. Il modello Bell-La Padula non è stato fatto per garantire l'integrità dei dati, ma per mantenere i segreti, ovvero evitare che le informazioni presenti in un livello alto della gerarchia possano essere lette a livelli inferiori.

##### Modello Biba

Il modello Biba è stato pensato per l'esatto opposto del modello Bell-La Padula ovvero garantire l'integrità dei dati, per far questo servono altre proprietà, in particolare due, che sono l'esatto opposto di quelle precedenti:
* Principio di integrità semplice: un processo assegnato a un livello di sicurezza k può scrivere solo oggetti al proprio livello o a livelli inferiori;
* Principio di integrità *: un processo che viene eseguito a un livello di sicurezza k può leggere solo oggetti con un livello di sicurezza pari o superiore al suo.
Ottenere su una macchina entrambi i modelli Bell-La Padula e Biba è davvero difficile, poiché le proprietà che ha un modello sono l'opposto dell'altro.

## Autenticazione

L'identità dell'utente che possiamo pensarla come una combinazione tra permessi e privilegi, viene spesso determinata da un login che utilizza una parola d'ordine . I principali metodi di autenticazione sono:
* Attraverso qualcosa che l'utente conosce (Autenticazione classica con password);
* Attraverso qualcosa che l'utente possiede (Autenticazione tramite oggetto posseduto);
* Attraverso qualche caratteristica dell'utente (Autenticazione tramite tecniche biometriche);

### Autenticazione Classica con password

Questo meccanismo è basato su un file di parole d'ordine, che contiene la lista delle password di accesso al sistema, le password al suo interno sono solitamente cifrate con algoritmi quali LM hash o DES . Quando un utente inserisce una parola d'ordine, il sistema si occupa di confrontarla con quelle contenute nel file delle password e se riscontra una password uguale l'utente può avere accesso al sistema, altrimenti no. Solitamente al momento del login in sistemi operativi unix non vengono visualizzati i caratteri, mentre in sistemi windows si utilizzano caratteri particolari per mascherare la visualizzazione, e in caso di esito negativo danno un numero limitato di informazioni.

### Autenticazione Challenge-response

Una variante all'uso delle password è l'utilizzo dell'autenticazione challenge-response. L'utente quando si autentica prende un algoritmo ad esempio x². Al momento del login il server invia all'utente un parametro per esempio 5 e in quel caso l'utente digita 25, l'algoritmo è soggetto a cambiamenti col passare del tempo. Se il dispositivo dell'utente può elaborare dati come un computer, una smart-card o un telefono cellulare, si può usare una forma challenge-response più potente dove l'utente seleziona in anticipo una chiave segreta che è presente sia sul server, sia come copia (criptata) nel computer dell'utente. Al momento del login il server invia un numero casuale alla macchina dell'utente, il quale elaborata la funzione lo rimanda indietro. Il vantaggio più significativo del challenge-response è che anche se qualcuno intercettasse il traffico fra client e server non ricaverebbe nulla di utile per il prossimo login.

### Autenticazione tramite oggetto posseduto

Diversi sistemi o servizi consentono di effettuare l'accesso attraverso l'utilizzo di una scheda o tessera con l'immissione del rispettivo codice (per evitare i casi di furto dell'oggetto). Distinguiamo due tipologie di schede:
* Schede Magnetiche: dove l'informazione digitale (circa 140 byte) è contenuta su un nastro magnetico incollato sul retro della tessera;
* Chip Card: che invece contengono un circuito integrato, si possono infatti considerare dei piccoli computer poiché sono dotati di una CPU, memoria RAM, ROM, EEPROM e un canale di comunicazione, e sono in grado di dialogare tramite un apposito protocollo con altri computer..

### Autenticazione tramite tecniche biometriche

Una variante all'uso delle parole d'ordine per l'autenticazione è quella di utilizzare tecniche biometriche, utilizzate spesso per preservare l'accesso ad ambienti come centri di elaborazione dati. Quando parliamo di tecniche biometriche dobbiamo fare una distinzione tra:
* Caratteristiche biometriche fisiologiche o anatomiche: che si basano su caratteristiche fisiche dell'utente quali forma della mano, impronta digitale, la retina, l'iride e i tratti somatici del volto. Tra queste rientra anche l'analisi del DNA, ma che a causa della complessità intrinseca, dell'impossibilità di operare in tempo reale e dalla legge al riguardo, non è inclusa tra le tecniche biometriche di riconoscimento;
* Caratteristiche biometriche comportamentali: basate su dati che riguardano i comportamenti dei diversi utenti quali riconoscimento vocale, andatura o il modo in cui depone la firma;
Per far sì che il sistema non incorra in errore la caratteristica da memorizzare deve essere abbastanza singolare. Ad esempio un parametro poco efficiente è quello di memorizzare il colore dei capelli poiché troppe persone hanno lo stesso colore, analogamente anche il timbro della voce può mutare a causa di un raffreddore o altro così come un viso può cambiare per i segni dell'età, la presenza di barba o un trucco differente. Spetta ai progettisti decidere quale caratteristica immagazzinare nel database. La tecnica della rilevazione dell'impronta digitale è la tecnica più consolidata, i primi sistemi furono sviluppati nel 1950 dall'FBI. Essa consta essenzialmente di alcuni passi:
* Riconoscimento dell'immagine completa dell'impronta.
* Riconoscimento dei particolari chiamate anche caratteristiche di Galton.
* Fase di confronto dell'impronta letta, con quelle presenti nel database.
Di particolare interesse è il sistema eurodac basato su un archivio centralizzato di impronte digitali. Gli strumenti più frequentemente utilizzati sono ad esempio rilevatori dell'impronta del dito e dell'intera mano. Questi lettori confrontano i parametri memorizzati nei loro archivi, con quelli rilevati. I parametri contengono solitamente una mappa della temperatura, la lunghezza o larghezza delle dita e le linee presenti nella mano. Un altro sistema biometrico diffuso è il riconoscimento dell'iride. Non esistono due individui che l'abbiano uguale quindi può considerarsi efficiente come quello delle impronte digitali, tra l'altro dal punto di vista della singolarità l'iride ha un numero di caratteristiche sei volte più alto di quello delle impronte digitali. Questo sistema funziona nel modo seguente:
* Un utente guarda verso una macchina fotografica che fotografa l'occhio del soggetto ed estrae alcune caratteristiche eseguendo la trasformazione wavelet di Gabor e comprimendo il risultato in stringa binaria. Questa stringa verrà successivamente confrontata con il valore ottenuto al momento dell'iscrizione, se la distanza di Hamming è al di sotto della soglia critica allora l'utente avrà accesso al sistema, viceversa no.

### Autenticazione Multifattoriale

Questi metodi di autenticazione sopra citati possono essere utilizzati insieme, portando risultati migliori. Questa tecnica è chiamata autenticazione multifattoriale, un esempio di tale metodo è un sistema di autenticazione che utilizzi il collegamento di un dispositivo USB per accedere al sistema, l'inserimento di un Codice PIN e la lettura di impronte digitali. Anche se non può garantire la sicurezza dell'identità poiché le sessioni possono essere sfruttate da intrusi, l'autenticazione multifattoriale è utilizzata per raggiungere un grado di sicurezza, nettamente superiore all'utilizzo singolare delle tecniche di autenticazione.

## Sistemi operativi Trusted

La progettazione di sistemi operativi è già di per sé complessa e l'aggiunta al sistema della responsabilità di protezione ne aumenta notevolmente la complessità. Tuttavia è stato appurato che è meglio progettare la protezione all'inizio, che introdurla a fine progetto. La sicurezza è una parte essenziale di un progetto iniziale di un sistema operativo trusted. La protezione deve essere considerata in ogni aspetto della progettazione e deve esistere un'associazione chiara dei requisiti di protezione alla struttura, in modo tale che tutti gli sviluppatori possano comprenderla. Inoltre, dopo la progettazione di una sezione del sistema operativo, è necessario controllare che il grado di protezione che la sezione dovrebbe imporre sia stato progettato correttamente. Esistono diversi principi di progettazione essenziali al fine di una corretta realizzazione di un sistema operativo trusted, fra questi si ricordano:
* Principio del privilegio minimo: ogni utente deve operare utilizzando privilegi minimi, in modo che il danno provocato da un attacco involontario o maligno viene ridotto;
* Economia del privilegio: la struttura del sistema protezione deve essere semplice, così da permettere un'attenta analisi e un efficiente collaudo;
* Struttura aperta: il meccanismo di protezione deve essere pubblico e basato sulla segretezza di pochi elementi chiave, così da permettere l'analisi pubblica e fornire una conferma indipendente della sicurezza del sistema stesso;
* Mediazione completa: ogni tentativo di accesso deve essere controllato;
* Basato su autorizzazione: la condizione predefinita deve essere la negazione di accesso e il progettista deve identificare solo gli elementi che dovrebbero essere accessibili;
* Separazione dei privilegi: l'accesso agli oggetti deve dipendere da più di una condizione;
* Minimo meccanismo comune: i sistemi devono utilizzare la separazione fisica o logica degli oggetti in modo da ridurre il rischio della condivisione;
* Facilità di utilizzo: un meccanismo di protezione facile da utilizzare è più difficile da essere ignorato.
Ogni sistema operativo trusted utilizza particolari funzioni che riguardano la sicurezza del computer. Ad esempio un sistema operativo si occupa dell'autenticazione degli utenti, della protezione della memoria, dell'allocazione e del controllo degli accessi agli oggetti generici e alle periferiche di I/O, della sincronizzazione e della comunicazione tra processi e della protezione dei dati di protezione del sistema. A differenza dei sistemi operativi normali, la progettazione di un sistema trusted coinvolge la selezione di un insieme appropriato e coerente di funzionalità insieme ad un grado di fiducia appropriato, relativo al fatto che le funzionalità siano state assemblate e implementate correttamente. Inoltre in un sistema operativo trusted gli oggetti sono accompagnati e circondati da un meccanismo di controllo degli accessi, che offre una protezione maggiore rispetto a quella dei sistemi operativi convenzionali. La memoria risulta essere separata dagli utenti, mentre le librerie dei programmi e i dati controllano la condivisione e la separazione. I difetti tipici di un sistema operativo riguardano essenzialmente quattro campi:
* L'elaborazione dell'I/O: costituisce la più grande fonte di vulnerabilità del sistema;
* Ambiguità nella policy di accesso: da una parte è opportuno separare gli utenti e proteggere le loro singole risorse, dall'altra, gli utenti richiedono accesso condiviso a librerie e dati comuni. La distinzione tra l'isolamento e la condivisione, però, non è sempre chiara a livello di policy;
* La mediazione completa: in teoria la struttura di un sistema operativo deve controllare la disponibilità dell'autorizzazione ad ogni accesso richiesto, ma la maggior parte dei sistemi esegue il controllo una sola volta;
* La generalità: diffusa specialmente nei sistemi operativi commerciali. Infatti l'installazione di pacchetti software, scritti da alcune società, opera con gli stessi privilegi di accesso del sistema operativo. A volte però insieme a questi pacchetti possono essere installati anche trapdoor che qualsiasi utente può sfruttare per penetrare nel sistema.
A fronte di queste potenziali vulnerabilità del sistema, è possibile applicare alcune tecniche di garanzia per attenuarle o eliminarne gli effetti. Sicuramente le principali tecniche di garanzia sono tre: il collaudo, la verifica e la convalida. Alcuni esempi di sistemi operativi trusted:
* Unix:
Nel sistema operativo Unix un dominio è associato all'utente, quindi il cambio del dominio corrisponde al cambio temporaneo dell'identificatore dell'utente. Questo cambio avviene tramite file system e ad ogni file sono associati un identificatore di proprietario e un bit di dominio (detto setuid bit). Tale meccanismo è utilizzato in quasi tutti i sistemi, dato che rende possibile a tutti gli utenti una funzione che richiede diversi privilegi. Il problema che si pone con questo metodo è che se un utente riesce a creare un file con identificatore root e il setuid bit posto a on, può assumere l'identità di root e fare qualsiasi operazione sul sistema. Proprio per questo motivo in altri sistemi operativi si utilizza un metodo alternativo che prevede l'inserimento dei programmi privilegiati in una directory speciale. In questo caso il sistema operativo è progettato in modo da cambiare, al momento dell'esecuzione, l'identificatore dell'utente di ogni programma residente in questa directory, rendendola equivalente a root o all'identificatore dell'utente del proprietario della directory.
* Windows XP:
Microsoft Windows XP è un sistema operativo progettato per disporre di una varietà di caratteristiche e metodi di sicurezza. Il modello di sicurezza si basa sulla nozione di utente accreditato del sistema. Esso infatti permette la creazione di un numero arbitrario di utenti del sistema. L'accesso agli oggetti del sistema si può poi consentire o negare secondo i modi desiderati. Il sistema identifica gli utenti per mezzo di un identificatore di sicurezza unico. Infatti quando un utente accede al sistema, si crea un contrassegno d'accesso di sicurezza, che include l'identificatore di sicurezza dell'utente, gli identificatori di sicurezza per tutti i gruppi dei quali l'utente è membro e una lista di tutti i permessi speciali di cui gode. L'autenticazione, di solito, avviene rispetto a un nome utente e a una parola d'ordine, anche se la struttura del sistema Windows XP permette lo sviluppo di mezzi di autenticazione specifici, come l'analizzatore elettronico dell'impronta della retina. Il sistema Windows XP usa l'idea del soggetto per far sì che i programmi eseguiti per conto di un utente non ottengano modi d'accesso al sistema meno restrittivi di quelli dell'utente stesso. Un soggetto si usa per identificare e gestire i permessi relativi a ogni programma eseguito per conto di un utente, ed è composto dal contrassegno d'accesso e dal modello client-server, per controllare gli accessi si usano due classi di soggetti. Il sistema Windows XP è dotato di un sistema di verifica e permette il controllo di molte comuni minacce per la sicurezza del sistema. Gli attributi di sicurezza di un oggetto del sistema Windows XP sono descritti da un descrittore di sicurezza, contenente l'identificatore di sicurezza del proprietario dell'oggetto, una lista di controllo discrezionale degli accessi che stabilisce quali utenti o gruppi abbiano o non abbiano possibilità d'accesso e una lista di sistema di controllo degli accessi che controlla quali messaggi di verifica saranno generati. Una lista di controllo degli accessi contiene elementi composti dell'identificatore di sicurezza dell'individuo e della maschera d'accesso che definisce tutte le azioni permesse sull'oggetto insieme con un valore convenzionale d'accesso consentito o d'accesso negato per ogni azione. Inoltre questo sistema operativo classifica gli oggetti come contenitori e non contenitori. Gli oggetti contenitori possono contenere in senso logico altri oggetti. Quando si crea un oggetto all'interno di un oggetto contenitore, il nuovo oggetto eredita i permessi dell'oggetto genitore. Gli oggetti non contenitori non ereditano nessun altro permesso. Un punto di forza del sistema Windows XP è la disponibilità di strumenti che aiutano a fornire un ambiente informatico sicuro.