UNIX/Linux: gestione delle password

Molti di voi si chiederanno come vengono gestite le password nei sistemi UNIX like, tra i quali Linux. Ebbene, la gestione delle password in tali sistemi operativi si può svolgere essenzialmente in due modi: tramite il file passwd oppure tramite i file passwd e shadow.

Nel primo caso le password verranno salvate (insieme alla informazioni relative all’utente proprietario dell’account) all’interno di un unico file, ovvero passwd. Per ragioni di sicurezza, tale file è accessibile in lettura e scrittura solo dal superutente (o amministratore di sistema). Nel secondo caso, invece, in passwd verranno memorizzate solo le informazioni relative all’utente, mentre la password verrà memorizzata all’interno del file shadow (anche questi file sono accessibili solo al superuser). Quest’ultima non verrà salvata in chiaro, ma subirà un’opportuna operazione di cifratura.

E’ molto interessante, inoltre, andare a capire come si articola la fase di cifratura della password, precedente al salvataggio della stessa all’interno di passwd (nel primo caso) o di shadow (nel secondo caso).

Prima di descrivere dettagliatamente l’algoritmo di cifratura, bisogna notare che esistono diversi modi per effettuare tale operazione: usare un algoritmo di cifratura one-way come MD5, il quale crea un digest (impronta) da 128 bit, oppure usare una versione modificata dell’algoritmo DES.

L’algoritmo di cifratura che mi accingo a descrivere è proprio la versione modificata del DES. Sostanzialmente, esso si articola nei seguenti passi:

1) La password scelta dall’utente per il suo account verrà automaticamente troncata ad 8 caratteri, se quest’ultima presenta una lunghezza maggiore. Nel caso in cui, invece, la password ha una lunghezza inferiore agli otto caratteri, ad essa verrà aggiunto del padding (costituito esclusivamente da zeri). Ognuno degli otto caratteri verrà rappresentato attraverso caratteri ASCII a 7 bit (ovvero la prima versione di codice ASCII, nata per le telescriventi ed opportunamente rimpiazzata dalla versione ad 8 bit). Sapendo che il DES utilizza chiavi da 56 bit, e che ciascuno degli otto caratteri viene rappresentato tramite ASCII a 7 bit, possiamo notare che la dimensione della chiave che verrà generata sara proprio pari a 8*7 = 56 bit.

2) Imposto un IV (vettore di inizializzazione) da 64 bit, dove ogni bit è pari a 0, il quale rappresenta l’ingresso del primo ciclo di cifratura. Successivamente darò in pasto al DES la chiave da 56 bit precedentemente generata ed il salt. E’ proprio il salt a rappresentare l’elemento su cui si basa la modifica del DES utilizzata in questo contesto. In particolare, esso è costituito da 12 bit, generati a partire dal timestamp (ovvero data ed ora) in cui viene creato l’account.

3) Dopo la prima cifratura, in cui l’ingresso è rappresentato da un IV i cui bit sono tutti impostati a 0, eseguo altri 24 cicli di cifratura, in cui l’ingresso del ciclo n è l’uscita del ciclo n-1. Alla fine di tutti e 25 i cicli otterrò in uscita 11 caratteri da 6 bit, più due caratteri aggiuntivi dovuti al salt (6 bit + 6 bit = 12 bit, ovvero la dimensione originaria del salt). 

4) I 13 caratteri così ottenuti verranno salvati all’interno del file passwd, oppure nel file shadow.

E’ lecito chiedersi come faccia il sistema a verificare, dopo che l’account è stato creato, che l’utente abbia inserito la password corretta per loggarsi. La procedura è molto semplice: quando l’utente inserisce la password per il login, il sistema non fa altro che cifrare la password appena inserita usando il salt originario (relativo cioè al timestamp in cui l’account è stato creato) e confrontare le due stringhe cifrate. Se esse coincidono, il login avverrà con successo, viceversa verrà segnalato l’errore.

Affinchè possa essere recuperato il salt originario, esso, al momento della creazione dell’account e quindi della scelta della password, verrà salvato nel file passwd o shadow, insieme all’ID dell’utente. Infatti, ad ogni password è associato un ID utente, che consente al sistema di riconoscere a quale utente una particolare password si riferisce (e quindi chi sta cercando di loggarsi).

Ma perchè utilizzare una versione modificata del DES anzichè il DES puro? Semplicemente perchè il DES puro non viene più considerato come algoritmo di cifratura sicuro (è stato crackato per la prima volta nel 1998 da un computer costruito ad hoc, denominato appunto DES Cracker). L’aggiunta del salt consente inoltre di:

1) Evitare che due o più utenti utilizzino la stessa password, in quanto il salt si basa sulla data e l’ora (timestamp) in cui è stato creato l’account, quindi sarà diverso per due o più utenti diversi (non è possibile, ad esempio, che la creazione di due account su uno stesso sistema avvenga contemporaneamente).

2) Aumentare la lunghezza della password cifrata, aggiungendogli 12 bit, quindi 2^12, ovvero 4096 tentativi in più per decifrare la password, nel caso in cui si utilizzi un approccio a forza bruta.

3) Evitare che il DES venga implementato a livello hardware, facilitando la realizzazione di attacchi bruteforce.

A livello di sistema, il DES modificato viene realizzato dal comando crypt, il quale si basa su una libreria scritta in C, cioè crypt(3). Per ulteriori informazioni relative all’argomento trattato in questo post andate su  http://en.wikipedia.org/wiki/Crypt_(Unix).

A presto.

UNIX/Linux: gestione delle passwordultima modifica: 2009-01-04T17:05:33+01:00da nazarenolatella
Reposta per primo quest’articolo