Tanto le macchine Linux generiche quanto i servizi specifici su di esse ospitati hanno necessità di disciplinare gli spazi d'azione dell’utenza. Si tratta di contesti multiutente in cui cioè più utenti possono accedere in maniera concorrente per utilizzarli. Ovviamente da ciò discende l’opportunità di compartimentare i file personali di ogni utente disciplinandone l’eventuale uso improprio da parte di altri utenti che non ne siano titolari o utilizzatori autorizzati. In questa lezione prenderemo dimestichezza con i principali concetti utili a gestire utenti e gruppi.
Il repository dei dati utente può essere ospitato sulla macchina che stiamo utilizzato o anche essere, rispetto a questa, esterno. Nel secondo caso potrebbe venire ospitato su uno più un server LDAP (Lightweight Directory Access Protocol), NIS (Network Information Service) o Windows Domain. Tutti questi sistemi hanno diversi punti di forza e di debolezza e potrà essere per noi conveniente adoperare l’uno o l’altro in funzione delle nostre specifiche esigenze. In ogni caso, per comprendere il senso generale dell’argomento che stiamo trattando, ci concentreremo al momento su quello più diffuso e anche di implementazione più immediata ovvero immagineremo di effettuare la gestione utenti nel modo Linux standard quindi in locale.
La nostra base utenti sarà pertanto configurata partendo da alcune directory e file ospitati direttamente sul filesystem locale. I tre file principali sono /etc/passwd , dove saranno conservate le informazioni principali per ogni utente, /etc/shadow che contiene le password di ogni utente ed /etc/group che presenta i raggruppamenti degli utenti in insiemi per assegnare a ogni insieme caratteristiche particolari.
Osserviamo /etc/passwd , ogni riga è implementata nella forma: username:password:uid:gid:full_name:home_directory:default_shell
mentre /etc/shadow è implementato in questa forma: username:password:lastmod:mindays:maxdays:daywarn:disableddays:expire
fprincipe@html3:~$ more /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
[...]
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
[...]
fprincipe:x:1000:1004:Francesco Principe:/home/fprincipe:/bin/bash
user1:x:1001:1005::/home/user1:/bin/sh
user2:x:1002:1006::/home/user2:/bin/sh
user3:x:1003:1007::/home/user3:/bin/sh
fprincipe@html3:~$ sudo more /etc/shadow
root:*:17647:0:99999:7:::
[...]user3:!:17682:0:99999:7:::
usertest:$6$7qi5cmwa$QU6rcPZzq1ZXfNRUz70Tu4nB1EpXcR3GwcxrfX590KVn0LVi
8b5/10AYVFV.JgcEZvPk4W9ttQxPToydUo4rm.:17682:0:99999:7:::
Ci troviamo di fronte a una lista di utenti e di password a questi associate. La prima cosa che salta all’occhio è la disposizione logica in righe-colonne e il fatto che siano presenti di norma anche utenze che non sono state inserite consapevolmente e manualmente da noi. Infatti alcune utenze risiedono in questa lista poiché determinati processi saranno associati a esse. Sono state aggiunte a corredo di particolari installazioni e configurazioni. A esempio l’utente www-data è adottato da alcune distribuzioni e da alcuni servizi per il web. Consente di assegnare una proprietà esclusiva ai file che dovranno essere resi disponibili creando un ambiente sicuro che limiterà la possibilità di utilizzare il relativo processo in esecuzione per carpire malevolmente o veicolare in maniera maldestra informazioni che esulano da quanto previsto. Andiamo a esaminare nel dettaglio i file sopra riportati attraverso la tabella a seguire.
Username | Identifica l'utenza mediante il suo id alfanumerico. Ad esempio, sulla macchina che utilizzando per i test di questo capitolo, fprincipe è quello associato alla mia utenza principale. |
Password | In /etc/passwd questo campo è un elemento vestigiale, rimasuglio di un uso passato, adesso il segnaposto “x” è presente ove una volta era inserita la password vera e propria ma che nelle implementazioni più recenti è stata spostata presso altri contenitori. In /etc/shadow compare la password ma in forma criptata. |
UID | E' l’identificativo numerico dell’utente. In genere è un numero progressivo. L’utente root è 0. Il primo UID utile per altri utenti fisici, su questa macchina di test, sarà 1001 e poi a seguire in progressione se non specificato diversamente. |
GID | In questo campo troveremo l’identificativo numerico del principale gruppo associato all’utente. |
Full Name | E' il nome per esteso relativo all’utenza. Nel caso di utenti fisici spesso è il nome vero e e proprio della persona in questione. Come potete vedere, per l’appunto, nella riga che inizia con fprincipe il campo appena descritto è popolato come “Francesco Principe”. |
Home Directory | Qui è riportato il percorso assoluto che rimanda alla directory in cui dovrebbero essere confinati i file dell’utente. E’ di norma la directory che viene presentata come posizione corrente del filesystem all’atto del login con lo specifico utente. |
Default Shell | E' la shell, intesa come percorso assoluto dell’eseguibile, che viene fatta partite quale interprete dei comandi di default all’atto del lancio di un nuovo terminale per l’utente. |
Lastmod | In questo campo è inserito il computo dei giorni trascorsi tra il capodanno del 1970 (data di riferimento) e l’ultima modifica. |
Mindays | Quantità di giorni in cui una nuova password non può essere modificata. Con 0 indichiamo che la password può essere modificata subito dopo essere stata scelta. |
Maxdays | Quantità di giorni entro i quali la password corrente deve essere modificata con una nuova password. 99999 indica che la password non scadrà. |
Daywarn | Numero di giorni prima della scadenza della password in cui l’utente riceverà un avviso a ogni apertura di terminale. |
Disableddays | Qui è riportato il numero di giorni di dalla scadenza della password entro i quali sarà comunque possibile utilizzare l’utenza. Se questo campo è vuoto indica che la funzione non è adottata per l’utenza in questione. |
Expire | Sempre partendo dal capodanno del 1970 è indicato il numero di giorni per cui l’utenza è valida prima che sia resa non utilizzabile. |
Stesso discorso per /etc/group che codifica ogni gruppo con una riga nella forma: name:password:id:user1,usern
fprincipe@html3:~$ more /etc/group
root:x:0:
[...]
adm:x:4:syslog,fprincipe
[...]
sudo:x:27:fprincipe
[...]
fprincipe:x:1004:
user1:x:1005:
user2:x:1006:
user3:x:1007:
[...]
Name specifica il nome del gruppo, Password è un campo privo di usi reali, Id è l’identificativo numerico del gruppo, user1,usern una lista di utenti separati da virgole assegnati al gruppo.
Per completare l’introduzione sarà utile studiare un altro paio di file, in particolare /etc/default/useradd ed /etc/login.defs nonché la directory /etc/skel. Vi esortiamo a esplorarli in autonomia poiché alla luce di quanto abbiamo già presentato non sarà necessario dilungarsi in spiegazioni ridondanti. Tutto vi apparirà abbastanza chiaro a valle di qualche istruzione preliminare. Questi tre elementi fotografano il modello di “nuovo utente” fornendo i valori di default per alcune opzioni che potremmo decidere di omettere in fase di creazione di una nuova utenza. A esempio potremo specificare di associare tutti i nuovi utenti a un gruppo di default con GROUP così come renderli membri di gruppi aggiuntivi con GROUPS, specificare la shell attiva al login con SHELL oppure la directory skeletal da copiare come iniziale all’atto della creazione di un nuovo utente (mediante SKEL) oltre a molti altri paramatri il cui uso potrete apprendere facilmente grazie ai commenti esplicativi riportati direttamente nei file.
Nel prossimo capitolo accenneremo ai principali comandi da CLI per gestire utenti e gruppi.