In questo parte della guida ai Sistemi Operativi, parleremo di protezione e sicurezza dei file, dei processi e del sistema stesso.
Prima di poter parlare però di Sicurezza, dobbiamo conoscere gli obbiettivi che si pone:[fancy_list style=”check_list”]
- Integrità: Solo chi è autorizzato deve poter modificare i dati e le attività del computer.
- Confidenzialità: Solo chi è autorizzato deve poter accedere in lettura ai dati del computer.
- Autenticità: Il sistema operativo deve avere la capacità di autenticare l’utente.
- Accessibilità: I vari componenti devono essere accessibili solo agli autenti autorizzati.
[/fancy_list]Ognuno di questi obbiettivi, ha una controparte di tipologia di attacco:
- Modifica (Attacco all’ Integrità): Qualcuno non autorizzato riesce ad accedere al sistema e modifica dei dati.
- Intercettazione (Attacco all’ Confidenzialità): Un’ entità non autorizzata ottiene accesso ad una parte del sistema (es: sniffing dei pacchetti trasmessi).
- Fabbricazione(Attacco all’ Autenticità): Un’ entità non autorizzata inserisce oggetti nel sistema.
- Interruzione (Attacco all’ Accessibilità): Parte del sistema viene distrutta o resa inutilizzabile.
Gli attacchi poi possono essere suddivisi in base alla risorsa di sistema che vanno ad attaccare:
- Hardware: La principale minaccia è di tipo Accessibilità (quando tua madre da piccolo ti toglieva il computer). Sono compresi danneggiamenti all’ hardware.
- Software: Il sistema operativo, le utility e le applicazioni. La principale minaccia è l’ accessibilità, causata per esempio da virus.
- Dati: Si intendono qui i files e le altre forme di dati controllate da utenti, gruppi e aziende.
- Linee di comunicazione e Reti.
L’ attacco alle linee di comunicazione, può essere suddiviso in:
- Attacchi Passivi: Difficili da intercettare ma possono essere prevenuti. Lo scopo è prelevare informazioni senza modificare nulla. E’ possibile prevenire utilizzando il cripting dei dati.
- Attacchi attivi: Difficili da prevenire ma facili da intercettare. Si basano sulla modifica o la creazione di un flusso di dati.Possiamo suddividerlo a loro volta in:
- Mascheramenti: Quando una entità si finge un’altra (Man In The Middle).
- Replicazione: Cattura passiva dei dati e la loro replicazione nella trasmissione con effetti collaterali.
- Modifica di messaggi: Modifica una parte di un messaggio o del messaggio completo.
- Interruzione dei servizi: Inibizione di una gestione delle funzionalità di una linea di comunicazione.
Protezione
Grazie alla multiprogrammazione è possibile condividere risorse con gli altri utenti. La condivisione riguarda:
- Il processore,
- La memoria,
- Dispositivi di Input Oputput,
- Programmi,
- Dati.
Visto che c’è la condivisione di risorse, c’è bisogno anche di proteggerle:
- Nessuna protezione: Ha senso nel caso in cui le procedure sensibili sono eseguite in intervalli di tempo diversi.
- Isolamento totale: Ogni processo opera in modo del tutto separato dagli altri, con nessuna condivisione o comunicazione.
- Condividi tutto o niente: Un oggetto deve essere o pubblico, cioè accessibile da tutti; o privato, cioè accessibile solo al proprietario.
- Condivisioni con limitazioni di accesso: il SO controlla i permessi di ogni accesso di uno specifico utente ad uno specifico oggetto.
- Condivisione con diritti dinamici: è permessa la creazione dinamica di diritti di accesso agli oggetti.
- Uso limitato di un oggetto: Non solo si limita l’accesso, ma si discrimina anche il tipo di accesso. ES: un utente può solo leggere, uno leggere e modificare ecc.
Fortunatamente, se vi ricordate, grazie ai sistemi di Paging e di Segmentazione introdurre la protezione della memoria è una costa relativamente semplice: se utilizziamo l’ isolamento totale, basterà assicurarsi che nessun processo condivida indirizzi di memoria nella sua tabella di paging.
Al contrario, se condivisione è permessa saranno ammessi più riferimenti allo stesso dato.
Per quanto riguarda il controllo dell’accesso dell ‘utente (Controllo orientato all’ utente) di solito si utilizza il Log On: l’ utente fornisce un ID e una password e se l’ ID è conosciuto e la password è giusta, l’ utente è ammesso al sistema.
Per il controllo dei dati invece, ogni dato deve essere accessibile all ‘utente che ha effettuato il Log On asseconda dei suoi permessi.
Meccanismi di protezione sotto Unix
Vediamo come i sistemi *nix implementano i meccanismi di protezione. I sistemi che implementa sono: il Log-On (User-oriented Access Control) e i diritti (o permessi) di accesso ai dati (Data-Oriented Access Control).
Log-On
Ad ogni utente di un sistema *nix viene assegnato un UID (User ID) numerico e uno username alfanumerico univoci. Lo UID è utilizzato dalle strutture dati del sistema (es: PCB) in cui è necessario identificare l’appartenenza di un processo o un dato.
Ogni utente fa poi parte di uno o più gruppi: anch’essi sono identificati da un GID (Group ID) numerico ed un nome alfanumerico. La definizione di gruppi si trova nel file:
/etc/group
Potete dargli un’occhiata dando:
cat /etc/group
Gli utenti invece sono definiti nel file:
/etc/passwd
che specifica per ogni riga un’utente nel formato:
Username; password (Criptata); UID; GID; nome vero ed altre informazioni; home directory dell' utente; shell utilizzata.
Ad esempio:
federicoponzi:x:1000:1000:FedericoPonzi,,,:/home/federicoponzi:/bin/bash
Visto che il file /etc/password è accessibile agli utenti e ai processi, le password criptate si trovano in:
/etc/shadow
accessibile e consultabile dando
sudo cat /etc/shadow
Quando un utente deve autenticarsi, viene utilizzato il comando login che prende in input username e password e controlla in /etc/passwd la validità delle informazioni fornite.
In caso di informazioni esatte, sempre dallo stesso file prenderà la shell dell’ utente (es: /bin/bash) e la sostituirà a se stesso.
Diritti di accesso
I diritti di accesso sono specificati per ogni singolo file e possono essere: r (lettura), w (scrittura o eliminazione), x (esecuzione).
Per ogni file vengono specificate tre terne di permessi:[fancy_list style=”plus_list”]
- La prima terna corrisponde al proprietario del file
- La seconda terna sono i permessi che hanno gli utenti dello stesso gruppo del proprietario
- La terza terna sono i permessi pubblici.
[/fancy_list]Ogni file poi, porta con se la GID e la UID del proprietario.
Trovandoci una cartella, basta dare ls -l (list directory content in formato long – ovvero come più informazioni) per verificare queste informazioni.
I super utenti hanno pieni permessi a tutti i file, ed essi assieme al proprietario del file possono modificare i permessi usando il comando chmod. I superutenti possono anche cambiare il proprietario di un file usando chown.
[note_box]In Unix è possibile cambiare utente per passare all’utente privilegiato tramite il comando su username. Se l’utente che andiamo a scegliere ha più poteri, ci verrà richiesta la password. In caso contrario non sarà richiesta.[/note_box]
Anche i processi sono sottomessi alle regole di accesso: ad un processo avviato da un certo utente viene assegnato il suo GID e UID.
Quando il processo vuole accedere ad un file, viene controllato il proprietario di quest’ultimo (UID) se corrisponde si controlla la prima terna di permessi. Sennò si controlla il gruppo del proprietario (GID) e si vede se corrisponde, se corrisponde si controlla la seconda terna di permessi. Se entrambe le condizioni non si verificano si controlla la terza terna di permessi.
Se c’è bisogno di modificare un file o di avere permessi speciali, è possibile utilizzare una coppia di UID e GID efficaci. Normalmente sono uguali a quelli reali, ma se vengono abilitati vengono assegnati al processo gli stessi diritti del proprietario (o del gruppo del proprietario) del file.