Linux è decisamente un sistema multi-utente, per cui è necessario fornire un sistema di permessi per il controllo delle operazioni autorizzate su file e directory, che comprende tutte le risorse di sistema e i device (in un sistema Unix, qualsiasi dispositivo è rappresentato da un file o directory). Questo principio è comune a tutti i sistemi Unix, ma un promemoria è sempre utile, soprattutto perché ci sono alcuni utilizzi avanzati interessanti e relativamente sconosciuti.
9.3.1. Proprietari e Permessi
Ogni file o directory ha permessi specifici per tre categorie di utenti:
il proprietario (simboleggiato dalla lettera u
di "user");
il gruppo proprietario (simboleggiato dalla lettera g
di "group"), in rappresentanza di tutti i membri del gruppo;
gli altri (simboleggiati dalla lettera o
di "other").
Si possono combinare tre tipi di diritti base:
lettura (simboleggiata dalla lettera r
di "read");
scrittura (o modifica, simboleggiata dalla lettera w
di "write");
esecuzione (simboleggiata dalla lettera x
come in "eXecute").
Nel caso di un file, questi diritti sono di facile comprensione: l'accesso in lettura permette di leggerne il contenuto (incluso farne una copia), l'accesso in scrittura permette di cambiarlo, e l'accesso in esecuzione permette di eseguirlo (che funziona solo se si tratta di un programma).
Una directory è gestita in modo diverso. L'accesso in lettura dà il diritto di consultare l'elenco delle sue voci (file e directory), l'accesso in scrittura permette di creare o eliminare file, mentre l'accesso in esecuzione permette di attraversarla (soprattutto di andarvi con il comando cd
). Essere in grado di attraversare una directory senza essere in grado di leggerla dà il permesso di accedere alle voci al suo interno di cui si conosce il nome, ma non di trovarle senza sapere che esistono o sotto quale nome esatto.
Tre comandi controllano i permessi associati ad un file:
chown utente file
cambia il proprietario del file;
chgrp gruppo file
cambia il gruppo proprietario;
chmod permessi file
cambia i permessi per il file.
Ci sono due modi di rappresentare i permessi. Tra questi, la rappresentazione simbolica è probabilmente la più facile da capire e ricordare. Utilizza i simboli lettera descritti in precedenza. È possibile definire i permessi per ogni categoria di utenti (u
/g
/o
), impostandoli in modo esplicito (con =
), aggiungendone (+
) o sottraendone (-
). Così la formula u=rwx,g+rw,o-r
conferisce al proprietario i permessi di lettura, scrittura ed esecuzione, aggiunge i permessi di lettura e scrittura per il gruppo proprietario, e rimuove i diritti di lettura per altri utenti. I permessi non alterati con le aggiunte o sottrazioni fatte da tale comando non vengono modificati. La lettera a
, per "all" (tutti), copre tutte le tre categorie di utenti, così che a=rx
garantisce a tutte e tre le categorie gli stessi diritti (lettura ed esecuzione, ma non scrittura).
La rappresentazione numerica (ottale) associa ogni permesso ad un valore: 4 per la lettura, 2 per la scrittura e 1 per l'esecuzione. Ogni combinazione di permessi viene associata con la somma delle cifre. I valori vengono quindi assegnati alle diverse categorie di utenti mettendoli in fila nell'ordine consueto (proprietario, gruppo, altri).
Ad esempio, il comando chmod 754 file
imposta i seguenti permessi: lettura, scrittura ed esecuzione per il proprietario (perché 7 = 4 + 2 + 1), lettura ed esecuzione per il gruppo (perché 5 = 4 + 1), sola lettura per gli altri. Il numero 0
(zero) significa che non si hanno permessi; così chmod 600 file
permette la lettura/scrittura per il proprietario, e nessun diritto per chiunque altro. Le combinazioni di permessi più frequenti sono 755
per le directory e i file eseguibili e 644
per i file di dati.
Per rappresentare i permessi speciali, è possibile anteporre una quarta cifra a questo numero in base allo stesso principio, in cui il bit setuid
, il bit setgid
e lo sticky
bit sono rispettivamente 4, 2 e 1. chmod 4754
assocerà il bit setuid
con i permessi descritti in precedenza.
Si noti che l'uso della notazione ottale consente solo di impostare tutti i permessi in una sola volta su un file, non è possibile utilizzarla per aggiungere semplicemente un nuovo permesso, come l'accesso in lettura per il gruppo proprietario, in quanto è necessario tener conto dei diritti esistenti e calcolare il nuovo valore numerico corrispondente.
9.3.2. ACL - Access Control List (lista di controllo degli accessi)
Molti file system, come Btrfs, Ext3, Ext4, JFS, XFS etc., supportano l'uso di liste di controllo degli accessi (ACL). Queste estendono le caratteristiche di base della proprietà e dei permessi dei file, descritte nella sezione precedente consentendo un controllo granulare di ogni oggetto (file). Ad esempio: un utente vuole condividere un file con un altro utente che deve poterlo solo leggere, ma non scrivere o modificare.
Per alcuni filesystem l'uso delle ACL è abilitato in modo predefinito (esempi: Btrfs, Ext3, Ext4). Per altri filesystem o vecchi sistemi deve essere abilitato con l'opzione acl
del comando mount - nel comando mount
direttamente o in /etc/fstab
. Nello stesso modo si può disabilitare l'uso della ACL tramite l'opzione noacl
di mount. Per i filesystem Ext* si può usare anche il comando tune2fs -o [no]acl /dev/dispositivo
per abilitare o disabilitare in modo predefinito l'uso delle ACL. Il valore predefinito per ogni filesystem può essere reperito nelle pagine del manuale omonimo nella sezione 5 (filesystem(5)) o in mount(8).
Dopo aver abilitato le ACL, i permessi possono essere impostati usando il comando setfacl(1), mentre getfacl(1) permette di recuperare le ACL per un determinato percorso. Questi comandi fanno parte del pacchetto acl. Con setfacl
si possono anche configurare i nuovi file e directory creati per far sì che ereditino i permessi dalle directory padre. È importante notare che le ACL sono elaborate nell'ordine in cui appaiono e che una voce precedente che si adatta alla situazione ha la precedenza sulle voci successive.
Se un file ha le ACL impostate, l'output del comando ls -l
mostrerà un segno più dopo i permessi tradizionali. Quando si usano le ACL il comando chmod
si comporta in un modo leggermente differente e umask
potrebbe essere ignorato. Maggiori informazioni sono contenute nell'ampia documentazione, ad esempio acl(5).