I permessi speciali ACL
ACL POSIX con i sistemi GNU/Linux
La sigla «ACL» sta per Access Control List e si riferisce a un'estensione della gestione dei permessi, rispetto alla tradizione dei sistemi Unix.
Come succede spesso, i nomi che rappresentano acronimi possono indicare cose differenti in contesti diversi. Nel caso particolare della sigla ACL, questa si usa anche in altre situazioni, specie nella gestione dell'accesso a servizi HTTP (serventi o proxy), dove si vuole regolare l'accesso al servizio o a delle risorse particolari. Ciò che si deve intendere è che la sigla ACL, anche se, come acronimo, fa riferimento alle stesse parole, rappresenta situazioni differenti in base al contesto.
POSIX ha prodotto alcune bozze sulla possibilità di estendere la gestione dei permessi dei sistemi Unix (POSIX 1003.1e e POSIX 1003.2c), ma tali lavori sono rimasti incompiuti. Queste bozze sono pubbliche e diversi sistemi Unix mettono a disposizione alcune di queste estensioni. Le estensioni a cui si fa riferimento con la sigla ACL, o eventualmente con «ACL POSIX>> (benché si tratti solo di bozze), sono solo una porzione dell'insieme complessivo e in questo capitolo si vuole descrivere in particolare la realizzazione relativa ai sistemi GNU/Linux.
File system e programmi di servizio
La gestione delle estensioni ACL POSIX richiede che il file system sia in grado di accumulare le informazioni necessarie e che il kernel sia in grado di gestirle. Nel caso di un kernel Linux occorre abilitare la funzione nell'ambito della voce che consente la gestione di un certo file system (si veda la sezione 72.2.20).
A ogni modo, in un sistema GNU/Linux, il fatto che il kernel sia predisposto correttamente e che il file system sia adatto, non basta ad attivare la gestione delle estensioni ACL POSIX, perché è necessario innestare il file system con l'opzione acl:
/dev/hda2 / ext3 defaults,acl,errors=remount-ro 0 1 |
L'esempio mostra una riga del file /etc/fstab, in cui si dichiara la partizione usata come file system principale. Come si vede, tra le opzioni appare anche la sigla acl per attivare la gestione che interessa.
Eventualmente, un file system può essere reinnestato aggiungendo tale opzione:
# mount -o remount,acl |
Per disabilitare le estensioni ACL si può usare l'opzione noacl:
# mount -o remount,noacl |
La gestione delle estensioni ACL POSIX richiede naturalmente la disponibilità di programmi di servizio appropriati. Nei sistemi GNU/Linux si usa il pacchetto ACL, (1) che si compone principalmente dei programmi getfacl e setfacl.
ACL POSIX
Nei confronti di un file (o di una directory), gli utenti di un sistema Unix sono classificati in tre classi: il proprietario del file; gli utenti che appartengono al gruppo a cui è associato il file; gli utenti che non rientrano nelle prime due classi. I permessi di un file (o di una directory) sono suddivisi in tre parti, che riguardano rispettivamente le tre classi di utenti.
Associazione tra le classi di utenti e i permessi secondo lo schema tradizionale dei sistemi Unix. |
Quando si inseriscono le ACL POSIX, i file e le directory possono contenere informazioni più articolate nei confronti dei permessi si accesso e degli utenti a cui questi permessi si rivolgono. Le informazioni riguardo ai permessi dell'utente proprietario e degli utenti che non sono proprietari e non appartengono nemmeno al gruppo associato al file, sono gestite come nel sistema tradizionale. Oltre a questo, è possibile dichiarare espressamente utenti, oppure gruppi, a cui si associano dei permessi specifici. La gestione di questi utenti e gruppi particolari, assieme alla gestione dei permessi del gruppo a cui appartiene il file, è sottoposto al filtro di una maschera, che però non è collegato alla maschera dei permessi tradizionale (umask).
Associazione tra le classi di utenti e i permessi mostrati dal comando Is quando è attiva la gestione delle ACL POSIX. |
La maschera dei permessi ACL rappresenta precisamente il massimo delle possibilità che ha un utente appartenente a quell'insieme costituito da: utenti e gruppi particolari, assieme al gruppo associato al file stesso. In altri termini: se anche un utente particolare avesse i permessi di lettura e scrittura su quel file, ma la maschera concedesse, come nell'esempio, soltanto la lettura ed esecuzione, tale utente potrebbe accedere al file soltanto in lettura.
Questo tipo di maschera va inteso quindi come la rappresentazione di ciò che è concesso, mentre la maschera dei permessi tradizionale rappresenta ciò che viene sottratto nel momento in cui si crea un file o una directory. |
Le informazioni sui permessi relative alle estensioni ACL POSIX sono elencate nella tabella successiva, dove si vede in particolare il modo con cui questi vengono rappresentati.
Voce | Descrizione |
user::permessi | Dichiarazione dei permessi associati all'utente proprietario (questi permessi non sono filtrati dalla maschera ACL). |
group::permessi | Dichiarazione dei permessi associati agli utenti appartenenti al gruppo proprietario. |
user:utente:permessi | Dichiarazione dei permessi associati a un utente particolare. |
user:gruppo:permessi | Dichiarazione dei permessi associati agli utenti di un gruppo particolare. |
mask::permessi | Dichiarazione della maschera dei permessi concessi a tutte le classi di utenti, escluso il proprietario e gli utenti che non ricadono in alcuna categoria specificata. |
other::permessi | Dichiarazione dei permessi associati agli utenti che non vengono individuati in alcuna categoria particolare (questi permessi non sono filtrati dalla maschera ACL). |
Se esistono i presupposti per usare le estensioni ACL POSIX (un kernel adatto e un file system compatibile, innestato con l'opzione acl), si possono fare delle prove per verificare la logica di questo sistema.
Si crea inizialmente la directory /tmp/ACL/ e ci si sposta al suo interno per comodità:
$ mkdir /tmp/ACL $ ls -l /tmp drwxr-xr-x 2 tizio tizio 4096 2007-03-18 15:30 ACL |
Da quanto mostrato, si comprende che si sta operando utilizzando l'utenza tizio, che appartiene al gruppo tizio(evidentemente si utilizza la gestione dei gruppi privati); inoltre, si comprende che la maschera dei permessi tradizionale ha il valore 00228, ma tanto vale controllare:
$ umask 0022 |
Si crea un file vuoto e poi si verificano i permessi:
$ touch primo $ ls -l primo totale 0 -rw-r--r-- |
Con l'ausilio di getfacl si può vedere la descrizione dei permessi tradizionali in forma di ACL POSIX:
$ getfacl primo # file: primo # owner: tizio #group: tizio user::rw- group::r-- other::r-- |
Come si può osservare, le informazioni che si ottengono sono equivalenti alle solite che mostra il comando ls, tradotte però secondo la forma che appare nella tabella precedente.
Con l'ausilio di setfacl si aggiungono dei permessi particolari di accesso all'utenza caio:
$ setfacl -m user:caio:rw- primo |
Il comando, oltre che attribuire i permessi all'utente caio, predispone in modo predefinito una maschera appropriata:
$ getfacl primo # file: primo # owner: tizio # group: tizio user::rw- user:caio:rw- group::r-- mask::rw- other::r-- |
Conviene osservare anche cosa mostra il comando Is:
$ ls -l primo -rw-rw-r--+ 1 tizio tizio 0 2007-03-18 15:36 primo |
Come si vede, alla fine della stringa che esprime i permessi appare il segno +, a indicare che sono presenti delle estensioni ACL e che il gruppo centrale di permessi è riferito alla maschera di queste estensioni e non più al gruppo proprietario.
A completamento dell'esempio si può aggiungere al file una voce riferita al gruppo sempronio, a cui si vuole concedere di scrivere e di eseguire il file:
$ setfacl -m group:sempronio:-wx primo |
Si può osservare che in condizioni normali, se non si specificano altre opzioni, la voce che rappresenta la maschera viene adattata in modo automatico:
$ getfacl primo # file: primo # owner: tizio # group: tizio user::rw- user:caio:rw- group::r-- group:sempronio:-wx mask::rwx other::r-- $ ls -l primo -rw-rwxr--+ 1 tizio tizio 0 2007-03-18 15:36 primo |
A questo punto si decide di intervenire direttamente sulla maschera, ma per farlo si può agire in due modi equivalenti:
$ setfacl -m mask::-w- primo |
Oppure:
$ chmod g=w primo |
Naturalmente, si può usare chmod anche per modificare i permessi associati all'utente proprietario o agli utenti che non sono individuabili in altri modi, così come si può usare setfacl con le voci user::permessi e other::permessi.
$ getfacl primo # file: primo # owner: tizio # group: tizio user::rw- user:caio:rw- #effective:-w- group::r-- #effective:--- group:sempronio:-wx #effective:-w- mask::-w- other::r-- |
A questo punto si vede che la maschera, ridotta al solo permesso di scrittura, interviene sui permessi «efficaci» associati all'utente caio, al gruppo sempronio e agli utenti del gruppo proprietario. In base all'esempio, gli utenti del gruppo proprietario, avendo originariamente soltanto il permesso di lettura, dopo l'applicazione della maschera non hanno più alcun permesso di accesso.
Si osservi che l'adattamento automatico della maschera continua a persistere, nonostante la modifica manuale. Pertanto, se si aggiungono altri utenti e gruppi particolari, o se si interviene su quelli esistenti, la maschera viene aggiornata di conseguenza. Per evitarlo, quando si usa setfacl si aggiunge l'opzione -n.
Per cambiare i permessi di un utente o di un gruppo particolare basta impartire nuovamente il comando relativo, mentre per eliminare le voci di utenti e di gruppi particolari si usa l'opzione -x e non si specificano i permessi. Ecco come si eliminano le voci dell'utente caio e del gruppo sempronio:
$ setfacl -x user:caio: primo $ setfacl -x group:sempronio: primo $ getfacl primo # file: primo # owner: tizio # group: tizio user::rw- group::r-- mask::r-- other::r-- |
Se si elimina anche la maschera, il comando Is non mostra più la presenza di estensioni ACL POSIX:
$ setfacl -x mask:: primo $ ls -l primo -rw-r--r-- 1 tizio tizio 0 2007-03-18 15:36 primo |
Ereditarietà
I permessi con le estensioni ACL POSIX per le directory funzionano come per i file normali, con la differenza che è possibile stabilire delle voci predefinite.
Si inseriscono delle voci predefinite con l'opzione -d di setfacl e la prima volta vengono utilizzati anche i dati delle voci generali che appartengono già alla directory (utenti e gruppi particolari vengono ignorati). Per comprendere il meccanismo è necessario procedere con degli esempi, che continuano da quanto lasciato nella sezione precedente.
$ mkdir seconda |
Inizialmente, nulla di strano:
$ getfacl seconda # file: seconda # owner: tizio # group: tizio user::rwx group::r-x other::r-x |
Si aggiunge una voce relativa all'utente caio, cui si concede anche di aggiungere e cancellare dei file:
$ setfacl -m user:caio:rwx seconda $ getfacl seconda # file: seconda # owner: tizio # group: tizio user::rwx user:caio:rwx group::r-x mask::rwx other::r-x |
Come già visto nella sezione precedente, la gestione delle estensioni ACL POSIX diventa attiva e si ottiene anche una maschera predefinita.
A questo punto si stabiliscono i permessi predefiniti, aggiungendo un altro utente particolare, che però può solo modificare e attraversare le directory:
$ setfacl -d -m user:mevio:-wx seconda $ getfacl seconda #file: seconda # owner: tizio # group: tizio user::rwx user:caio:rwx group::r-x mask::rwx other::r-x default:user::rwx default:user:mevio:-wx default:group::r-x default:mask::rwx default:other::r-x |
Come si vede, appaiono alla fine delle voci precedute dalla sigla default.
Per dare un senso alle voci predefinite, occorre creare qualcosa all'interno della directory in questione:
$ cd seconda $ touch terzo $ getfacl terzo # file: terzo # owner: tizio # group: tizio user::rw- user:mevio:-wx #effective:-w- group::r-x #effective:r-- mask::rw- other::r-- |
I permessi (estesi) che ha ottenuto il file terzo dipendono però da quelli che il file otterrebbe in mancanza delle estensioni ACL POSIX. In questo caso, in presenza di una maschera dei
permessi 00228, trattandosi di un file, si otterrebbero permessi del tipo 06448, ovvero 'rw-r--r--'. Da quanto ottenuto si intende che la maschera ACL non ne è influenzata.
Se si crea una directory, questa eredita anche le voci predefinite:
$ mkdir quarta $ getfacl quarta # file: quarta #owner: tizio # group: tizio user::rwx user:mevio:-WX group::r-x mask::rwx other::r-x default:user::rwx default:user:mevio:-wx default:group::r-x default:mask::rwx default:other::r-x |
Per eliminare le voci predefinite, si usa l'opzione -k:
$ setfacl -k quarta $ getfacl quarta # file: quarta # owner: tizio # group: tizio user::rwx user:mevio:-WX group::r-x mask::rwx other::r-x |
Riferimenti