Sinistra <- PW: LaTeX - Indice Generale - Copertina - SL: XMail -> Destra

Password


Le password di accesso al sistema

di Gabriele Zucchetta

L'articolo...

Descrizione dei meccanismi di creazione e controllo delle password da parte del sistema, con alcuni utili consigli sulla scelta di password affidabili.



Introduzione

L'accesso al sistema Linux, come in tutti i sistemi Unix like, avviene a seguito dell'autenticazione. Tramite questa procedura un utente si identifica sul computer al quale vuole accedere, specificando due parametri: login e password. Il login identifica l'utente (alcuni utilizzano il proprio nome, altri fantasiosi soprannomi), la password è una parola segreta. Il sistema appena descritto autentica l'utente e permette l'accesso solo a chi è autorizzato, scoraggiando coloro che vogliono impossessarsi dell'identità di altri. Se la password di un utente cade nelle mani di qualcuno, questi può effettuare operazioni sotto falsa identità, quali:

Comprendere come sono gestite le password è necessario per gli utenti e per gli amministratori di sistema per scongiurare queste pericolose eventualità.

Il file delle password

Se il sistema segue il "Filesystem Hierarchy Standard", uno standard che consiste in una serie di specifiche e guide per l'organizzazione delle directory e dei file nei sistemi operativi UNIX-like (http://www.pathname.com/fhs/), le password degli utenti sono memorizzate nel file /etc/passwd. Il file ha il seguente formato:

nomeutente:password:UID:GID:nomecompleto:directory:shell

Dove:

Funzioni one-way hash

È importante sottolineare che la password, per ovvi motivi di sicurezza, non è archiviata in chiaro (plain text), ma in forma codificata. La codifica viene effettuata da un programma che esegue un algoritmo detto funzione one-way hash. Una funzione hash permette di ottenere una stringa di lunghezza predeterminata partendo da un testo qualsiasi e specificando una chiave (parola). Una proprietà di queste funzioni è l'unicità della stringa ottenuta. Questa viene detta hash, checksum o fingerprint (in italiano si usa anche il termine impronta del messaggio). La lunghezza del'hash ottenuto non dipende dalla dimensione del testo da codificare o dalla chiave ma solo dal tipo di algoritmo di codifica usato (si veda la figura sottostante).

Immagine sulle funzioni hash

Le funzioni one-way hash applicano l'algoritmo non ad un testo ma ad una stringa nota. Ciò che si vuole ottenere è un hash che dipenda solo dalla chiave usata. Le funzioni di questo tipo hanno le seguenti proprietà:

La prima proprietà si rende necessaria per evitare che il sistema venga impegnato massicciamente dalla codifica. La seconda proprietà evita che sia possibile risalire alla chiave, conoscendone l'algoritmo di codifica e la sua forma codificata. Infine, la terza proprietà scongiura la possibilità che chiavi diverse abbiano la stessa stringa di codifica. Come detto, la lunghezza della stringa di hash é fissata dall'algoritmo e non dipende né dalla lunghezza del testo né dalla chiave usata. Attualmente, si utilizzano algoritmi che generano hash di lunghezza di 128 bit. Una dimensione compatibile che garantisce, allo stato attuale delle potenze di calcolo disponibili, tempi di applicazione rapidi ed un ottimo livello di sicurezza.

Crypt

Crypt è la funzione che effettua la codifica della password. Dalla pagina del manuale di crypt(3):

crypt è una funzione di criptaggio delle password. È basata sull'algoritmo Data Encryption Standard con alcune variazioni che (tra le altre cose) scoraggiano l'uso di implementazioni hardware per la ricerca delle chiavi.

Gli utenti non gestiscono le password direttamente con crypt, ma tramite il programma passwd (il quale, a sua volta, chiama crypt): il cambio della password richiede, appunto, l'aggiornamento del file delle password in maniera opportuna, cosa che crypt non è in grado di fare. Quando viene creato un utente solo l'amministratore di sistema può generare la password 2. Al primo inserimento della password, il sistema genera due sequenze S e Q che vengono memorizzate nel file delle password:

Insieme, sono la forma codificata della password. Terminata questa operazione, l'utente può autenticarsi sul sistema. Durante la fase di autenticazione il sistema esegue le seguenti operazioni:

La password viene accettata se i due hash coincidono. Crypt utilizza l'algoritmo di codifica DES (Data Encryption Standard) e, da tempo, è stata aggiunta un'estensione che permette di utilizzare l'algoritmo MD5. Quest'ultimo, dal punto di vista della sicurezza è da preferirsi al primo.

L'algoritmo DES nasce nel 1977 in casa IBM, dopo che nel 1973 il NIST (National Institute of Standards and Technology) sollecitò la necessità di un sistema di criptazione per i registri federali.
MD5 è stato sviluppato da Ronald L. Rivest (http://theory.lcs.mit.edu/rivest/homepage.html), egregio professore al MIT (Massachusetts Institute of Technology). Attualmente il sistema MD5 è considerato sicuro e da preferisi all'ormai datato sistema DES. I dettagli degli algoritmi esulano dallo scopo di questo articolo. Per approfondimenti si rimanda ai seguenti documenti:

Per ottenere la codifica della password, la funzione di codifica viene applicata ad una stringa vuota, utilizzando come chiave la password stessa (come detto la password viene perturbata opportunamente). Lo scopo non è quello di criptare un testo vuoto, ma di ottenere, a partire dalla password, una stringa (di lunghezza prefissata) che sia unica e impossibile da riprodurre senza la chiave originale. La funzione one-way hash garantisce l'unicità e l'irreversibilità della stringa ottenuta. Si vedano i manuali della propria distribuzione per i dettagli dell'installazione dei vari sistemi di codifica.

Il Brute forcing

Con il termine di brute forcing (forza bruta) o crack si intente l'operazione di ottenere, per tentativi, la forma in chiaro della password conoscendone la forma codificata e l'algoritmo di codifica. Questa operazione viene eseguita:

Tra i molti programmi disponibili per effettuare un brute forcing il più conosciuto è John the Ripper (http://www.openwall.com/john/). Il file README che lo accompagna lo descrive nel seguente modo:

John the Ripper è un password cracker, attualmente disponibile per sistemi UNIX, DOS, WinNT/Win95. Il suo primario scopo è quello di individuare password UNIX deboli.

Vi sono vari modi per effettuare il brute forcing. Per "modo" si intende la sequenza con cui si tentano le password. JTR permette di utilizzare i seguenti modi: incrementale, singolo, wordlist, esterno. Il modo incrementale consiste nel provare tutte le combinazioni di lettere (maiuscole e minuscole), numeri e simboli. Un sistema di questo tipo è fortemente sconsigliato in quanto richiede, in relazione alle potenze di calcolo attualmente disponibili, una quantità di tempo improponibile. Il modo singolo genera delle password partendo dalle informazioni degli utenti presenti sul file delle password (login, nome e cognome utente, ecc.). Questo metodo è molto rapido e, in genere, dopo pochi minuti individua le password di utenti più pigri e sprovveduti. Il metodo wordlist consiste nell'utilizzare parole presenti in un lista (un file di testo contenente, su ogni riga, una parola differente). Inoltre, è possibile abilitare regole di modifica delle parole: la lista di base viene ampliata con altre parole ottenute per elaborazione, in base ad opportune regole, delle parole originali. In rete sono disponibili una notevole quantità di wordlist. Con l'aiuto di un motore di ricerca è semplice trovarne. Il metodo esterno permette di definire, in maniera opportuna, un metodo personale per la generazione delle password. Per i dettagli dei metodi si rimanda alla documentazione che accompagna i sorgenti di JTR. L'uso di JTR, se non si hanno particolari esigenze, è alquanto semplice. Ammettiamo di dover elaborare un file di password che si chiama passwd.1. Immettendo il seguente comando:

$ john -single passwd.1

si avvia il programma in modalità singolo. Man mano che le password vengono trovate, queste sono registrate nel file john.pot. Per visualizzare questo file è sufficiente eseguire:

$ john -show passwd.1

Se si dispone di un file (words.lst) con una lista di possibili password, possiamo utilizzare la modalità wordlist eseguendo:

$ john -w:word.lst passwd.1

Se si vuole espandere il dizionario applicando le regole standard occorre eseguire:

$ john -w:word.lst -rules passwd.1

In questi ultimi due esempi, il tempo per l'esecuzione del programma potrebbe risultare lungo (soprattutto se la wordlist è di buone dimensioni).

La scelta della password

Non dovrebbe stupire il fatto che nel giro di pochi minuti JTR riesca ad indovinare qualche password. Questo è dovuto al fatto che difficilmente gli utenti sono accorti nel sceglierla. Si preferiscono, generalmente, corte e semplici per il terrore di dimenticarle. Dal momento che è possibile che un malintenzionato si impadronisca del file delle password, si dovrebbe riflettere sulla scelta della propria password. Semplici consigli possono aiutare a pensare una password abbastanza sicura:

Per evitare di scegliere password banali si possono utilizzare dei generatori di password, come makepasswd, apg o pwgen. Ad esempio, con pwgen (http://sourceforge.net/projects/pwgen), è sufficiente eseguire il programma specificando la lunghezza della password (8 caratteri è il valore predefinito), eventualmente con altre opzioni come "-c", che impone di utilizzare almeno un carattere maiuscolo, "-n", che impone di utilizzare almeno un carattere numerico e "-s", che provoca la generazione di password completamente casuali (quindi anche difficili da memorizzare).

Shadow password

Come detto, il file delle password contiene varie informazioni oltre alla password codificata. Per tale motivo, questo file deve essere leggibile agli utenti del sistema. Potete provare ad eliminare, da root, i permessi di lettura del file delle password ed eseguire il comando "ls -l". In questa condizione si ottengono gli ID degli utenti al posto dei loro nomi. Per scongiurare maliziose operazioni sul file delle password, è stato sviluppato il sistema delle shadow password. Letteralmente il significato è password in ombra. Il sistema consiste nello spostare le password in un file separato (generalmente /etc/shadow). Questo file è leggibile solo all'utente root. Impadronirsi delle password codificate sarà molto più complicato in un sistema dotato di shadow password. Inoltre, la suite aggiunge interessanti caratteristiche tra cui un sistema di invecchiamento e scadenza delle password. Questo permette di forzare gli utenti a cambiare periodicamente la propria password. Tutte le distribuzioni attuali includono questo sistema. Generalmente il sistema di installazione effettua una domanda per l'installazione delle shadow password. È sufficiente fare attenzione in fase di installazione e abilitare l'uso di questo sistema. Se il sistema delle shadow password è installato, il formato del file /etc/passwd cambia, diventando:

nomeutente:x:UID:GID:nomecompleto:directory:shell

La password codificata è a sostituita con una "x". Il file /etc/shadow ha il seguente formato:

nomeutente:password:ult:può:deve:avv:scad:disab:riservato

Dove:

Per una descrizione approfondita di questo sistema potete consultare il relativo HOWTO: http://it.tldp.org/HOWTO/Shadow-Password-HOWTO.html.

Considerazioni

Quanto visto dovrebbe far prendere coscienza sull'argomento trattato. Il sistema ha degli strumenti per difendere le password da persone malintenzionate. Tuttavia, questi possono non essere, sempre, sufficienti. Per tale motivo l'utente deve scegliere password sicure (meglio se generate casualmente) e cambiarle periodicamente. Gli algoritmi che permettono la codifica delle password sono stati solo descritti. Questo permette di comprenderne i meccanismi senza l'onere di entrare in dettagli complessi e lunghi. Per chi volesse approfondire questo argomento, un ottimo testo di criptografia è "Cryptography, Theory and Practice" di Douglas Stinson.



L'autore

Gabriele Zucchetta, laureato in Chimica con una tesi in meccanica molecolare. Chi lo vuole adulare può definirlo chimico computazionale. Da sempre è appassionato di informatica e convinto sostenitore del software libero. Utente Linux dal 1994.


Sinistra <- PW: LaTeX - Indice Generale - Copertina - SL: XMail -> Destra