# Shadow (Unix)

Quello delle shadow password è un meccanismo presente su vari sistemi operativi Unix e Unix-like (come ad esempio GNU/Linux) per memorizzare in forma crittografata le password di autenticazione al sistema in file accessibili solo ad utenti privilegiati (ad esempio l'utente root), in modo da rendere più difficoltoso ottenere i dati necessari per effettuare un attacco a forza bruta per scoprire le password.
Con tale meccanismo, la password cifrata viene memorizzata nel file /etc/shadow, che tramite il meccanismo dei permessi è accessibile in lettura e scrittura solo ad utenti privilegiati (root); le password cifrate non sono quindi più memorizzate nel file /etc/passwd, che è invece accessibile in lettura a tutti gli utenti del sistema, ed al loro posto vi si trova una semplice x, ad indicare che il valore è memorizzato altrove.
I programmi che necessitano di effettuare autenticazione possono operare in due modi:
* essi sono eseguiti direttamente con i privilegi necessari per leggere il file /etc/shadow;
* essi ricorrono ad un programma esterno che, tramite i permessi setuid e setgid, acquisisce i privilegi necessari per effettuare la sola operazione di verifica di una password.
Il file /etc/shadow, come il file /etc/passwd, sono file di testo, e quindi possono essere aperti con un editor di testo, come ad esempio Vi, Emacs, Gedit, Kate o Notepad.
Per modificare una password è necessario utilizzare il comando passwd.
Il comando pwconv permette di armonizzare i file /etc/shadow e /etc/passwd aggiungendo gli utenti mancanti ed eliminando gli utenti non utilizzati. pwconv acquisisce i dati dai file /etc/shadow e /etc/login.defs.
Nei sistemi FreeBSD e macOS esiste un meccanismo del tutto analogo, in cui le password cifrate sono memorizzate nei file /etc/master.password e /etc/spwd.db. Anche con AIX vi è un meccanismo simile, che memorizza le password cifrate nel file /etc/security/passwd.

## Formato del file /etc/shadow

Ogni riga descrive un utente del sistema, ed è composta da 9 campi separati dal delimitatore ":" (due punti).
Un esempio di file /etc/shadow:
I campi indicano, nell'ordine:
* Il nome utente (es. mariorossi).
* La password crittografata, oppure un asterisco per indicare che non è possibile effettuare direttamente il login con quell'utente (ma occorre prima autenticarsi con un altro utente, e poi impersonare quell'utente tramite i comandi su o sudo).
* La data dell'ultima modifica della password, come numero di giorni trascorsi dal 1º gennaio 1970 (es. 14671).
* Il numero minimo di giorni che devono trascorrere prima di poter modificare la password (es. 0).
* Il massimo numero di giorni che devono intercorrere tra una modifica e l'altra di una password (es. 90).
* Il numero di giorni di preavviso della scadenza della password (es. 6).
* Il numero di giorni trascorsi i quali una password scaduta comporta la disattivazione dell'account (7).
* La data di scadenza della password, come numero di giorni dal 1º gennaio 1970 (es. 14800).
* Un campo riservato per usi futuri (es. 9).
Le date assolute sono scritte in giorni a partire dal 1º gennaio 1970, per modificare la data di scadenza conviene utilizzare il comando usermod

## Comandi collegati

* Passwd
* Chfn
* Finger (Unix)
* chage
* login
* su
* useradd
* pwconv (Unix)
* usermod