Gestione delle chiavi generate con entropia insufficiente

4

Poiché l'RNG di Linux che fornisce /dev/random (e per estensione /dev/urandom ) è seminato da "attività mouse e tastiera, operazioni di I / O su disco e interrupt specifici" ( origine, PDF ) e dal momento che le macchine virtuali spesso non hanno nessuno di questi attributi, è probabile che la maggior parte degli RNG di macchine virtuali Linux non sia seminata correttamente.

Se questo è davvero il caso, suppongo che sarebbe saggio fare una delle seguenti azioni:

  1. Genera altrove chiavi e parametri SSH, SSL, ecc., quindi sostituisci immediatamente i keypair generati dalla VM dopo il collegamento alla macchina.
  2. Accedere alla macchina e rigenerare tutte le chiavi utilizzando /dev/random come origine, che verrà bloccata se è disponibile un'entropia insufficiente. Ciò significa che la generazione di queste chiavi impiegherà molto tempo, ma saprai che sono state generate con una buona / reale entropia.
  3. Esegui # 2, ma usa /dev/urandom dopo aver seminato il pool casuale con alcuni dati casuali generati in modo sicuro su un RNG non affamato.

La mia ipotesi è corretta? L'opzione numero 3 sembra la più semplice da fare, ma è necessario o qualcosa di cui dovrei preoccuparmi?

    
posta Naftuli Kay 22.05.2015 - 03:39
fonte

1 risposta

7

Le macchine virtuali hanno hardware virtuale, ma questo non significa necessariamente che siano completamente prive di fonti di entropia. In particolare interrupt: mentre la VM non ha un vero generatore di interrupt, il suo sistema operativo continua a ricevere tali "interrupt" come parte dell'emulazione dell'hardware. Ad esempio, quando ci si connette alla VM tramite, ad esempio, SSH, i pacchetti di rete continuano a scorrere avanti e indietro e ciascun pacchetto in ingresso attiva un interrupt emulato nella VM. L'entropia derivata dal kernel da tale interrupt proviene dall'ora esatta di comparsa di quell'interrupt, che, in questo caso, è una funzione dell'arrivo reale del pacchetto sull'interfaccia di rete fisica del sistema host. Il processo dal pacchetto in entrata all'interrupt è più complicato rispetto a una macchina non virtuale, poiché l'host e il livello VM si trovano in mezzo, ma l'entropia dal mondo fisico è ancora resa disponibile per il kernel VM.

Un problema molto più pressante per VM e casualità è Clonazione VM . Potrebbe essere necessario installare e configurare una VM completa, quindi creare un'istantanea e clonarla per creare facilmente diverse nuove VM già configurate. Sfortunatamente, questo significa che tutti i cloni partono dallo stesso identico stato interno di RNG. Una volta avviati, iniziano a divergere man mano che ciascuno accumula i propri "eventi casuali" (anche se l'hardware è emulato, gli eventi hardware emulati derivano ancora indirettamente da veri eventi casuali dell'hardware, come spiegato sopra). La divergenza potrebbe essere lenta in termini di calcolo (potrebbe richiedere diversi secondi, e questo è molto lungo per i computer che possono fare miliardi di operazioni al secondo).

Il metodo più completo per risolvere il problema consiste nell'imporre la casualità seminando ogni VM con un seme ottenuto da un'altra fonte casuale altrove; questo è facile come scrivere un file in /dev/random . Questo potrebbe essere utile se cloni VM; altrimenti, questo è probabilmente inutile (ma non danneggerà comunque). Nota che questo è necessario solo una volta per VM: le normali distribuzioni Linux genereranno e salveranno un "seed file" all'arresto e lo riutilizzeranno al prossimo avvio, quindi una volta che una VM è stata seminata, rimane seminata.

Per quanto riguarda la tua soluzione # 2, prendi nota che la differenza tra /dev/random e /dev/urandom (in Linux) non è esattamente ciò che affermi. /dev/random bloccherà se stima che il suo pool interno non ha abbastanza entropia; ma considera anche che il suo pool è impoverito dopo l'uso. Il blocco prima che sia stata raccolta abbastanza entropia va bene; ma l '"effetto di esaurimento" implica un blocco molto più ampio, e quello ha solo basi scientifiche molto fragili. È un difetto noto del /dev/random di Linux. Un comportamento molto più sano è quello che ottieni con /dev/random di FreeBSD (e, per estensione, Mac OS X): quello si bloccherà finché non sarà stata raccolta abbastanza entropia iniziale , quindi produrrà tanti byte come desideri con un PRNG crittograficamente sicuro, senza bloccare. Nota che FreeBSD /dev/random e /dev/urandom sono completamente identici (e questo è buono).

Comunque, anche il comportamento maniacale di /dev/random di Linux per quanto riguarda l'esaurimento dell'entropia sarà ingannato dalla clonazione VM. Insistere sulla generazione di chiavi con /dev/random non solo ti farà aspettare tempi eccessivi; potrebbe anche non riuscire a raggiungere il livello desiderato di casualità in presenza della clonazione VM.

Per riassumere, la tua soluzione n. 3 è quella giusta.

    
risposta data 22.05.2015 - 04:16
fonte

Leggi altre domande sui tag