4.6.5 I permessi

Ogni oggetto del filesystem appartiene sempre ad un utente, l’utente proprietario, ed ad un gruppo, il gruppo proprietario. Queste informazioni, memorizzate all’interno di ogni inode (campi i_uid e i_gid), delineano tre categorie di utenti

Per ognuna delle categorie di utenti elencate, è possibile specificare una serie di permessi (mode) che regolano l’accesso all’oggetto in questione.

Quando un oggetto del filesystem viene creato, il suo creatore risulta esserne il proprietario (ed il gruppo a cui esso appartiene è il gruppo proprietario) e come tale può specificarne i seguenti permessi di accesso:

Per essere più precisi, ad ogni oggetto del filesystem è associata una serie di flag25 composta dai 12 bit meno significativi del campo i_mode (uno per ogni flag), come riportato nella fig. 4.9.26


pict
Figura 4.9: Flag relativi ai permessi associati agli oggetti del filesystem.

I flag r*, w* e x*, ognuno per la categoria di utente considerata (owner user, owner group, others), hanno un significato diverso se l’oggetto del filesystem è un file o una directory. Il flag r* si riferisce al permesso di lettura ed ha più o meno lo stesso significato sia per i file che per le directory: per un file indica che il suo contenuto può essere visualizzato (o comunque letto), mentre per una directory indica che può essere conosciuto l’elenco degli oggetti (file e directory) in essa contenuti. Il flag w* si riferisce al permesso di scrittura: per un file indica che è possibile modificare il suo contenuto, mentre per una directory indica che è possibile creare, modificare o rimuovere oggetti in essa contenuti. Il flag x* si riferisce al permesso di esecuzione: per un file indica che è possibile far eseguire il file dal sistema, mentre per una directory indica che questa può essere “attraversata” nella risoluzione del path, ovvero è possibile accedere ad essa ed agli oggetti in essa contenuti.

Per capire il significato degli altri flag è opportuno avere un’idea di cos’è un processo27 e delle sue caratteristiche. Un file eseguibile (con il permesso di esecuzione) che sia comprensibile al sistema (sia in linguaggio macchina o in un linguaggio che il sistema è in grado di interpretare), quando viene specificato sulla riga di comando (ovvero lanciato in esecuzione) genera un processo, cioè una particolare struttura dati in memoria che esegue le istruzioni contenute nel file. Generalmente, quando un file eseguibile viene lanciato in esecuzione, il processo relativo assume i privilegi dell’utente che lo ha lanciato (UID) e del gruppo a cui quest’ultimo appartiene (GID).

I flag suid28 (su ) e sgid29 (sg ) sono utilizzati da GNU/Linux per indicare al kernel di utilizzare uno speciale comportamento per l’esecuzione dei file (eseguibili) che hanno tali flag impostati. Se il file ha il flag suid impostato, il kernel avvia il processo relativo con i privilegi dell’utente proprietario del file piuttosto che con quelli dell’utente che lo ha lanciato in esecuzione. Analogamente se il file ha il flag sgid (sg) impostato, il kernel avvia il processo con i privilegi del gruppo proprietario del file piuttosto che con quelli del gruppo al quale appartiene l’utente che lo ha lanciato in esecuzione. Questo permette al processo in esecuzione di avere dei diritti diversi da quelli dell’utente che lo ha lanciato.

Ad esempio, un file che ha tali flag impostati è /usr/bin/passwd che è il comando utilizzato per modificare la password di un utente (file /etc/passwd o /etc/shadow). Il file che contiene le password degli utenti può infatti essere modificato soltanto da processi che hanno i privilegi del superuser, ma poiché /usr/bin/passwd appartiene al superuser ed ha il flag suid impostato, quando viene lanciato da un utente, il processo relativo ha i privilegi del superuser e quindi può modificare il file contenente le password. In questo modo qualsiasi utente può cambiare la propria password.

Avere la possibilità di creare un processo con privilegi superiori a quelli posseduti dall’utente che lo crea, comporta dei rischi di sicurezza, pertanto i file (programmi) che hanno tali impostazioni devono essere scritti molto accuratamente per non permettere all’utente che li ha lanciati di acquisire dei privilegi a lui non consentiti.

Nel caso di file non eseguibile, il flag sgid assume un significato diverso: in tal caso GNU/Linux considera attivo per quel file il maccanismo del mandatory locking (se il filesystem è abilitato alla gestione del file locking)30. In tal modo il sistema effettua un file locking (blocco del file) che garantisce l’accesso esclusivo al file: solo un utente alla volta può accedere al file (neanche il superuser può accedere al file bloccato in questo modo).

I flag suid e sgid assumono un significato completamente diverso per le directory: il flag suid viene ignorato, mentre il flag sgid indica la convenzione che il sistema deve utilizzare per l’assegnamento del gruppo proprietario. Infatti, alla creazione di un oggetto del filesystem, l’utente proprietario del file viene impostato con l’UID del processo (utente) che lo ha creato. Per quanto riguarda il gruppo proprietario, se tale flag non è impostato (default) viene impostato con il GID del processo che lo ha creato (semantica SVr4), altrimenti viene impostato con il gruppo prorietario della directory stessa (semantica BSD). Il valore di tale flag viene comunque propagato in maniera gerarchica nella creazione delle directory, cioè quando viene creata una directory essa eredita tale flag dalla directory che la contiene.

Il flag sticky31 (t) è un retaggio dei vecchi sistemi Unix. Per ottenere delle prestazioni migliori, sui file utilizzati più frequentemente poteva essere impostato questo flag che faceva in modo che il sistema ponesse il segmento di codice (code segment) del processo relativo (v. cap. 7) nello swap (v. sez. 4.16) al momento della sua prima esecuzione, facendovelo permanere finché il sistema non veniva spento. Le implementazioni attuali della memoria virtuale rendono l’utilizzo di tale flag praticamente inutile (GNU/Linux ignora l’impostazione di questo flag per i file). Per quanto riguarda le directory, tale flag assume per GNU/Linux un significato diverso: i file contenuti nella directory che ha tale flag impostato possono essere cancellati o rinominati soltanto dal relativo proprietario o dal proprietario della directory stessa (se tale flag non è impostato, chiunque abbia il permesso di scrittura sulla directory può cancellare o rinominare i file in essa contenuti). Tale flag è impostato, ad esempio, per la directory /tmp nella quale vengono creati i file temporanei per i vari utenti: in questo modo ogni utente può rimuovere soltanto i propri file.

Quindi, ogni volta che un utente tenta di accedere ad un oggetto del filesystem (file o directory), il sistema determina, in base all’UID e GID dell’utente, la categoria di utente che accede all’oggetto desiderato (owner user, owner group, others), secondo la seguente procedura

  1. se l’UID dell’utente è uguale a quello del proprietario dell’oggetto del filesystem (i_uid) vengono considerati soltanto i permessi di accesso relativi all’utente proprietario;
  2. se il GID dell’utente è uguale a quello del gruppo proprietario dell’oggetto del filesystem (i_gid) vengono considerati soltanto i permessi di accesso relativi al gruppo proprietario;
  3. altrimenti vengono considerati soltanto i permessi di accesso relativi agli altri utenti;

Quindi, appena una delle condizioni precedenti (nell’ordine riportato) è verificata, il sistema controlla se i permessi di accesso assegnati all’oggetto del fileystem per la categoria dell’utente in questione, concordano con la modalità di accesso allo stesso richiesta dall’utente. In caso positivo l’accesso all’oggetto è consentito, altrimenti viene rifiutato.

I significati delle varie combinazioni di flag (permessi) è riportata nelle tab. 4.9 e 4.10, nelle quali è indicato con il simbolo “.” il fatto che il valore del bit relativo è ininfluente rispetto a quanto indicato in ciascuna riga: il significato si riferisce soltanto al bit (o alla combinazione di bit) il cui valore è esplicitamente indicato.


|--------|-owner user-|-owner group|---others---|------------------------|
su--sg--t--ru---wu--xu--rg--wg--xg--ro--wo--xo--Significato----------------
1-|.-|-.-|.--|-.-|-.-|-.-|-.-|-.-|-.-|-.-|-.-|Se-eseguito,-il relativo processo
| |  |   |   |   |   |   |   |   |   |   |   |ha i permessi del proprietario.
. |1 | . |.  | . | . | . | . | . | . | . | . |Se eseguibile, quando eseguito,
| |  |   |   |   |   |   |   |   |   |   |   |imle rseslait diveol gprroucpepssoo prhoapriiet paeriro-.
| |  |   |   |   |   |   |   |   |   |   |   |Se non eseguibile, indica che il
| |  |   |   |   |   |   |   |   |   |   |   |mandatory locking `e attivato.|
.. |.. | 1. |.1  | .. | .. | .. | .. | .. | .. | .. | .. |NPoenrmuetislisozzdaitlo.etturaperilpropri-|
| |  |   |   |   |   |   |   |   |   |   |   |etario.                   |
. |. | . |.  |1  | . | . | . | . | . | . | . |Permesso di scrittura  per il|
| |  |   |   |   |   |   |   |   |   |   |   |proprietario.              |
. |. | . |.  | . | 1 | . | . | . | . | . | . |Pperromperisetsoardioi. esecuzione per il
. |. | . |.  | . | . | 1 | . | . | . | . | . |Permessodiletturaperilgruppo |
| |  |   |   |   |   |   |   |   |   |   |   |proprietario.              |
. |. | . |.  | . | . | . | 1 | . | . | . | . |Permesso di scrittura  per il|
. |. | . |.  | . | . | . | . | 1 | . | . | . |gPreurpmpeos psoropdriie etsareiocu.zione per il
| |  |   |   |   |   |   |   |   |   |   |   |gruppo proprietario.        |
. |. | . |.  | . | . | . | . | . | 1 | . | . |Permesso di lettura per tutti gli
| |  |   |   |   |   |   |   |   |   |   |   |altri utenti.              |
. |. | . |.  | . | . | . | . | . | . | 1 | . |Pgelrim aletsriso utdenit si.crittura per tutti
. |. | . |.  | . | . | . | . | . | . | . | 1 |Permesso di esecuzione per tutti|
----------------------------------------------gli altri utenti.------------

Tabella 4.9: Tabella riassuntiva del significato dei bit dei permessi per un file.


|--------|-owner user-|-owner group|---others---|------------------------|
su--sg--t--ru---wu--xu--rg--wg--xg--ro--wo--xo--Significato----------------
1-|.-|-.-|.--|-.-|-.-|-.-|-.-|-.-|-.-|-.-|-.-|Non-utilizzato.-------------|
. |1 | . |.  | . | . | . | . | . | . | . | . |Propaga il gruppo proprietario|
| |  |   |   |   |   |   |   |   |   |   |   |ai nuovi file creati.       |
. |. | 1 |.  | . | . | . | . | . | . | . | . |Lfiilmei ntaelll’aa dccireessctooryin. scrittura ai|
. |. | . |1  | . | . | . | . | . | . | . | . |Permesso di visualizzazione per
| |  |   |   |   |   |   |   |   |   |   |   |il proprietario.            |
. |. | . |.  |1  | . | . | . | . | . | . | . |Pielr pmroepsrsoietdariio a.ggiornamento per
. |. | . |.  | . | 1 | . | . | . | . | . | . |Permessodiattraversamentoper|
| |  |   |   |   |   |   |   |   |   |   |   |il proprietario.            |
. |. | . |.  | . | . | 1 | . | . | . | . | . |Permesso di visualizzazione per
. |. | . |.  | . | . | . | 1 | . | . | . | . |iPle grrumpepsoso prdoip ariggetiaorrinoa.mento per
| |  |   |   |   |   |   |   |   |   |   |   |il gruppo proprietario.     |
. |. | . |.  | . | . | . | . | 1 | . | . | . |Permessodiattraversamentoper|
| |  |   |   |   |   |   |   |   |   |   |   |il gruppo proprietario.     |
. |. | . |.  | . | . | . | . | . | 1 | . | . |Pteurtmtie gsliso aldtrii v uisteunaltizi.zazione per
. |. | . |.  | . | . | . | . | . | . | 1 | . |Permesso di aggiornamento per
| |  |   |   |   |   |   |   |   |   |   |   |tutti gli altri utenti.      |
. |. | . |.  | . | . | . | . | . | . | . | 1 |Permessodiattraversamentoper|
----------------------------------------------tutti gli altri utenti.-------

Tabella 4.10: Tabella riassuntiva del significato dei bit dei permessi per una directory.

Il meccanismo di controllo dei permessi di accesso agli oggetti del filesystem non viene attuato dal sistema nel caso in cui l’utente che richiede l’accesso sia il superuser32: tale utente ha tutti i diritti possibili su qualunque parte del sistema.

Il proprietario di un oggetto del filesystem può impostarne i relativi permessi di accesso con il comando chmod (man page chmod(1)) (change mode).

____________________________________________________________________

Comando: chmod
Path: /bin/chmod

SINTASSI  
$ chmod [option] mode file  
DESCRIZIONE

________________________________________________________________________

I permessi dei symbolic link non vengono modificati da chmod, ma agendo su di essi si modificano i permessi del file o directory a cui il link si riferisce. I permessi dei symbolic link non vengono mai considerati (al loro posto vengono sempre presi in considerazione i permessi relativi all’oggetto del filesystem a cui i link si riferiscono).

Il superuser può cambiare il proprietario di un oggetto del filesystem per mezzo del comando chown (man page chown(1)) (change owner).

__________________________________________________________________________________________________________

Comando: chown
Path: /bin/chown

SINTASSI  
# chown [option] [[user][:[group]]] file  
DESCRIZIONE

_________

Il gruppo proprietario di un oggetto del filesystem può essere impostato anche tramite il comando chgrp (man page chgrp(1)) (change group).

__________________________________________________________________________________________________________

Comando: chgrp
Path: /bin/chgrp

SINTASSI  
$ chgrp [option] [group] file  
DESCRIZIONE

____________________________________________________________________________________________________________________

Esiste anche la possibilità, per mezzo di opportune patch da apportare al kernel standard (v. http://acl.bestbits.at), di gestire le ACL (Access Control List), ovvero specificare permessi specifici su un oggetto del filesystem per ogni singolo utente che deve accedervi. Sebbene ciò permetta di otenere un livello di dettaglio superiore sui permessi del filesystem, in genere si riescono a gestire agevolmente i diritti di accesso anche con la gestione classica (utente proprietario, gruppo proprietario e altri).