Per quanto tempo ri-seminare / dev / urandom in una macchina virtuale?

15

Ho letto molto sulla distinzione tra /dev/random e /dev/urandom . Capisco che il consiglio prevalente è di usare /dev/urandom . La spiegazione - che 256 bit di casualità "corretta" sono tutto ciò che serve per quasi tutte le applicazioni crittografiche - ha senso per me.
Un paio di fonti utili:
- link
- link

Lo stato di una macchina virtuale (VM) o di un CD live subito dopo il primo avvio è talvolta identificato come caso limite insolito rispetto a questa linea guida, poiché /dev/urandom potrebbe non essere stato seminato correttamente.

Nel contesto di tutti gli altri possibili usi di /dev/urandom , posso vedere che questo è un caso limite. Tuttavia, dato che stai usando una VM per la prima volta, sembra plausibile che una delle prime cose che potresti voler fare è chiamare su /dev/urandom , ad es. per generare chiavi SSH.

Quindi, se si assume il peggio della VM (ad esempio che è stata clonata o che dopo un riavvio i nuovi randoms non sono validi), cosa si può fare per assicurarsi che /dev/urandom sia buono per andare?

La cosa più pigra da fare sembra essere quella di lasciare che la VM resti attiva per un po 'di tempo, fino a quando gli eventi casuali non avranno seminato il pool di input. La parte imbarazzante è che una VM inattiva lo fa abbastanza lentamente.

Volevo testare quanto tempo ci voleva perché ciò accadesse, e ho provato a farlo come segue:

Questo comando estrae 32 byte / 256 bit dal pool (e visualizza in hex)
head -c 32 </dev/random | xxd -p

Una volta che il conteggio entropico del pool di input è passato a livelli minimi (visibile con cat /proc/sys/kernel/random/entropy_avail ), il comando precedente verrà bloccato fino a quando nuovi eventi casuali non entreranno nel pool di input. Questo mi suggerisce che se eseguiamo ripetutamente il comando sopra riportato, lo calcoliamo e scriviamo i risultati in un file chiamato randomtest , indicherà quanto tempo ci vuole per riempire il pool di input.

Ho provato a scrivere un comando a riga singola che lo fa:
for n in {1..10}; do (/usr/bin/time -f "%E Real" sh -c 'printf "%-10s" $(head -c 32 </dev/random | xxd -p)' 2>&1) >> randomtest; done

Più facilmente:

for n in {1..10};
do (/usr/bin/time -f "%E Real" sh -c \
    'printf "%-10s" $(head -c 32 </dev/random | xxd -p)' 2>&1) \
    >> randomtest; 
done

So che i processi di partenza (anche il comando cat sopra) disegna il pool di input, quindi questo fornirà una stima prudente. Per quello che vale, lascio che il comando sopra indicato sia eseguito su una VM inattiva e il tempo tra le nuove sequenze a 32 byte è stato costante di 15-20 minuti ciascuna.

Le mie domande:

  • L'output di questo comando verifica con successo ciò che penso che faccia?
  • C'è un modo molto più semplice per testare la stessa cosa?
  • Esiste un modo diverso / migliore "pigro" per aggiornare il pool di input e ri-seed /dev/urandom rispetto a lasciare la VM inattiva?
posta SauceCode 15.03.2016 - 14:05
fonte

2 risposte

6

Non sono un esperto delle sfumature tra urandom e random ma in base alla descrizione sembrerebbe che il test stia appropriando correttamente il tempo necessario per riempire il pool di input. Non sono a conoscenza di strumenti che eseguono questo tipo di test.

C'è un modo migliore di resettare urandom per prevenire lo stato stantio che influisce sulla qualità dei dati casuali, e cioè scrivere dati casuali in urandom .

Questo può essere fatto sui fornitori di cloud usando cloud-init e sui VM all'avvio eseguendo alcuni metadati di istanza tramite una funzione di hash e scrivendo su urandom . Questo potrebbe anche essere parte di una soluzione di gestione della configurazione utilizzando Chef, Ansible, Puppet, ecc. E prelevare un seme casuale dalla macchina locale.

Si noti che questo non aumenta il conteggio totale dell'entropia, ma imposta semplicemente un seme più fresco. Da man 4 random

Writing to /dev/random or /dev/urandom will update the entropy pool with the data written, but this will not result in a higher entropy count. This means that it will impact the contents read from both files, but it will not make reads from /dev/random faster.

    
risposta data 21.03.2016 - 20:03
fonte
1

Se non hai un hardware rng puoi dare l'entropia di vm eseguendo haveged as a daemon su host .

Lo uso nei miei script di installazione Alpine Linux per fornire abbastanza entropia per creare un filesystem luks su una nuova installazione.

    
risposta data 11.09.2016 - 23:52
fonte

Leggi altre domande sui tag