Scroll to navigation

RANDOM(4) Linux Programmer's Manual RANDOM(4)

NOME

random, urandom - dispositivi kernel che producono numeri casuali

DESCRIZIONE

I file speciali a caratteri /dev/random e /dev/urandom (presenti a partire da Linux 1.3.30) forniscono un'interfaccia al generatore del kernel di numeri casuali. Il file /dev/random ha numero primario 1 e numero secondario 8. Il file /dev/urandom ha numero primario 1 e numero secondario 9.

Il generatore di numeri casuali raccoglie rumore di fondo dai dispositivi dei driver e da altre sorgenti nel pozzo d'entropia. Il generatore mantiene anche una stima del numero di bit di rumore nel pozzo di entropia. Da questo pozzo di entropia vengono creati i numeri casuali.

Quando viene letto, il dispositivo /dev/random restituisce solo un numero di byte casuali compatibili con la stima dei bit di rumore nel pozzo d'entropia. /dev/random dovrebbe essere adatto ad usi che richiedono un alto grado di casualità, come la generazione di chiavi. Quando il pozzo d'entropia è vuoto, le letture di /dev/random vengono bloccate finché non viene raccolto abbastanza rumore ambientale.

La lettura del dispositivo /dev/urandom non bloccherà l'attesa di ulteriore entropia. Di conseguenza, se non c'è abbastanza entropia nel pozzo d'entropia, i valori restituiti sono teoricamente vulnerabili ad un attacco crittografico sull'algoritmo usato dal driver. Nella letteratura attualmente non classificata non c'è prova di un metodo per fare ciò, ma è in teoria possibile che un attacco del genere esista. Se questo è fonte di problemi per la propria applicazione, si usi invece /dev/random.

Uso

Se non si è sicuri di quale programma usare, /dev/random o /dev/urandom, probabilmente la scelta migliore è l'ultimo. Come regola generale, si dovrebbe usare per tutto /dev/urandom, fatta eccezione per chiavi GPG/SSL/SSH esistenti da molto tempo.

Se si salva un file seed ai riavvii, come raccomandato (tutte le più importanti distribuzioni Linux lo fanno almeno dal 2000), l'output sarà crittograficamente al sicuro dagli attaccanti senza accesso di root in locale dato che viene ricaricato nella sequenza di boot, e sarà perfettamente adeguato alle chiavi criptate per le sessioni di rete. Dato che le letture da /dev/random possono bloccarsi, gli utenti solitamente vorranno aprirlo in modo non bloccante (o eseguire una lettura senza timeout), e fornire un qualche tipo di notifica se l'entropia desiderata non è immediatamente disponibile.

Il generatore di numeri casuali del kernel è stato sviluppato per produrre un piccolo quantitativo di materiale di seed di alta qualità, necessario a creare un generatore di numeri pseudo-casuali crittografico (CPRNG). È stato creato per essere sicuro, non per essere veloce, e non è adatto a generare grandi quantità di dati casuali. Gli utenti dovrebbero creare una piccola quantità di materiale di seed da leggere da /dev/urandom (e /dev/random): leggere grandi quantitativi di dati da questi dispositivi avrà un impatto negativo sugli altri utenti dei dispositivi.

La quantità di materiale di seed richiesto per generare una chiave crittografica è uguale alla dimensione reale della chiave. Per esempio, una chiave privata RSA a 3072 bit o una Diffie-Hellmann ha una dimensione effettiva di 128 bit (e richiede circa 2^128 operazioni per essere forzata), quindi un generatore di chiavi avrà bisogno solo di 128 bit (16 byte) di materiale di seed da /dev/random.

Anche se alcuni fattori oltre a questo minimo sono ragionevoli, per premunirsi da difetti nell'algoritmo CPRNG nessuno dei primitivi crittografici disponibili oggi può promettere più di 256 bit di sicurezza; quindi se un programma legge più di 256 bit (32 byte) dal pozzo di casualità del kernel per ogni chiamata, o per ogni intervallo ragionevole di seed (non meno di un minuto), vuol dire che la crittografia di quel programma non è stata abilmente implementata.

Configurazione

Se il sistema non comprende già /dev/random/dev/urandom, li si può creare coi seguenti comandi:


mknod -m 644 /dev/random c 1 8
mknod -m 644 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom

Quando un sistema Linux viene avviato senza molta interazione da parte di un utente, il pozzo d'entropia potrebbe essere in una condizione tutto sommato prevedibile. Questo porta a sovrastimare la quantità di rumore realmente presente nel pozzo d'entropia. Per contrastare questo effetto, può aiutare riportare le informazioni nel pozzo d'entropia fra un arresto e un riavvio. Per farlo, si aggiungano le righe seguenti ad uno script appropriato che venga eseguito durante le procedure di avvio di un sistema Linux:

	echo "Inizializzazione del generatore di numeri casuali..."
	random_seed=/var/run/random-seed
	# Porta il seme casuale da un avvio al successivo
	# Carica e successivamente salva l'intero pozzo di entropia
	if [ -f $random_seed ]; then
	    cat $random_seed >/dev/urandom
	else
	    touch $random_seed
	fi
	chmod 600 $random_seed
	poolfile=/proc/sys/kernel/random/poolsize
	[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
	dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

Inoltre, si aggiungano le righe seguenti ad uno script appropriato da eseguire durante le procedure di arresto di un sistema Linux:

	# Riporta un seme casuale dall'arresto al riavvio.
	# Salva l'intero pozzo di entropia
	echo "Salvataggio del seme casuale..."
	random_seed=/var/run/random-seed
	touch $random_seed
	chmod 600 $random_seed
	poolfile=/proc/sys/kernel/random/poolsize
	[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
	dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

Interfaccia /proc

I file nella directory /proc/sys/kernel/random (presente da 2.3.16) forniscono un'interfaccia aggiuntiva al dispositivo /dev/random.

Il file in sola lettura entropy_avail fornisce l'entropia disponibile. Normalmente questo sarà 4096 (bit), un pozzo di entropia pieno.

Il file poolsize fornisce la dimensione del pozzo di entropia. La semantica di questo file è diversa a seconda della versione del kernel:

Questo file indica la dimensione del pozzo di entropia in byte. Normalmente questo file ha valore 512, ma è scrivibile e può essere cambiato in qualunque valore per il quale sia disponibile un algoritmo. Le scelte sono: 32, 64, 128, 256, 512, 1024 o 2048.
Questo file è di sola lettura, e indica la dimensione del pozzo di entropia in bit. Contiene il valore 4096.

Il file read_wakeup_threshold contiene il numero di bit di entropia richiesti per svegliare i processi che dormono in attesa dell'entropia da /dev/random. Il valore predefinito è 64. Il file write_wakeup_threshold contiene il numero di bit di entropia sotto i quali vengono svegliati i processi che eseguono un select() o poll() per accedere in scrittura a /dev/random. Questi valori possono venire cambiati scrivendo sui file.

I file in sola lettura uuid e boot_id contengono stringhe casuali come 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Il più vecchio è generato di nuovo a ciascuna lettura, l'ultimo viene generato una volta.

FILE

/dev/random
/dev/urandom

VEDERE ANCHE

mknod (1)
RFC 1750, "Randomness Recommendations for Security"

COLOPHON

Questa pagina fa parte del rilascio 3.01 del progetto man-pages di Linux. Si può trovare una descrizione del progetto, e informazioni su come riportare bachi, presso http://www.kernel.org/doc/man-pages/. Per la traduzione in italiano si può fare riferimento a http://www.pluto.it/ildp/collaborare/

20 giugno 2008 Linux