La Protezione:
Riguarda lâinsieme di attivitĂ che si preoccupano di garantire il controllo dellâaccesso alle risorse logiche e fisiche da parte degli utenti allâinterno di un sistema di calcolo
La Sicurezza:
Garantisce lâautenticazione degli utenti, impedendo accessi non autorizzati al sistema e tentativi dolosi di alterazione/distruzione dei dati
Il livello di controllo degli accessi della protezione è suddivisibile in tre concetti:
Un modello di protezione definisce:
UNIX un soggetto è rappresentato da una tripla di interi S = <UID, GID, PID>Possiamo rappresentare un soggetto come la coppia (processo, dominio), dove per dominio intendiamo:
Lâambiente di protezione nel quale il soggetto sta eseguendo, ovvero lâinsieme di diritti di accesso posseduti dal processo
I domini di protezione sono unici per ogni soggetto, mentre un processo può cambiare il dominio associato durante la sua esecuzione.
Il soggetto $S_i$ può rappresentare il processo $P$ mentre esegue in un dominio di protezione, e il soggetto $S_j$ rappresenta lo stesso processo mentre esegue un altro dominio.
Un esempio semplice di questo è il cambio di livello di esecuzione dovuto alle system-call, che cambiano i diritti del processo mantenendone però il PID.
Definiscono le regole con le quali i soggetti possono accedere agli oggetti.
Le politiche piĂš famose e diffuse sono:
DAC: Il creatore di un oggetto ha pieno controllo sui diritti di accesso per quellâoggetto. Ă quella utilizzata da UNIXMAC: I diritti di accesso vengono gestiti centralmente. Ă una politica utilizzata in installazioni di alta sicurezza come negli enti governativiRBAC: I diritti di accesso sulle risorse sono associati a determinati ruoli. Un utente può appartenere a diversi ruoliUna caratteristica comune delle politiche di protezione è quella del principio del privilegio minimo:
Ad un soggetto sono garantiti i diritti di accesso solo agli oggetti strettamente necessari per la sua esecuzione.
Sono gli strumenti messi a disposizione dal sistema di protezione e per imporre una determinata politica.
La politica definisce cosa va fatto mentre il meccanismo come va fatto.
I meccanismi di protezione devono essere sufficientemente generali per consentire lâapplicazione di diverse politiche di protezione.
Un dominio definisce un insieme di oggetti e i diritti di accesso a tali oggetti, ovvero i tipi di operazioni che si possono eseguire su ciascuno:
<oggetto, insieme diritti di accesso>
PiĂš domini possono essere tra di loro disgiunti o condividere uno o piĂš diritti di accesso.
Un soggetto può quindi accedere solo agli oggetti definiti nel dominio al quale è associato.
Lâassociazione può essere di due tipi:
In UNIX:
UID,GIDS = <PID, UID, GID>Per cambiare dominio (passare da system a user e viceversa) si possono utilizzare due metodi:
IDT tramite le system call, (sfruttando le interruzioni).exec in programmi con SUID = 1Un sistema di protezione può essere rappresentato utilizzando il modello della matrice degli accessi.
Questo modello mantiene le informazioni che specificano il tipo di accesso che i soggetti hanno per gli oggetti allâinterno di una struttura tabellare. Ciò consente di rappresentare lo stato di protezione garantendo il rispetto dei vincoli.
Il meccanismo associato a questa struttura ha il compito di verificare se le richieste di accesso di un processo che opera in un certo dominio sono consentite oppure no.
Il numero di oggetti e dei soggetti allâinterno della matrice è dinamicamente modificabile, permettendo ai processi di cambiare dominio anche durante lâesecuzione.
Possiamo quindi modificare in modo controllato il cambiamento dello stato di protezione, attraverso vere e proprie transizioni di stato.
Un esempio di matrice degli accessi può essere il seguente, dove $D_i$ sono i domini e $O_i$ sono gli oggetti:
| Â | $O_1$ | $O_2$ | $O_3$ | $D_1$ | $D_2$ | $D_3$ |
|---|---|---|---|---|---|---|
| $D_1$ | read* |
read |
execute |
 | terminate |
receive |
| $D_2$ | Â | owner write |
 | control receive |
 | terminate |
| $D_3$ | write execute |
 | read |
send |
send receive |
 |
Il meccanismo verificherĂ quindi che il processo nel dominio $D_i$ possa accedere solo agli oggetti specificati nella riga $i$.. Quando nel dominio $D_i$ un operazione $M$ deve essere eseguita su un oggetto $O_j$, il meccanismo controlla che $M$ sia tra le operazioni contentenute nellâelemento $(i, j)$ della tabella.
La politica del Discretional Access Control (DAC) permette agli utenti di decidere il contenuto degli elementi della matrice.
In particolare, alla creazione di un nuovo oggetto $O$, questo sarĂ aggiunto alle colonne della tabella, e lâutente owner stabilirĂ come settare le intersezioni con le righe della tabella.
Sono consentite anche le modifiche ai diritti di accesso, attraverso un opportuno insieme di comandi.
Questi comandi sono stati stabiliti dai ricercatori Graham e Denning, e si dividono in due tipi:
La propagazione è subordinata alla seguente definizione:
Un soggetto $S_i$ può propagare un diritto di accesso $\alpha$ per un oggetto $X$ ad un altro soggetto $S_j$ se e solo se $S_i$ ha accesso a $X$ e $\alpha$ ha il copy flag.
Il copy flag * determina quindi la possibilitĂ di âcopiareâ un diritto di accesso da un dominio ad un altro.
Ă stato dimostrato che le regole definite da Graham e Denning danno luogo ad un sistema di protezione in grado di risolvere problemi come:
Possiamo vedere la matrice per accessi come una serie di righe (Capability List) o di colonne (Access Control List).
La memorizzazione per colonne prende il nome di Access Control List (ACL), ed è quella utilizzata nei sistemi UNIX. In questo modo ad ogni oggetto è associata una lista che contiene tutti i soggetti che possono accedevi e i relativi diritti di accesso.
Il numero di ACL da salvare nel sistema sarĂ identico al numero di oggetti presenti. PoichĂŠ in UNIX gli oggetti sono file, le singole ACL sono conservate allâinterno del descrittore del file, sottoforma dei 9 bit di protezione:
3 bit rappresentano i diritti di un singolo soggetto, lâowner.3 bit rappresentano i diritti dei soggetti che sono nel gruppo del proprietario.3 bit stabiliscono i diritti per tutti gli altri soggetti.Un elemento della ACL assume la forma: UID, GID: <diritti>.
Subentra quindi il concetto di ruolo in quanto uno stesso utente può appartenere a gruppi diversi, avendo quindi diritti diversi sullo stesso oggetto. Per evitare conflitti tra regole diverse è quindi necessario specificare un gruppo di appartenenza quando lâutente vuole accede, al fine di evitare conflitti tra regole diverse.
Le entrate della ACL possono anche assumere forme piĂš generali attraverso lâutilizzo del carattere *:
*, GID: <diritti>: la regola è valida per qualsiasi utente che appartiene al gruppo.UID, *: <diritti>: la regola è valida ad hoc per un utente indipendentemente dal gruppo*,* : <diritti>: la regola è valida come base per chiunque non rispetti una delle altre regoleLa memorizzazione per righe si dice invece Capability List (CL), e associa ad ogni soggetto una lista che contiene gli oggetti da lui accessibili i relativi diritti di accesso.
A differenza delle ACL, questa tecnica permette di avere un unica struttura dati sulla quale effettuare le ricerche da parte di un processo. I meccanismi di protezione che si basano su questa struttura sono quindi molto piĂš efficaci, in quanto non è piĂš necessario scorrere lâACL dopo averla trovata per effettuare un check sui diritti del processo.
Nasce però un altro problema, ovvero quello di dove salvare le CL. I soggetti, a differenza degli oggetti, cambiano dinamicamente e frequentemente, rendendo piĂš complesso il salvataggio e la gestione della CL allâinterno del sistema, andando a compensare il guadagno che ottenevamo sulla verifica a runtime.
Ipotizziamo infatti che volessimo cambiare i diritti di accesso ad un sottoinsieme dei soggetti per un dato oggetto $O$. Mentre nellâACL ci basta accedere allâoggetto stesso e agire in maniera sequenziale, nel caso della CL sarĂ necessario aggiornare tutte le singole liste sul sistema, introducendo un enorme overhead.
UNIXIn UNIX, oltre ad avere i bit di protezione, si mette in atto un altro meccanismo.
Quando un processo PID apre un file tramite una open, specificando un azione, il sistema operativo verifica:
La verifica di queste condizioni accade per step:
open controlla se UID del processo corrisponde con quello dellâowner dellâoggetto. Se il soggetto è owner controlla i diritti di owner per verificare se lâoperazione è consentita o menoGID corrisponde con quello dellâgroup dellâoggetto. Se corrispondono allora effettuerĂ il controllo di protezione sui diritti del group ownerSolamente quando si ha esito positivo su questi controlli, verrĂ inserito un nuovo file descriptor fd nella Tabella dei File Aperti di Processo, che punterĂ alla tabella dei file aperti di sistema. La tabella dei file aperti di processo agisce a tutti gli effetti come una CL dinamica del processo.
A livello statico quindi UNIX salva la matrice per ACL, ma quando un processo esegue si costruisce dinamicamente la propria CL, per avere i vantaggi di entrambe le soluzioni.
La maggior parte dei sistemi operativi permette ai singoli utenti di determinare chi possa leggere e scrivere i loro file e i loro oggetti, secondo il Controllo Discrezionale degli Accessi, o DAC.
In alcuni ambienti è però richiesta una sicurezza piĂš rigorosa e controllata (ospedali, aziende, ambienti militari, âŚ).
In questo caso sono stabilite delle regole su chi può vedere cosa, modificabili solo da chi possiede permessi speciali. Questa tecnica ha il nome di Controllo degli Accessi Obbligatorio, o MAC.
Un ulteriore criterio di sicurezza può essere quello di avere diversi livelli di protezione, ognuno con criteri di accesso diversi. Questo modello si chiama Modello Bell-La Padula, progettato per gestire la sicurezza in ambiente militare.
Il Modello Bell-La Padula stabilisce 4 livelli di sicurezza:
I livelli di sicurezza si applicano sia agli oggetti $O$ che ai soggetti $S$.
Il modello definisce una funzione $SC(\cdot)$ che rappresenta il livello di sicurezza di un entitĂ , e la utilizza come criterio per stabilire come le informaizoni possono circolare.
Le regole che sfruttano la funzione:
Per chiarire come opera il modello prendiamo la seguente tabella:
| Â | $O_1$ (file riservato) | $O_2$ (trojan-horse) | $O_3$ (file di appoggio) |
|---|---|---|---|
| $S_1$ | ownerreadwrite |
execute |
write |
| $S_2$ | Â | ownerexecute |
ownerreadwrite |
Ipotizziamo che $O_2$ abbia accesso alle seguenti istruzioni:
Se $O_2$ venisse eseguito da $S_2$ queso non potrebbe accedere in nessun modo ad $O_1$, in quanto $S_2$ non possiede alcun diritto sullâoggetto.
Se $O_2$ venisse invece eseguito da $S_2$, questo opererĂ con i diritti di $S_2$ potendo:
Facendo cosÏ $S_2$ è in grado di leggere indirettamente il contenuto di $O_1$, attraverso la copia in $O_3$, effettuata da $O_2$ per conto di $S_1$.
Sfruttando invece la classificazione Bell-La Padula possiamo classificare come Pubblico $(P)$ e Privato $(R)$ i soggetti e gli oggetti:
Se adesso $O_2$ venisse eseguito da $S_1$:
Ă importante sottolineare che il modello Bell-La Padula è stato concepito per __mantenere segreti i dati_ e non per garantirne lâintegritĂ .
Esiste infatti un altro modello, detto BiBa, che si preoccupa di garantire lâintegritĂ dei dati. Questo modello di fatto inverte le regole del modello Bell-La Padula:
Ovviemente i due modelli, BiBa e Bell-La Padula, non sono compatibili e non possono essere realizzati contemporaneamente.