Come faccio a far funzionare / dev / random su una macchina virtuale Ubuntu?


19

Apparentemente, / dev / random si basa su interruzioni hardware o aspetti imprevedibili simili dell'hardware fisico. Poiché le macchine virtuali non dispongono di hardware fisico, l'esecuzione cat /dev/randomall'interno di una macchina virtuale non produce nulla. Sto usando Ubuntu Server 11.04 come host e guest, con libvirt / KVM.

Devo configurare Kerberos all'interno di una macchina virtuale, ma krb5_newrealmresta sempre bloccato "Caricamento dati casuali", poiché il sistema non ne produce.

Qualcuno sa come aggirare questo? È possibile passare l'host / dev / random (che è molto loquace) nella VM in modo che la VM possa usare i suoi dati casuali?

Ho letto che ci sono alcune alternative di software, ma non sono buone per la crittografia poiché non sono abbastanza casuali.

EDIT: Sembra che cat / dev / random sulla vm produca output, molto, molto lentamente. Ho impostato il mio regno aspettando circa due ore mentre era "Caricamento dati casuali". Alla fine è bastato per continuare. Sono ancora interessato a un modo per accelerare questo però.

Risposte:


10

Dovrebbe "funzionare". Anche se la VM non ha hardware fisico dedicato, ha ancora accesso a molte ottime fonti di casualità. Ad esempio, può utilizzare il TSC della CPU per sincronizzare la sua lettura dai dischi virtuali, che alla fine finirà per sincronizzare i dischi fisici al miliardesimo di secondo. Questi tempi dipendono dal taglio turbolento del flusso d'aria nel disco rigido, che è imprevedibile.

Una logica simile si applica al traffico di rete. Anche se l'interfaccia è virtualizzata, fintanto che il pacchetto ha origine in una rete fisica (e non è locale alla scatola, diciamo che ha origine in un'altra vm), la tempistica del pacchetto dipende dall'offset di fase tra l'oscillatore a cristallo sulla scheda di rete e l'oscillatore a cristallo che guida il TSC. Ciò dipende dalle microscopiche variazioni di temperatura della zona nei due cristalli di quarzo. Anche questo è imprevedibile.

Se per qualche motivo non funziona, la soluzione più semplice è scrivere un programma per estrarre l'entropia e aggiungerlo al pool di sistemi. L'interfaccia di rete è la tua fonte più affidabile. Ad esempio, puoi scrivere il codice in:

1) Interrogare il TSC.

2) Invia una query DNS a un server che non si trova sulla stessa macchina fisica.

3) Interrogare il TSC al termine della query.

4) Ripetere l'operazione alcune volte, accumulando tutti i valori TSC.

5) Eseguire un hash sicuro sulle funzioni TSC accumulate.

6) Passa l'output della funzione hash sicura al pool di entropia del sistema.

7) Monitorare il livello del pool di entropia e attendere che sia basso. In tal caso, tornare al passaggio 1.

Linux ha semplici chiamate IOCTL per aggiungere entropia al pool, controllare il livello del pool e così via. Probabilmente hai rngd, che può prendere l'entropia da una pipe e inviarla al pool di sistema. Puoi riempire la pipa da qualsiasi fonte tu voglia, che si tratti del TSC o di "wget" richieste dalla tua fonte entropica.


Il tuo secondo suggerimento sembra interessante in teoria, ma speravo in una soluzione che non prevedesse la programmazione. Mi chiedo se la copia di un file di grandi dimensioni da o verso l'host da un'unità USB influirebbe sul pool di entropia di VM (cioè farlo funzionare più velocemente)? Se è così, potrei provare a creare il mio regno mentre eseguo un backup di un'immagine della macchina sull'host ...
Nick,

1
Puoi fare alcuni test per vedere cosa riempie il pool di entropia. Una volta trovato qualcosa che funziona, puoi semplicemente farlo. Il traffico di rete dovrebbe farlo. L'attività di guida dovrebbe farlo. Puoi provare per vedere cosa funziona con questo comando: cat /proc/sys/kernel/random/entropy_availTutto ciò che aumenta funziona.
David Schwartz,

Tieni presente che il gatto in esecuzione "mangia" entropia (randomizzazione dello spazio degli indirizzi). È possibile utilizzare python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. Sì, è difficile da leggere, ma non vedo alcun modo per inserire nuove righe nei commenti ...
Doncho Gunchev,

10

Uso l'hogeded su tutti i miei server senza testa che eseguono operazioni crittografiche (es. Handshake TLS, Kerberos, ecc.). Dovrebbe essere nella maggior parte dei repository di pacchetti delle versioni di Ubuntu: http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

hasged utilizza l'algoritmo HAVAGE per estrarre l'entropia dallo stato interno dei moderni processori. Ecco una spiegazione approfondita: http://www.irisa.fr/caps/projects/hipsor/

È possibile verificare la casualità dell'entropia generata con il pacchetto ent. Sui miei sistemi l'entropia generata da hasged ha superato tutti i test di casualità di ent


Per sicurezza, devi anche eseguire la suite di test NIST.
Michael Hampton

7

Sì, puoi seminarlo, da:

http://manpages.ubuntu.com/manpages/jaunty/man4/random.4.html

Puoi semplicemente metterlo in / dev / urandom e dovrebbe seminare il pool di entropia. Sono stato in grado di confermare questo tramite:

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

Bonus se fai passare il comando ssh attraverso un router in modo da generare entropia * :)


Sono confuso per la parte centrale. Non ho un "/ dev / xvda" sul sistema. L'obiettivo è usare ssh per indirizzare l'host / dev / random in vm / dev / urandom? Posso inviare tutto ciò che voglio in "/ dev / urandom" e viene fuori da "/ dev / random"?
Nick,

Posso ottenere dati casuali dall'host usando "ssh 192.168.1.1 'cat / dev / random'", ma non so come influire sugli ospiti "/ dev / random". "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom" non sembra fare nulla.
Nick,

Ho appena provato eseguendo 'cat / dev / random' in un terminale e aspettando che smettesse di trasmettere i dati. Poi in un altro ho fatto 'cat somerandomfile> / dev / urandom' e lentamente il 'cat / dev / random' ha iniziato a produrre nuovamente cose. Sembra che tu abbia bisogno di MOLTO input casuale su / dev / urandom per rendere degno / dev / random input. Stai dicendo che quando fai il gatto ... '> / dev / urandom non vedi alcun output su / dev / random?
polinomio

Alla fine vedo un po 'di output, ma è molto lento. Non sono sicuro che sia qualcosa di più di ciò che viene prodotto naturalmente. Ho scoperto che una quantità molto lenta e piccola di dati casuali viene generata nelle macchine virtuali, ci vuole solo per sempre. Ho creato il mio regno dopo averlo lasciato sedere e "raccogliere dati casuali" per circa 2 ore.
Nick,

+1 per una risposta utile.
Nick,

5

Questo ha funzionato per me

L'esecuzione di krb5_newrealm all'interno di una VM può richiedere molto tempo per essere completata (dopo aver visualizzato il messaggio "Caricamento dati casuali"). Puoi usare il seguente trucco per velocizzare un po 'le cose.

$ sudo aptitude install rng-tools -y
$ sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

pubblicato su http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md


1

La risposta X86 è assicurarsi che la VM non intrappoli RdRand o RdSeed. Ti fidi della tua VM per molte cose, questa è una di queste.

Un RNGd sufficientemente recente su una CPU post Snady Bridge utilizzerà (o si potrà dire che) utilizzerà RdRand o RdSeed e un RdRand o RdSeed non intrappolato entrerà entropia nella VM. / dev / random funziona quindi con una vera e propria fonte di entropia (non virtuale).

Questo non è un caso. È proprio lì nei documenti di architettura Intel.

Per un'origine entropia hardware basata su dispositivo (IE utilizza un driver del kernel per condividerlo) è necessario che la VM virtualizzi correttamente l'origine fisica. Non ho idea se lo fanno e, in tal caso, per quali dispositivi.

Se il tuo RNGd non ha l'opzione drng di seguito, aggiornalo. Se il tuo hardware non ha un RNG hardware veloce, sei condannato e dovresti considerare di utilizzare hardware diverso per motivi di sicurezza.

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <jgarzik@pobox.com>.

0

Avevo problemi anche con krb5_newrealm in sospeso. Questo ha funzionato bene per me, in base alla risposta sopra:

cat /dev/sda > /dev/urandom

Potresti volerlo uccidere una volta che hai finito con la tua necessità di dati casuali. / dev / sda probabilmente ha più dati del necessario.

Nota: non sono sicuro di quanto siano casuali i dati casuali generati in questo modo.


Fare riferimento ad altri post utilizzando il nome del poster. Dire "sopra" o "sotto" non ha senso perché non tutti vediamo i post nella stessa sequenza.
John Gardeniers,

4
Questo potrebbe funzionare, ma / dev / sda contiene molti dati non casuali (almeno tonnellate di zero), il che rende l'idea non molto buona dal punto di vista della sicurezza. Oltre agli zero, inizia con MBR, che in realtà è molto prevedibile, posso immaginare almeno 3 byte ... o non si avvia;)
Doncho Gunchev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.