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
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:
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. |
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
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.
![]()
|
![]()
|
|
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. |
____________________________________________________________________
Comando: chmod
Path: /bin/chmod
SINTASSI
$ chmod [option] mode file
DESCRIZIONE
[user][operationpermission]
dove
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).