Nelle scorse puntate abbiamo introdotto i comandi Linux che potrebbero servire per gestire una macchina remota via shell. Uno degli aspetti più importanti, soprattutto quando dobbiamo configurare un servizio o un’applicazione, è la gestione dei permessi di utenti e gruppi, come discusso qui. Per configurare correttamente i permessi delle risorse e/o applicazioni non basta conoscere i comandi chmod o chown, ma occorre capire (almeno a grandi linee) come sono organizzati i gruppi e gli utenti su Linux. Proviamo a introdurre l’argomento senza scendere troppo nei dettagli, enfatizzando l’approccio pratico.

Per vedere gli utenti attualmente loggati si usa il comando users, ma questo di solito è poco utile. Per sapere invece quali sono gli account disponibili sulla macchina, digitiamo

cat /etc/passwd

Non facciamoci ingannare dal nome del file: il file passwd non visualizza le password degli utenti, ma solo le informazioni utili all'amministratore per gestire i vari utenti, ovvero

nome:password:IDutente:IDgruppo:descrizione:home:startup

ad esempio

stefano:x:99:42:nessuna:/home/stefano:/bin/bash

descrive l’utente stefano, con password riservata (il simbolo x), avente ID utente 99 e assegnato al gruppo con ID 42. Questo gruppo è detto “primario”, come vedremo più avanti.

Dopo l’ID del gruppo seguono la descrizione (in questo caso “nessuna”), la cartella home di partenza (/home/stefano) e il programma da eseguire al momento del login (la shell /bin/bash).

Per sapere a che gruppi apparteniamo digitiamo groups (notare il plurale): verrà listato sullo schermo l'elenco dei gruppi di cui facciamo parte, di solito su una stessa riga. Per sapere invece quali sono i gruppi esistenti sulla macchina scriviamo

cat /etc/group

In questo caso, a seconda della distribuzione Linux, potremmo avere risultati leggermente diversi, per cui occorre un pò di buon senso. Il formato del file potrebbe essere

descrizione:nome:x:IDgruppo:ListaUtenti

oppure

nome:x:IDgruppo:ListaUtenti

Ad esempio, la riga adm:x:4:stefano indica il gruppo adm, avente ID = 4 e contenente un unico utente (stefano). Notiamo che il risultato del comando groups dovrebbe essere coerente con il risultato dell’istruzione

cat /etc/group | grep <nome utente>

A questo punto è lecito chiedersi: se l’utente appartiene a più di un gruppo, qual’è il significato del gruppo “primario” visualizzato nel file passwd? Il modo migliore di capirlo è forse quello di fare qualche prova. Iniziamo col creare un nuovo gruppo (se non abbiamo i privilegi di amministratore proviamo con su o sudo)

groupadd -g 84 prova

a cui assegniamo due nuovi utenti (se sbagliamo qualcosa, usiamo i comandi groupdel e userdel per rimuovere rispettivamente un gruppo o un utente)

useradd -g 84 -c "Utente di prova" pippo

useradd -G 84 -c "Utente di prova" pluto

Se adesso andiamo a sbirciare il contenuto del file /etc/group vedremo che solamente l’utente pluto appare nella lista di utenti del gruppo prova. Notiamo anche che Linux ha creato un nuovo gruppo, avente nome pluto, mentre non esiste alcun gruppo di nome pippo. Cos’è successo?

La differenza sta proprio nelle opzioni -g (minuscosa) e -G (maiuscola). Quando aggiungiamo un utente con l’ozione -g assegniamo all’utente il suo gruppo primario, cioè quello principale e obbligatorio. La regola vuole infatti che ogni utente deve appartenere ad un gruppo primario.

Con l’opzione -G specifichiamo invece i gruppi secondari cui appartiene l’utente, che sono opzionali (un utente potrebbe appartenere ad uno più gruppi secondari).

Possiamo finalmente capire cos’è successo: quando abbiamo creato l’utente pippo, abbiamo indicato il gruppo primario 84 (prova), il quale esisteva già. Linux a questo punto è contento, perché la regola “ogni utente deve appartenere ad un gruppo primario” è soddisfatta, per cui non è necessario fare altro. Quando invece abbiamo creato l’utente pluto, assegnando lo stesso gruppo 84 (prova) stavolta in qualità di gruppo secondario, abbiamo trascurato la regola del gruppo primario. Linux è intervenuto per aggiustare le cose, creando un gruppo omonimo all’utente (pluto), assegnato in automatico come gruppo primario all’utente appena creato.

Chiarita la differenza tra gruppo primario e gruppi secondari, possiamo tornare al file etc/group e spiegare meglio cosa si intende per “Lista utenti”. Dopo l’ID di un gruppo, Linux visualizza solo l’elenco degli utenti secondari, omettendo gli utenti primari. Nel nostro caso, siccome l’utente pippo ha come gruppo primario prova, egli non viene listato nella “Lista utenti” del file group. Se ci pensiamo un attimo, si tratta di una scelta ragionevole. Il gruppo primario di un utente appare già nel file passwd, quindi non è necessario ripetere l'informazione nel file group. Questo è uno dei motivi per cui nel file group troviamo solamente l’elenco degli utenti assegnati ai gruppi in modo secondario.

Se l’argomento è poco chiaro, non spacchiamoci la testa e mettiamo mano alla tastiera: il modo migliore di comprendere gruppi e utenti è fare qualche prova pratica, direttamente nella shell.

Come ultima avvertenza ricordiamo che l’unicità di un gruppo non è una proprietà reciproca, ovvero: ogni utente deve appartenere ad un gruppo primario, ma uno stesso gruppo può risultare il gruppo primario di parecchi utenti diversi. Possiamo pensare al gruppo primario come alla “residenza” di una persona: ogni individuo ha un indirizzo di residenza, ma in genere presso un particolare indirizzo possono abitare persone diverse.