Administrar claves generadas con entropía insuficiente

4

Dado que el RNG de Linux que proporciona /dev/random (y por extensión /dev/urandom ) se siembra por "actividad de mouse y teclado, operaciones de E / S de disco e interrupciones específicas" ( source, PDF ) y como las máquinas virtuales a menudo no tienen ninguno de estos atributos, es probable que la mayoría de los RNG de Linux VM no estén correctamente implementados.

Si este es el caso, supongo que sería prudente realizar una de las siguientes acciones:

  1. Genere claves y parámetros SSH, SSL, etc. en otro lugar, luego reemplace los pares de llaves generados por la VM inmediatamente después de conectarse a la máquina.
  2. Inicie sesión en la máquina y regenere todas las claves utilizando /dev/random como fuente, que se bloqueará si no hay suficiente entropía disponible. Esto significará que la generación de estas claves llevará mucho tiempo, pero sabrá que se generaron con una entropía buena / real.
  3. Haz # 2, pero usa /dev/urandom después de sembrar la agrupación aleatoria con algunos datos aleatorios generados de forma segura en un RNG que no muera de hambre.

¿Mi suposición es correcta? La opción número 3 parece la más fácil de hacer, pero ¿es esto necesario o es algo que debería preocuparme?

    
pregunta Naftuli Kay 22.05.2015 - 03:39
fuente

1 respuesta

7

Las máquinas virtuales tienen hardware virtual, pero esto no significa necesariamente que estén completamente desprovistas de fuentes de entropía. En particular, las interrupciones: mientras que la máquina virtual no tiene un hardware de generador de interrupciones real, su sistema operativo todavía recibe tales "interrupciones" como parte de la emulación de hardware. Por ejemplo, cuando se conecta a su VM a través de SSH, digamos, los paquetes de red todavía fluyen de un lado a otro, y cada paquete entrante desencadena una interrupción emulada en la VM. La entropía derivada por el núcleo de tal interrupción proviene de la hora exacta de aparición de esa interrupción, que, en este caso, es una función de la llegada real del paquete a la interfaz de red física del sistema host. El proceso desde el paquete entrante hasta la interrupción es más complejo que en una máquina no virtual, ya que el host y la capa de VM se encuentran en el medio, pero la entropía del mundo físico todavía está disponible para el núcleo de la VM.

Un problema mucho más acuciante para VM y aleatoriedad es clonación de VM . Es posible que desee instalar y configurar una máquina virtual completa, luego hacer una instantánea y clonarla para crear fácilmente varias máquinas virtuales nuevas ya configuradas. Desafortunadamente, esto significa que todos los clones comienzan exactamente desde el mismo estado interno de RNG. Una vez que se inician, comienzan a divergir a medida que cada uno acumula sus propios "eventos aleatorios" (aunque el hardware es emulado, los eventos de hardware emulados aún provienen indirectamente de eventos aleatorios de hardware real, como se explicó anteriormente). La divergencia puede ser lenta en términos de computación (puede tardar varios segundos, y eso es muy largo para computadoras que pueden hacer miles de millones de operaciones por segundo).

El método más completo para corregir eso es hacer cumplir la aleatoriedad sembrando cada VM con una semilla obtenida de alguna otra fuente aleatoria en otro lugar; Esto es tan fácil como escribir un archivo en /dev/random . Esto puede ser deseable si clona VM; de lo contrario, esto probablemente sea inútil (pero no dañará de todos modos). Tenga en cuenta que esto es necesario solo una vez por VM: las distribuciones normales de Linux generarán y guardarán un "archivo semilla" al apagarse y reutilizarlo en el próximo arranque, por lo que una vez que se haya sembrado una máquina virtual, se mantendrá sin datos.

En cuanto a su solución # 2, tenga en cuenta que la diferencia entre /dev/random y /dev/urandom (en Linux) no es exactamente lo que indica. /dev/random bloqueará si estima que su grupo interno no tiene suficiente entropía; pero también considera que su grupo está agotado al usarlo. El bloqueo antes de que se haya reunido suficiente entropía está bien; pero el "efecto de agotamiento" implica mucho más bloqueo, y ese solo tiene una base científica muy débil. Es un defecto conocido de /dev/random de Linux. Un comportamiento mucho más sensato es lo que obtienes con /dev/random de FreeBSD (y, por extensión, Mac OS X): ese bloque se bloqueará hasta que se haya reunido suficiente entropía inicial , y luego se producirán tantos bytes Como desee con un PRNG criptográficamente seguro, sin bloqueo. Tenga en cuenta que FreeBSD /dev/random y /dev/urandom son completamente idénticos (y esto es bueno).

De todos modos, incluso el comportamiento maniaco de /dev/random de Linux con respecto al agotamiento de la entropía será engañado por la clonación de máquinas virtuales. Por lo tanto, insistir en generar claves con /dev/random no solo hará que esperes cantidades desordenadas de tiempo; También puede fallar en alcanzar el nivel deseado de aleatoriedad en presencia de la clonación de máquinas virtuales.

Para resumir, tu solución # 3 es la correcta.

    
respondido por el Thomas Pornin 22.05.2015 - 04:16
fuente

Lea otras preguntas en las etiquetas