5.4. Gestione degli ACL

Nella Tabella 5.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. 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 5.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 5.1. Tipi di voci ACL

Tipo

Formato testo

Proprietario

user::rwx

Utente denominato

user:name:rwx

Gruppo proprietario

group::rwx

Gruppo denominato

group:name:rwx

Maschera

mask::rwx

Altri

other::rwx

Tabella 5.2. Mascheramento delle autorizzazioni di accesso

Tipo di voce

Formato testo

Autorizzazioni

Utente denominato

user:geeko:r-x

r-x

Maschera

mask::rw-

rw-

Autorizzazioni effettive:

r--

5.4.1. Voci ACL e bit di autorizzazione in modalità file

Nella Figura 5.1, "ACL minimo: voci ACL e bit di autorizzazione" e nella Figura 5.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.

Figura 5.1. ACL minimo: voci ACL e bit di autorizzazione

ACL minimo: voci ACL e bit di autorizzazione

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 5.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 5.2, "ACL esteso: voci ACL e bit di autorizzazione".

Figura 5.2. ACL esteso: voci ACL e bit di autorizzazione

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.

5.4.2. Directory con un ACL di accesso

Specificando getfacl e setfacl nella riga di comando è possibile accedere agli ACL. Nell'esempio riportato di seguito viene illustrato l'utilizzo di questi comandi.

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 (pagina man unmask).

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::---
     

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 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 5.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 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.

5.4.3. Directory con un ACL di default

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.

5.4.3.1. Effetti di un ACL di default

Le autorizzazioni dell'ACL di default di una directory possono essere passate ai file e alle sottodirectory in essa contenuti in due 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.

5.4.3.2. Applicazione di ACL di default

Nei tre esempi riportati di seguito vengono illustrate le operazioni principali da eseguire per le directory e gli ACL di default:

  1. 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.

  2. 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.

  3. 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 5.4.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.

5.4.4. Algoritmo di controllo dell'ACL

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, 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".