Nella Tabella 24.1, «Tipi di voci ACL» vengono riepilogati i sei possibili tipi di voci ACL, ognuno dei quali definisce le autorizzazioni di un utente o un gruppo di utenti. La voce proprietario definisce le autorizzazioni dell'utente proprietario del file o della directory. La voce gruppo proprietario definisce le autorizzazioni del gruppo proprietario del file. Il superuser può modificare il proprietario o il gruppo proprietario tramite il comando chown o chgrp, nel quale caso le voci del proprietario e del gruppo proprietario faranno riferimento al nuovo proprietario e al nuovo gruppo proprietario. Ogni voce utente denominato definisce le autorizzazioni dell'utente specificato nel campo del qualificatore della voce, ovvero il campo centrale nel formato testo illustrato nella Tabella 24.1, «Tipi di voci ACL». Ogni voce gruppo denominato definisce le autorizzazioni del gruppo specificato nel campo del qualificatore della voce. Il campo del qualificatore contiene un valore solo per le voci dell'utente denominato e del gruppo denominato. La voce altri definisce le autorizzazioni di tutti gli altri utenti.
La voce maschera limita ulteriormente le autorizzazioni concesse dalle voci utente denominato, gruppo denominato e gruppo proprietario in quanto definisce quali autorizzazioni di tali voci vengono effettivamente applicate e quali vengono mascherate. Se le autorizzazioni esistono sia in una delle voci menzionate che nella maschera, vengono applicate. Le autorizzazioni contenute solo nella maschera o solo nella voce non vengono applicate, il che significa che non vengono assegnate agli utenti. Tutte le autorizzazioni definite nelle voci proprietario e gruppo proprietario vengono sempre applicate. L'esempio riportato nella Tabella 24.2, «Mascheramento delle autorizzazioni di accesso» illustra il funzionamento di questo meccanismo.
Esistono due classi di ACL di base. Un ACL minimo contiene solo le voci per i tipi proprietario, gruppo proprietario e altri, che corrispondono ai bit di autorizzazione tradizionali per i file e le directory. Un ACL esteso include anche altri dati. Deve contenere una voce maschera e può contenere varie voci di tipo utente denominato e gruppo denominato.
Tabella 24.1. Tipi di voci ACL
|
Tipo |
Formato testo |
|---|---|
|
Proprietario |
|
|
Utente denominato |
|
|
Gruppo proprietario |
|
|
Gruppo denominato |
|
|
Maschera |
|
|
Altri |
|
Tabella 24.2. Mascheramento delle autorizzazioni di accesso
|
Tipo di voce |
Formato testo |
Autorizzazioni |
|---|---|---|
|
Utente denominato |
|
|
|
Maschera |
|
|
|
Autorizzazioni effettive: |
|
Nella Figura 24.1, «ACL minimo: voci ACL e bit di autorizzazione» e nella Figura 24.2, «ACL esteso: voci ACL e bit di autorizzazione» vengono illustrati rispettivamente un ACL minimo e un ACL esteso. Queste figure sono suddivise in tre blocchi. Il blocco a sinistra indica il tipo di voce ACL, il blocco centrale contiene un ACL di esempio e il blocco a destra indica i bit di autorizzazione corrispondenti in base al concetto tradizionale di autorizzazione, ad esempio visualizzati da ls
-l. In entrambi i casi, le autorizzazioni della classe del proprietario vengono mappate alla voce ACL proprietario. Le autorizzazioni della classe degli altri utenti vengono mappate alla voce ACL corrispondente. La mappatura delle autorizzazioni della classe del gruppo è invece diversa nei due casi.
Nel caso di un ACL minimo, senza la voce maschera, le autorizzazioni della classe del gruppo vengono mappate alla voce ACL gruppo proprietario. Questo meccanismo è illustrato nella Figura 24.1, «ACL minimo: voci ACL e bit di autorizzazione». Nel caso di un ACL esteso, con la voce maschera, le autorizzazioni della classe del gruppo vengono mappate alla voce maschera. Questo meccanismo è illustrato nella Figura 24.2, «ACL esteso: voci ACL e bit di autorizzazione».
Questo tipo di mappatura garantisce un'agevole interazione tra le applicazioni, indipendentemente dal fatto che sia disponibile il supporto ACL. Le autorizzazioni di accesso assegnate tramite i bit di autorizzazione rappresentano il limite superiore per tutte le altre «ottimizzazioni» eseguite con un ACL. Le modifiche apportate ai bit di autorizzazione vengono aggiornate nell'ACL e viceversa.
Nell'esempio riportato di seguito viene illustrata la gestione degli ACL di accesso.
Prima di creare la directory, utilizzare il comando umask per definire le autorizzazioni di accesso da mascherare ogni volta che viene creato un oggetto file. Il comando umask
027 imposta le autorizzazioni di default assegnando al proprietario l'intera gamma di autorizzazioni (0), negando l'accesso in scrittura per il gruppo (2) e negando qualsiasi autorizzazione a tutti gli altri utenti (7). Il comando umask di fatto maschera o disattiva i bit di autorizzazione corrispondenti. Per informazioni, vedere la documentazione corrispondente (man
umask).
Il comando mkdir mydir crea la directory mydir con le autorizzazioni di default definite da umask. Utilizzare ls -dl mydir
per verificare che tutte le autorizzazioni siano state assegnate in modo corretto. L'output relativo a questo esempio è il seguente:
drwxr-x--- ... tux project3 ... mydir
Il comando getfacl mydir
consente di verificare lo stato iniziale dell'ACL e fornisce informazioni quali:
# file: mydir
# owner: tux
# group: project3
user::rwx
group::r-x
other::---
L'output del comando getfacl riflette con precisione la mappatura dei bit di autorizzazione e delle voci ACL descritta nella Sezione 24.3.1, «Voci ACL e bit di autorizzazione in modalità file». Nelle prime tre righe di output vengono indicati il nome, il proprietario e il gruppo proprietario della directory. Le tre righe successive contengono le tre voci ACL proprietario, gruppo proprietario e altri. Trattandosi di un ACL minimo, il comando getfacl non genera le informazioni fornite dal comando ls.
Modificare l'ACL per assegnare le autorizzazioni di lettura, scrittura ed esecuzione a un utente aggiuntivo denominato geeko e un gruppo aggiuntivo denominato mascots con il seguente comando:
setfacl -m user:geeko:rwx,group:mascots:rwx mydir
L'opzione -m indica a setfacl di modificare l'ACL esistente. L'argomento successivo indica le voci ACL da modificare. Per separare voci multiple viene utilizzata la virgola. La parte finale specifica il nome della directory a cui devono essere applicate queste modifiche. Utilizzare il comando getfacl per esaminare l'ACL risultante.
# file: mydir # owner: tux # group: project3 user::rwx user:geeko:rwx group::r-x group:mascots:rwx mask::rwx other::---
Oltre alle voci inizializzate per l'utente geeko e il gruppo mascots, è stata generata una voce maschera. La voce maschera viene impostata automaticamente per rendere effettive tutte le autorizzazioni. Il comando setfacl adatta automaticamente le voci maschera esistenti in base alle impostazioni modificate, a meno che questa funzionalità non venga disattivata tramite l'opzione -n. La voce maschera definisce le autorizzazioni di accesso massime effettive per tutte le voci della classe del gruppo, tra cui utente denominato, gruppo denominato e gruppo proprietario. I bit di autorizzazione della classe del gruppo visualizzati dal comando ls
-dl mydir ora corrispondono alla voce maschera.
drwxrwx---+ ... tux project3 ... mydir
La prima colonna dell'output ora contiene un carattere + aggiuntivo che indica la disponibilità di un ACL esteso per questo elemento.
In base all'output del comando ls, le autorizzazioni per la voce maschera includono l'accesso in scrittura. Tali bit di autorizzazione normalmente indicherebbero che il gruppo proprietario, in questo caso project3, dispone dell'accesso in scrittura alla directory mydir. Le autorizzazioni di accesso effettive di cui dispone il gruppo proprietario, tuttavia, risultano dalla sovrapposizione delle autorizzazioni definite per il gruppo proprietario e per la voce maschera, in questo esempio r-x (vedere la Tabella 24.2, «Mascheramento delle autorizzazioni di accesso»). Per quanto riguarda le autorizzazioni effettive del gruppo proprietario in questo esempio, nulla è cambiato dopo l'aggiunta delle voci ACL.
Modificare la voce maschera tramite il comando setfacl o chmod. Utilizzare ad esempio chmod g-w mydir
. Il comando ls -dl mydir
visualizzerà quindi le seguenti informazioni:
drwxr-x---+ ... tux project3 ... mydir
Il comando getfacl mydir
fornisce il seguente output:
# file: mydir # owner: tux # group: project3 user::rwx user:geeko:rwx # effective: r-x group::r-x group:mascots:rwx # effective: r-x mask::r-x other::---
Dopo l'esecuzione del comando chmod per la rimozione dell'autorizzazione di scrittura dai bit della classe del gruppo, le informazioni contenute nell'output del comando ls sono sufficienti per capire che i bit della voce maschera sono stati modificati di conseguenza: l'autorizzazione di scrittura risulta di nuovo assegnata solo al proprietario di mydir. Questa situazione è confermata dall'output del comando getfacl. Questo output include un commento per tutte le voci in cui i bit di autorizzazione effettivi non corrispondono alle autorizzazioni originali perché vengono filtrati in base alla voce maschera. Le autorizzazioni originali possono essere ripristinate in qualsiasi momento tramite il comando chmod g+w mydir
.
Alle directory è possibile assegnare un ACL di default, ovvero un tipo speciale di ACL che definisce le autorizzazioni di accesso ereditate dagli oggetti creati in tale directory. L'ACL di default ha effetto sia sulle sottodirectory che sui file.
Le autorizzazioni dell'ACL di default di una directory possono essere passate ai file e alle sottodirectory in essa contenuti in due diversi modi:
Una sottodirectory eredita l'ACL di default della directory superiore sia come ACL di default che come ACL di accesso.
Un file eredita l'ACL di default come ACL di accesso.
Tutte le chiamate di sistema che creano oggetti file system utilizzano un parametro mode che definisce le autorizzazioni di accesso del nuovo oggetto file system creato. Se la directory superiore non dispone di un ACL di default, i bit di autorizzazione definiti dal comando umask vengono sottratti dalle autorizzazioni passate dal parametro mode e il risultato viene assegnato al nuovo oggetto. Se la directory superiore dispone di un ACL di default, i bit di autorizzazione assegnati al nuovo oggetto sono determinati dalla sovrapposizione delle autorizzazioni del parametro mode e di quelle definite nell'ACL di default. Il comando umask in questo caso viene ignorato.
Nei tre esempi riportati di seguito vengono illustrate le operazioni principali da eseguire per le directory e gli ACL di default:
Aggiungere un ACL di default alla directory esistente mydir con il seguente comando:
setfacl -d -m group:mascots:r-x mydir
L'opzione -d del comando setfacl indica a setfacl di apportare nell'ACL di default le modifiche indicate dall'opzione -m successiva.
Di seguito viene riportato il risultato di questo comando:
getfacl mydir # file: mydir # owner: tux # group: project3 user::rwx user:geeko:rwx group::r-x group:mascots:rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:mascots:r-x default:mask::r-x default:other::---
Il comando getfacl restituisce sia l'ACL di accesso che l'ACL di default. L'ACL di default comprende tutte le righe che iniziano con default. Anche se il comando setfacl è stato eseguito con una sola voce relativa al gruppo mascots per l'ACL di default, sono state copiate automaticamente tutte le altre voci dell'ACL di accesso per creare un ACL di default valido. Gli ACL di default non hanno un effetto immediato sulle autorizzazioni di accesso. Vengono utilizzati solo quando viene creato un oggetto file system. Questi nuovi oggetti ereditano le autorizzazioni solo dall'ACL di default della directory superiore.
Nell'esempio successivo viene utilizzato il comando mkdir per creare una sottodirectory di mydir che eredita l'ACL di default.
mkdir mydir/mysubdir getfacl mydir/mysubdir # file: mydir/mysubdir # owner: tux # group: project3 user::rwx group::r-x group:mascots:r-x mask::r-x other::--- default:user::rwx default:group::r-x default:group:mascots:r-x default:mask::r-x default:other::---
Come previsto, la nuova sottodirectory creata mysubdir dispone delle autorizzazioni dell'ACL di default della directory superiore. L'ACL di accesso di mysubdir corrisponde esattamente all'ACL di default di mydir. Lo stesso dicasi per l'ACL di default che questa directory passerà agli oggetti subordinati.
Utilizzare il comando touch per creare un file nella directory mydir, ad esempio touch mydir/myfile
. Il comando ls -l mydir/myfile
visualizzerà quindi le seguenti informazioni:
-rw-r-----+ ... tux project3 ... mydir/myfile
L'output del comando getfacl mydir/myfile
è il seguente:
# file: mydir/myfile # owner: tux # group: project3 user::rw- group::r-x # effective:r-- group:mascots:r-x # effective:r-- mask::r-- other::---
Il comando touch utilizza un parametro mode con il valore 0666 per la creazione di nuovi file, il che significa che i file vengono creati con autorizzazioni di lettura e scrittura per tutte le classi di utenti, a condizione che non vengano imposte altre restrizioni nel comando umask o nell'ACL di default (vedere la Sezione 24.3.3.1, «Effetti di un ACL di default»). Questo in pratica significa che tutte le autorizzazioni di accesso non specificate nel valore di mode vengono rimosse dalle voci ACL corrispondenti. Nonostante dalla voce ACL della classe del gruppo non sia stata rimossa alcuna autorizzazione, la voce maschera è stata modificata per mascherare le autorizzazioni non impostate in mode.
Questo approccio garantisce un'agevole interazione tra le applicazioni, ad esempio i compilatori, tramite gli ACL. È possibile creare file con autorizzazioni di accesso limitate e successivamente contrassegnarli come eseguibili. Grazie al meccanismo del comando mask, questi file potranno essere eseguiti come desiderato dagli utenti e dai gruppi corretti.
Prima di consentire a un processo o un'applicazione di accedere a un oggetto file system protetto da un ACL, viene applicato un algoritmo di controllo. In genere, le voci ACL vengono esaminate nella seguente sequenza: proprietario, utente denominato, gruppo proprietario o gruppo denominato e altri. L'accesso viene gestito in base alla voce più adatta al processo. Le autorizzazioni non sono cumulative.
Se un processo appartiene a più gruppi ed è potenzialmente appropriato per più voci gruppo, la situazione diventa più complessa. Viene selezionata casualmente una voce tra quelle adatte contenenti le autorizzazioni necessarie. La voce che genera il risultato finale di «concessione dell'accesso» è irrilevante. In modo analogo, se nessuna delle voci gruppo adatte contiene le autorizzazioni necessarie, una voce selezionata casualmente genererà il risultato finale di «negazione dell'accesso».