Il problema
Ogni account che può autenticarsi è una porta. Molte di queste porte non servono: account di servizio creati dai pacchetti, utenti di test mai rimossi, account di ex collaboratori. Un attaccante che fa bruteforce o riusa credenziali trapelate cerca proprio queste porte dimenticate. Il primo lavoro di hardening sugli account è sapere chi c’è e chiudere ciò che non deve entrare.
Leggere passwd e shadow
Gli account vivono in due file. /etc/passwd (leggibile da tutti) elenca gli account; /etc/shadow
(solo root) tiene gli hash delle password e le policy di scadenza.
|
|
Il campo chiave per la sicurezza è l’ultimo: la shell. Un account di servizio non deve avere una shell interattiva.
|
|
Account di servizio: niente login
I demoni (nginx, postgres, …) girano sotto account dedicati che non devono poter fare login. La
shell corretta per loro è /usr/sbin/nologin (o /bin/false): se qualcuno prova ad autenticarsi,
viene rifiutato.
|
|
Attenzione a NP (nessuna password): un account senza password che accetta login è un buco grave.
|
|
Scadenza e policy
chage gestisce la vita di una password: scadenza, intervallo minimo/massimo, avviso. Non abusarne
(password che scadono troppo spesso spingono a sceglierne di deboli), ma su account sensibili serve.
|
|
Mantenere pulito l’elenco
|
|
|
|
Il gruppo docker merita una nota: chi vi appartiene può, di fatto, diventare root (montando il filesystem host in un container). Trattalo come appartenenza a wheel/sudo.
Domanda: gli account di servizio li crea il gestore pacchetti già configurati con nologin. Perché controllarli a mano se la distribuzione fa la cosa giusta di default?
Perché "di default" copre il caso pulito ma non la realtà di un sistema vissuto, ed è proprio nelle deviazioni dal default che si annidano i problemi. Primo, non tutti i pacchetti sono scrupolosi: software di terze parti, script di installazione scaricati, vecchi pacchetti o configurazioni ereditate possono creare account con shell di login "perché era comodo durante lo sviluppo". Secondo, i sistemi cambiano mano: un account creato nologin può essere modificato nel tempo — qualcuno gli dà una shell per fare debug e non la toglie, un ripristino da backup riporta una vecchia configurazione, una migrazione copia account senza rivederli. Terzo, il controllo non serve solo a trovare l'errore del packager, ma a mantenere una baseline: sapere esattamente quali account esistono e quali possono autenticarsi è ciò che ti permette di accorgerti se ne compare uno nuovo e inatteso — che è uno dei segni classici di una compromissione (un attaccante che si crea un account di persistenza). Non stai sfiduciando la distribuzione: stai costruendo la conoscenza di "cosa è normale" sul tuo sistema, senza la quale non puoi riconoscere l'anomalia. Il comando che elenca gli UID 0 o gli account senza password costa secondi e va messo tra i controlli periodici proprio perché l'unico momento in cui scopri un account di troppo non dev'essere dopo che è stato usato contro di te.
Conclusione
Sapere quali account esistono, dare nologin ai servizi, bloccare le password inutili, sorvegliare chi
ha UID 0 e le appartenenze a gruppi potenti: è l’igiene base degli accessi. Ma decidere chi può
entrare è metà del lavoro; l’altra metà è cosa ciascuno può toccare una volta dentro — i permessi
dei file, prossimo capitolo.