Torna alla pagina di Sistemi Operativi
:: Appunti 2.0 ::
Protezione
Per protezione si intende la messa in sicurezza delle risorse (dette anche oggetti) da parte di accessi non autorizzati di utenti, programmi o processi. Stabilito quest'obiettivo, bisogna distinguere le regole (che tracciano le linee politiche della strategia di protezione ) dai meccanismi (gli strumenti che le applicano) per garantire maggior flessibilità.
Un sistema è normalmente composto sia da risorse fisiche (l'hardware) che informative (i file, le strutture di comunicazione, i programmi), ognuna delle quali è caratterizzata da un nome univoco e da un insieme di operazioni consentite.
I processi dovrebbero poter accedere solo a quelle risorse per cui hanno l'autorizzazione, che andrebbe distribuita secondo il principio di minima conoscenza: un processo deve poter accedere solo alle risorse strettamente necessarie per la propria computazione. In questo modo si riesce a limitare la quantità di danni potenziali dovuti ad un processo malfunzionante.
Per meglio applicare il principio di minima conoscenza ogni processo viene fatto operare in un dominio di protezione, che definisce l'insieme di risorse cui può accedere ed il tipo di operazioni lecite che è autorizzato a compiere. Per ognuno di essi vengono perciò definiti una serie di diritti di accesso, composti da una coppia <nome oggetto, insieme-diritti>
. Notare che i domini non devono essere necessariamente disgiunti, ma possono condividere alcuni dei loro diritti.
L'associazione tra diritto e dominio può essere statica o dinamica. Nel primo caso il set di risorse disponibili per il processo è fissato all'inizio per tutta la durata dell'esecuzione; è semplice da implementare ma spesso assegna più diritti di quanto effettivamente il processo abbia bisogno in un dato momento. Con l'associazione dinamica invece vengono forniti meccanismi per cambiare dominio di protezione, il che meglio applica il principio di minima conoscenza a fronte però di una maggiore complessità.
Un dominio può coincidere con:
Va però ricordato che nei cambi di dominio (switch) la loro struttura rimane inalterata, comprese le operazioni abilitate sulle risorse. Per poter modificare diritti e struttura bisogna averne l'autorità.
Il modello di protezione può essere rappresentato in modo astratto con la matrice di accesso, in cui le righe indicano i domini di protezione e le colonne gli oggetti. In ogni cella vengono invece definiti i diritti d'accesso, ridotti a una lista di operazioni consentite. La decisione del tipo di dominio in cui deve essere incluso un processo spetta generalmente al sistema operativo, mentre è l'utente che decide il contenuto degli elementi nella matrice aggiungendo colonne (quindi creando nuovi oggetti) e impostando alcuni diritti. Notare che la stessa matrice d'accesso può essere considerata come risorsa, dunque si possono impostare diritti d'accesso anche su di essa.
La modifica controllata del contenuto degli elementi della matrice d'accesso è resa possibile da tre operazioni:
copy
e si rappresenta in matrice con un asterisco in coda al diritto d'accesso. Una variante è il trasferimento del diritto (che non è altro che una copia seguita da una cancellazione) e un'altra è la copia con limitazioni alla diffusione (il diritto copiato non può ulteriormente propagarsi)
I diritti di copia e proprietà permettono di evitare il propagarsi dei diritti d'accesso, ma non garantiscono il contenimento delle informazioni, che è considerato un problema irrisolvibile.
La tabella globale è la soluzione più semplice e prevede di rappresentare la matrice come una tabella i cui elementi sono terne ordinate <dominio, oggetto, diritti>
.
Un primo limite di tale soluzione è che la tabella risulterebbe molto grande (spesso con dimensioni maggiori della memoria centrale) e per giunta la maggior parte delle celle sono vuote dato che non sono definiti diritti per ogni coppia dominio-oggetto. Altro limite è che non sono possibili raggruppamenti di oggetti o domini, cosa che consentirebbe una più facile gestione degli stessi.
Le liste di controllo degli accessi sono una memorizzazione per colonne della matrice degli accessi: per ogni oggetto si crea una lista composta da coppie ordinate <dominio, diritti>
. Si può definire anche un insieme di diritti d'accesso predefinito, da controllare prima della lista di controllo degli accessi.
Le liste di capacità dei domini sono una memorizzazione per righe della matrice degli accessi, e consistono in una lista per ogni dominio formata da coppie <oggetto, diritti>
. Gli oggetti sono rappresentati dal loro nome fisico o dal loro indirizzo, e vengono chiamati capacità: il semplice possesso delle capacità autorizza l'accesso.
La lista delle capacità non è direttamente accessibile ma è essa stessa un oggetto protetto. E' gestita dal sistema operativo che concede accessi indiretti ai suoi elementi.
Il meccanismo lock-key (serratura-chiave) è un compromesso tra le due liste viste finora: ogni oggetto ha una lista unica di bit detta lock, mentre ogni dominio ne ha un'altra detta key. Un processo in esecuzione in un dominio può accedere a un oggetto solo se la sua key è in grado di aprire il lock interessato.
Tutto questo meccanismo viene gestito dal sistema operativo.
Le liste di controllo degli accessi possono essere specificate dagli utenti e contengono informazioni globali, ma sono inefficienti su grandi sistemi.
Le liste della capacità dei domini sono invece relative agli oggetti dunque hanno informazioni localizzate e sistemi di revoca poco efficienti.
In un sistema di protezione dinamica può essere necessario revocare i diritti di accesso su oggetti condivisi da più utenti. Tali revoche possono essere:
Con lo schema basato sulla lista degli accessi la revoca è un'operazione semplice e immediata: basta cercare il diritto d'interesse e rimuoverlo. Per la lista delle capacità il meccanismo è invece più complesso poiché le informazioni si trovano distribuite su tutto il sistema e bisogna prima recuperarle. Esistono diverse tecniche che si prepongono questo fine:
I sistemi basati sulle capacità mettono a disposizione un approccio nativo all'uso di risorse basato sulle capacità, offrendo agli utenti meccanismi per definirle e controllarle più efficacemente.
La protezione basata sul linguaggio evita di scaricare tutte le responsabilità di garantire la sicurezza sul sistema operativo prendendosene parte del carico al momento della compilazione del programma applicativo, incorporandola nel linguaggio di programmazione. Permette di conseguenza un controllo più granulare, guadagnando efficienza e flessibilità rispetto alla protezione basata sul kernel (che rimane comunque la più sicura).