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