>_ Sistemi operativi e Linux

Utenti, gruppi e sudo su Linux: gestire gli accessi

Come funzionano utenti e gruppi su Linux: UID, /etc/passwd e /etc/shadow, creare e modificare account, concedere privilegi con sudo e visudo.

Linux nasce come sistema multiutente: anche su un portatile usato da una sola persona convivono decine di account. Alcuni appartengono a esseri umani, la maggior parte a servizi come il server web o il database. Capire come sono organizzati utenti e gruppi serve a due cose molto concrete: dare a ciascuno solo i permessi di cui ha bisogno e capire perché un comando risponde «permesso negato».

Chi sei per il sistema

Per il kernel un utente non è un nome ma un numero, lo UID. Il nome serve solo a noi. L'utente root ha sempre UID 0 e può fare qualsiasi cosa. Gli account dei servizi hanno di solito UID bassi, mentre gli utenti umani partono da 1000 sulla maggior parte delle distribuzioni.

Tre comandi rispondono alla domanda «chi sono»:

whoami
id
groups

id è il più completo: mostra UID, gruppo principale e tutti i gruppi secondari a cui appartieni.

I file che descrivono gli account

File Contenuto
/etc/passwd nome, UID, gruppo principale, cartella home, shell
/etc/shadow hash delle password e scadenze, leggibile solo da root
/etc/group gruppi e loro membri

Una riga di /etc/passwd ha questo aspetto:

anna:x:1001:1001:Anna Rossi:/home/anna:/bin/bash

La x indica che la password non è qui ma in /etc/shadow. Gli account dei servizi hanno spesso come shell /usr/sbin/nologin, che impedisce di usarli per un accesso interattivo. Questi file si leggono volentieri ma si modificano con gli appositi comandi, non con un editor: un errore di sintassi può impedire a tutti di accedere.

Creare e modificare utenti

Su Debian e Ubuntu esiste adduser, interattivo e comodo; ovunque è disponibile useradd, più essenziale:

sudo useradd -m -s /bin/bash -c "Anna Rossi" anna
sudo passwd anna

L'opzione -m crea la cartella home, senza la quale l'utente si ritrova senza spazio proprio. Per le modifiche si usa usermod; l'operazione più comune è aggiungere un utente a un gruppo:

sudo usermod -aG docker anna

Attenzione alla a: senza di essa -G sostituisce l'elenco dei gruppi secondari invece di aggiungere, e l'utente può perdere di colpo l'accesso a sudo. La nuova appartenenza vale dal successivo accesso; fino ad allora id non la mostra.

Per bloccare temporaneamente un account senza cancellarlo si usa sudo usermod -L anna, che disattiva la password, oppure sudo chage -E 0 anna, che fa scadere l'account. Per eliminarlo, sudo userdel -r anna rimuove anche la cartella home: prima conviene una copia dei dati.

I gruppi: permessi condivisi

I gruppi permettono di dare un accesso a più persone senza toccare i permessi di ciascun file. Un esempio tipico: tre persone devono modificare i file di un sito in /srv/sito.

sudo groupadd web
sudo usermod -aG web anna
sudo usermod -aG web luca
sudo chgrp -R web /srv/sito
sudo chmod -R g+w /srv/sito
sudo chmod g+s /srv/sito

Il bit setgid sulla cartella fa sì che i nuovi file creati al suo interno ereditino il gruppo web, così il lavoro di uno resta modificabile dagli altri.

Alcuni gruppi hanno un significato speciale: sudo (Debian e Ubuntu) o wheel (Fedora e Arch) danno accesso ai privilegi di amministratore; docker permette di controllare i container ed equivale di fatto a un accesso da root; dialout consente di usare le porte seriali, utile con le schede di sviluppo.

sudo: amministrare senza essere root

Accedere direttamente come root è sconsigliato: ogni comando ha pieni poteri e non resta traccia di chi l'ha lanciato. sudo esegue un singolo comando con privilegi elevati, chiede la password dell'utente, non quella di root, e registra l'operazione nei log di sistema.

Le regole stanno in /etc/sudoers e nei file della cartella /etc/sudoers.d/. Vanno modificate sempre con:

sudo visudo

visudo controlla la sintassi prima di salvare. Un file sudoers rotto può lasciarti senza modo di diventare amministratore, e su un server remoto è un problema serio.

Una regola si legge così: chi, da quale host, come quale utente, quali comandi. Per esempio, per permettere a un utente di riavviare solo il server web:

luca ALL=(root) /usr/bin/systemctl restart nginx

Così Luca può fare quella singola operazione senza avere accesso completo al sistema. Concedere NOPASSWD: ALL è comodo ma elimina una barriera importante; ha senso solo per account di automazione ben protetti, e anche lì è meglio limitarlo ai comandi necessari.

Comandi utili per il controllo

  • sudo -l mostra cosa l'utente corrente può fare con sudo;
  • sudo -i apre una shell da root, da usare con parsimonia;
  • last elenca gli ultimi accessi al sistema;
  • who mostra chi è collegato in questo momento;
  • getent group sudo elenca i membri di un gruppo.

Nel mio lavoro, quando prendo in carico un server, uno dei primi controlli è proprio l'elenco degli account con una shell valida e dei membri dei gruppi amministrativi: account dimenticati di collaboratori passati sono un'apertura che nessuno sorveglia.

In sintesi

  • Per il sistema un utente è un UID; root ha UID 0 e nessun limite.
  • /etc/passwd, /etc/shadow e /etc/group si leggono, ma si modificano con i comandi appositi.
  • usermod -aG aggiunge a un gruppo; senza -a si perdono i gruppi esistenti.
  • sudo concede privilegi per singolo comando e lascia traccia; le regole si cambiano con visudo.
  • Rivedere periodicamente account e gruppi amministrativi evita accessi dimenticati.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche