Linux fu concepito fin dall'inizio come sistema multiutente, cioè per l'uso contemporaneo da parte di più utenti.
Per poter iniziare una sessione di lavoro, ogni utente deve inserire una
password, ovvero eseguire il "login". A questo scopo, l'utente possiede un
proprio nome utente con la relativa password. Questa differenziazione degli
utenti garantisce che gli utenti non autorizzati non possono vedere il
contenuto dei file di cui non hanno il permesso. Generalmente, gli utenti
normali non possono apportare (o possono farlo solo molto limitatamente)
modifiche sostanziali al sistema – per esempio l'installazione di nuovi
programmi. Solo root,
detto anche super utente, dispone del diritto di apportare
modifiche al sistema e ha accesso illimitato a tutti i file. Chi usa
avvedutamente questo concetto, cioè si immette nel sistema come root solo se strettamente necessario, può
limitare il pericolo di una perdita accidentale di dati. Poiché normalmente
solo il super utente può cancellare file di sistema o può formattare i dischi
rigidi, il pericolo derivante dai cavalli di troia o dall'inavvertita
immissione di comandi distruttivi è molto ridotto.
Fondalmentalmente, ogni file nei filesystem di Linux appartiene ad un utente e ad un gruppo. Ad ognuno dei due proprietari, ma anche agli altri utenti, possono venire assegnati diritti di scrittura, lettura ed esecuzione.
Un gruppo, in questo caso, può essere definito come un insieme di utenti con
determinati diritti collettivi: un determinato gruppo di lavoro che lavora ad
un progetto specifico, progetto3, potrebbe essere uno di
questi gruppi. Ogni utente in un sistema Linux è membro di almeno un gruppo,
di solito users, è possibile creare un numero
qualsiasi di altri gruppi, questo è però possibile solo per
root. Con il comando
groups, ogni utente può scoprire di quale gruppo fa
parte.
Osserviamo da vicino la struttura dei diritti di accesso nel file system. Incominciamo dai file. Un tipico output di ls -l vi mostra l'esempio Esempio 19.1, “Esempio di output dei diritti di accesso dei file”
Esempio 19.1. Esempio di output dei diritti di accesso dei file
-rw-r----- 1 tux projekt3 14197 Jun 21 15:03 Roadmap
Come potrete vedere nella seconda colonna, questo file appartiene
all'utente tux ed è assegnato
al gruppo progetto3. Per poter vedere i diritti
utente sul file Roadmap, dobbiamo osservare più
attentamente la prima colonna.
- | rw- | r-- | --- |
Tipo | Permessi per l'utente | Permessi per il gruppo | Permessi per gli altri utenti |
Questa colonna consiste di un carattere iniziale seguito da nove caratteri
raggruppati a tre a tre. Il primo dei dieci caratteri indica il tipo
dell'elemento elencato del filesystem. Il trattino
(–) ci indica che si tratta di un file. Potremmo
anche trovare una directory (d), un collegamento
(l), un dispositivo a blocchi (b)
oppure a caratteri (c).
I tre blocchi seguenti seguono uno schema uniforme. Il primo carattere di
ogni blocco indica se il file è leggibile (r) o no
(–). Una w in posizione
centrale indica che l'oggetto corrispondente può essere modificato,
mentre un trattino (–) indica che non è
possibile scrivere sul file. Infine, una x in terza
posizione indica che l'oggetto può essere eseguito. Poiché il file del
nostro esempio è un file di testo e non un file eseguibile, non è
necessario il diritto di esecuzione di questo file.
Nel nostro esempio, tux
ha, come proprietario del file Roadmap, permesso di
lettura (r) e scrittura (w) su di
esso, ma non può eseguirlo (nessuna x). I membri del
gruppo progetto3 possono leggere il file, ma non
modificarlo o eseguirlo. Gli altri utenti non hanno alcun diritto su
questo file.Le cosiddette ACLAccess Control
Lists permettono di cesellare in modo ancor più mirato i
diritti, vedete a riguardo
Sezione 19.2.6, “Access Control List” e
il capitolo Access Control Lists in Linux nel
Manuale di amministrazione.
Diamo ora un'occhiata ai diritti di accesso alle directory, il cui tipo è
d). In questo caso, alcuni diritti si differenziano
leggermente da quanto sopra spiegato. Tanto per fare un esempio:
Esempio 19.2. Esempio di output dei diritti di accesso delle directory:
drwxrwxr-x 1 tux project3 35 Jun 21 15:15 DatiProgetto
Nell'esempio Esempio 19.2, “Esempio di output dei diritti di accesso delle directory:”, si possono
riconoscere facilmente il proprietario
(tux) e il gruppo di
proprietari (progetto3) della directory
DatiProgetto. Al contrario dei diritti di accesso ai
file descritti in
Diritti sui file, il
diritto di lettura impostato (r) indica che il
contenuto della directory può essere mostrato. Il diritto di scrittura
(w) significa che possono essere creati nuovi file. Il
diritto di esecuzione (x) indica che l'utente può
entrare in questa directory. Riferendoci all'esempio qui sopra, ciò
significa che sia l'utente tux
sia i membri del gruppo progetto3 possono entrare
nella directory DatiProgetto (x),
possono vederne il contenuto (r) e vi possono creare
nuovi file (w). Tutti gli altri utenti invece hanno
meno diritti; possono solo entrare nella directory (x)
o guardarvi dentro (r), ma non vi possono archiviare
nuovi file (w).
I diritti di accesso di un file o di una directory possono venire
modificati dal proprietario (e naturalmente anche da
root) con il comando
chmod
che deve essere immesso assieme ai parametri previsti per i diritti da
modificare ed assieme ai nomi dei file da modificare.
Entrambi i parametri sono composti da:
le categorie interessate
u user – il
proprietario del file
g group – ; il
gruppo del proprietario
o others – gli
altri utenti (se non si indica alcun parametro, le modifiche si
applicano a tutte le categorie)
un carattere per rimuovere (–), per impostare
(=) o per aggiungere (+)
le abbreviazioni già conosciute per
rread –
leggere
w write –
scrivere
x execute
–eseguire
il nome o i nomi dei file separati da spazi
Se, per esempio, l'utente
tux
nell'esempio Esempio 19.2, “Esempio di output dei diritti di accesso delle directory:” vuole
concedere anche agli altri utenti il diritto di scrittura
(w) sulla directory DatiProgetto,
può farlo con il comando chmod o+w DatiProgetto
Se, invece, l'utente preferisce sottrarre a tutti tranne sé stesso il
diritto di scrittura, immetterà il comando chmod go-w
Datiprogetto. Per vietare a tutti gli utenti di creare un file
nella directory DatiProgetto, si inserisca
chmod -w DatiProgetto. Con questo comando, neanche il
proprietario del file potrà avervi accesso senza ripristinare i suoi
diritti di scrittura.
Altri comandi importanti che regolano i rapporti di proprietà delle
componenti del file system sono chown
(Change Owner) e chgrp
(Change Group). Il comando chown serve a modificare il
proprietario del file indicato. Solo
root è in grado di eseguire
questa modifica.
Supponiamo che il file Roadmap
dell'esempio Esempio 19.2, “Esempio di output dei diritti di accesso delle directory:” non debba più
appartenere a tux, ma all'utente
geeko. L'utente
root dovrebbe in tal caso
immettere il seguente comando: chown geeko Roadmap.
Il comando chgrp è altrettanto chiaro: cambia
l'appartenenza del gruppo di un file. Dovete tenere presente, tuttavia,
che il proprietario del file deve essere membro del nuovo gruppo. L'utente
tux dell'esempio
Esempio 19.1, “Esempio di output dei diritti di accesso dei file” può cambiare il gruppo di
proprietari del file DatiProgetto in
progetto4, a patto che egli sia membro di questo
nuovo gruppo, immettendo il comando chgrp projekt4
Datuprogetto. Per
root, questa restrizione non
vale.
Per ampliare temporaneamente i diritti di accesso ad alcuni file o directory
ed eseguire delle operazioni particolari, Linux vi offre dei meccanismi di
modifica dell'identità dell'utente e del gruppo in questione.
Per esempio, il comando passwd rchiede solitamente i
privilegi di root per accedere al file /etc/passwd.
Questo file contiene informazioni vitali per il sistema, come gli ID degli
utenti, i percorsi delle directory home ecc., per questo motivo non è consentita
la modifica agli utenti normali. Una soluzione possibile consiste nell'usare
il meccanismo di setuid.
Setuid (set user ID) è un attributo speciale dei file che indica al sistema
che il file deve essere eseguito con l'ID di un particolare utente.
Consideriamo il comando passwd:
-rwsr-xr-x 1 root shadow 80036 2004-10-02 11:08 /usr/bin/passwd
Notate il bit impostato a s in corrispodnenza dei permessi
dell'utente.
Con questo bit impostato, tutti gli utenti che eseguono passwd
lo eseguiranno come se fossero root.
L'attributo Setuid si usa con gli utenti. Per i gruppi, esiste l'attributo Setgid, che permette di eseguire un programma con l'ID di gruppo con la quale sia stato salvato, indipendentemente dall'utente che lo abbia avviato. Pertanto, per una directory con l'attibuto setgid, tutti i vuovi file e le nuove sottodirectory vengono attribuite al gruppo a cui appartiene la directory. Vediamo un esempio:
drwxrwsr-- 2 tux archive 48 Nov 19 17:12 backup
Potete notare il bit impostato a s per i permessi del
gruppo.
Il proprietario della directory e i membri del gruppo archive possono accedere.
Gli utenti che sono membri di questo grupppo sono “mappati”
al rispettivo gruppo, il gruppo effettivo di tutti i file creati sarà
impostato a archive.
Per esempio: un programma di backup che viene eseguito con ID del gruppo
uguale a archive, avrà accesso
alla directory pur non essendo root.
Oltre a setuid e setgid, vi presentiamo anche il cosiddetto sticky bit.
Questo bit viene usato con i programmi eseguibili e con le directory. Per i
file, lo "sticky bit" non si usa quasi più ed è interessante solo dal punto
di vista storico: era usato per indicare che il file doveva essere caricato
nella memoria RAM per consentire un accesso più rapido.
Attribuendo questo bit ad una directory, si può impedire che gli utenti si
cancellino dei file a vicenda (i file di una directory con questo attributo
possono essere cancellati solo dai proprietari). Un esempio tipico sono le
directory /tmp e/var/tmp:
drwxrwxrwt 2 root root 1160 2002-11-19 17:15 /tmp
Al tradizionale concetto dei diritti sui file e directory di Linux, descritto nei paragrafi precedenti, si aggiungono le cosiddette ACL Access Control Lists che consentono di dare il diritto di accesso oltre al proprietario e al gruppo proprietario anche da altri utenti e gruppi.
Le directory e file con diritti di accesso estesi si riconoscono dopo aver immesso un ls -l:
-rw-r--r--+ 1 tux projekt3 517 2003-01-08 18:12 Roadmap
A prima vista l'output del comando ls non è cambiato
tanto. Il file Roadmap appartiene all 'utente
tux che appartiene al gruppo progetto3.
tux ha sia acceso in lettura che scrittura per questo
file, il gruppo e gli altri hanno accesso in lettura. L'unica differenza
rispetto ad un file senza ACL è rappresentato da un +
nella prima colonna dei bit dei permessi.
Se volete avere dei dettagli inerenti alla ACL, immettete getfacl Roadmap:
# file: Roadmap # owner: tux # group: projekt3 user::rw- user:jane:rw- effective: r-- group::r-- group:djungle:rw- effective: r-- mask::r-- other::---
Le prime tre righe non forniscono alcuna informazione aggiuntiva rispetto al
comando ls -l. Qui vedete il nome del file, il
proprietario e il gruppo. Dalla quarta riga alla nona avete le registrazioni
delle ACL. I diritti sui file
sono un sottoinsieme di quelli che possono essere stabiliti con l'aiuto delle
ACL. Nell'ACL di esempio, il proprietario del file e l'utente
jane hanno il diritto di lettura e di scrittura, dunque si
tratta di una estensione (righe 4 e 5). Idem per i gruppi. Il gruppo del
proprietario del file ha l'accesso in scrittura (riga 6), per il grupppo
djungle vi è l'accesso in scrittura e lettura. La voce
mask nell'ottava riga limita i diritti per
l'utente jane ed il gruppo djungle al solo
accesso in lettura. Gli altri utenti o gruppi non hanno alcun accesso
(riga 9).
In questa sezione sono state presentate solo alcune informazioni elementari sulle ACL, per ulteriori informazioni consultate il Manuale di amministrazione.