¿Cómo consigo / dev / random para trabajar en una máquina virtual Ubuntu?

19

Aparentemente, / dev / random se basa en interrupciones de hardware o aspectos impredecibles similares del hardware físico. Dado que las máquinas virtuales no tienen hardware físico, la ejecución cat /dev/randomdentro de una máquina virtual no produce nada. Estoy usando Ubuntu Server 11.04 como anfitrión e invitado, con libvirt / KVM.

Necesito configurar Kerberos dentro de una VM, pero krb5_newrealmsimplemente se cuelga para siempre "Cargando datos aleatorios", ya que el sistema no produce ninguno.

¿Alguien sabe cómo solucionar esto? ¿Es posible pasar el / dev / random del host (que es muy hablador) al vm para que el vm pueda usar sus datos aleatorios?

He leído que hay algunas alternativas de software, pero no son buenas para la criptología, ya que no son lo suficientemente aleatorias.

EDITAR: Parece que cat / dev / random en el vm produce resultados, muy, muy lentamente. Obtuve la configuración de mi reino esperando unas dos horas mientras estaba "Cargando datos aleatorios". Finalmente, tuvo suficiente para continuar. Sin embargo, todavía estoy interesado en una forma de acelerar esto.

Mella
fuente

Respuestas:

10

Debería 'simplemente funcionar'. Aunque el vm no tiene hardware físico dedicado, aún tiene acceso a varias fuentes muy buenas de aleatoriedad. Por ejemplo, puede usar el TSC de la CPU para cronometrar su lectura de discos virtuales, lo que finalmente terminará cronometrando discos físicos a la milmillonésima de segundo. Estos tiempos dependen de la cizalladura turbulenta del flujo de aire en el disco duro, que es impredecible.

Una lógica similar se aplica al tráfico de red. Aunque la interfaz está virtualizada, siempre y cuando el paquete se origine en una red física (y no sea local en la caja, digamos que se origina en otro vm), la sincronización del paquete depende del desplazamiento de fase entre el oscilador de cristal en la tarjeta de red y el oscilador de cristal que impulsa el TSC. Esto depende de las variaciones de temperatura de la zona microscópica en los dos cristales de cuarzo. Esto también es impredecible.

Si por alguna razón no funciona, la solución más simple es escribir un programa para extraer entropía y agregarlo al grupo de sistemas. La interfaz de red es su fuente más confiable. Por ejemplo, puede escribir código en:

1) Consultar el TSC.

2) Emitir una consulta DNS a un servidor que se sabe que no está en la misma máquina física.

3) Consulte el TSC cuando se complete la consulta.

4) Repita esto varias veces, acumulando todos los valores de TSC.

5) Realice un hash seguro en las funciones de TSC acumuladas.

6) Pase la salida de la función hash segura al grupo de entropía del sistema.

7) Monitoree el nivel del grupo de entropía y espere hasta que esté bajo. Cuando sea así, regrese al paso 1.

Linux tiene llamadas IOCTL simples para agregar entropía al grupo, verificar el nivel del grupo, etc. Probablemente tenga rngd, que puede tomar entropía de una tubería y alimentarla al conjunto del sistema. Puede llenar la tubería desde cualquier fuente que desee, ya sean las solicitudes TSC o 'wget' de su propia fuente de entropía.

David Schwartz
fuente
Su segunda sugerencia parece interesante en teoría, pero esperaba una solución que no involucrara programación. Me pregunto si copiar un archivo grande desde o hacia el host desde una unidad USB afectaría el grupo de entropía del vm (es decir, lo haría funcionar más rápido). Si es así, podría intentar crear mi reino mientras ejecuto una copia de seguridad de una imagen de máquina en el host ...
Nick
1
Puede hacer algunas pruebas para ver qué rellena el grupo de entropía. Una vez que encuentre algo que funcione, puede hacerlo. El tráfico de red debería hacerlo. La actividad de manejo debería hacerlo. Puede probar para ver qué funciona con este comando: cat /proc/sys/kernel/random/entropy_availcualquier cosa que aumente y que funcione.
David Schwartz
Tenga en cuenta que ejecutar cat "come" entropía (aleatorización del espacio de direcciones). Puedes usar python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. Sí, eso es difícil de leer, pero no veo forma de ingresar nuevas líneas en los comentarios ...
Doncho Gunchev
10

Utilizo hasged en todos mis servidores sin cabeza que realizan operaciones criptográficas (por ejemplo, apretones de manos TLS, kerberos, etc.). Debería estar en el repositorio de paquetes de la mayoría de las versiones de Ubuntu: http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

haveged usa el algoritmo HAVAGE para extraer entropía del estado interno de los procesadores modernos. Aquí hay una explicación en profundidad: http://www.irisa.fr/caps/projects/hipsor/

Puede verificar la aleatoriedad de la entropía generada con el paquete ent. En mis sistemas, la entropía generada a partir de forjado pasó todas las pruebas de aleatoriedad por ent

Frank L
fuente
También debe ejecutar el conjunto de pruebas NIST para estar seguro.
Michael Hampton
7

Sí, puedes sembrarlo, de:

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

Simplemente puede poner eso en / dev / urandom y debería sembrar el grupo de entropía. Pude confirmar esto al:

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

Bonificación si hace que el comando ssh pase por un enrutador para que genere entropía * :)

polinomio
fuente
Estoy confundido acerca de la parte media. No tengo un "/ dev / xvda" en el sistema. ¿El objetivo es usar ssh para enrutar el host / dev / random en vm's / dev / urandom? ¿Puedo enviar lo que quiera a "/ dev / urandom" y sale de "/ dev / random"?
Nick
Puedo obtener datos aleatorios del host usando "ssh 192.168.1.1 'cat / dev / random'", pero no sé cómo afectar a los invitados "/ dev / random". "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom" no parece hacer nada.
Nick
Acabo de probar ejecutando 'cat / dev / random' en una terminal y esperando hasta que dejó de generar datos. Luego, en otro, hice 'cat somerandomfile> / dev / urandom' y lentamente, 'cat / dev / random' comenzó a generar cosas nuevamente. Parece que necesita MUCHA entrada aleatoria en / dev / urandom para hacer una entrada digna / dev / random. ¿Estás diciendo que cuando haces el gato ... '> / dev / urandom no estás viendo ningún resultado en / dev / random?
polinomio
Veo algo de salida eventualmente, pero es muy lento. No estoy seguro si es más de lo que se produce naturalmente. Descubrí que se genera una cantidad muy lenta y pequeña de datos aleatorios en las máquinas virtuales, solo lleva una eternidad. Obtuve mi reino creado después de dejarlo reposar y "reunir datos aleatorios" durante aproximadamente 2 horas.
Nick
+1 para una respuesta útil.
Nick
5

Esto funciono para mi

La ejecución de krb5_newrealm dentro de una VM puede tardar mucho tiempo en completarse (después de mostrar el mensaje "Cargando datos aleatorios"). Puedes usar el siguiente truco para acelerar un poco las cosas.

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

publicado en http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md

Vivek
fuente
1

La respuesta X86 es asegurarse de que su VM no atrape RdRand o RdSeed. Confía en su VM para muchas cosas, esta es una de ellas.

Un RNGd suficientemente reciente en una CPU posterior al Puente Snady utilizará (o se le puede decir que lo haga) usar RdRand o RdSeed, y un RdRand o RdSeed sin atrapar obtiene entropía en la VM. / dev / random funciona con una fuente de entropía real (no virtual).

Esto no es por accidente. Está justo allí en los documentos de arquitectura Intel.

Para una fuente de entropía de hardware basada en dispositivo (IE usa un controlador de kernel para compartirla) necesita la VM para virtualizar correctamente la fuente física. No tengo idea si hacen esto y, de ser así, para qué dispositivos.

Si su RNGd no tiene la opción drng a continuación, actualícela. Si su hardware no tiene un RNG de hardware rápido, está condenado y debería considerar usar hardware diferente por motivos de seguridad.

# 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 <[email protected]>.
David Johnston
fuente
0

Estaba teniendo problemas con krb5_newrealm colgando también. Esto funcionó bien para mí, basado en la respuesta anterior:

cat /dev/sda > /dev/urandom

Es posible que desee matarlo una vez que haya terminado con su necesidad de datos aleatorios. / dev / sda probablemente tenga más datos de los que necesita.

Nota: No estoy seguro de cuán aleatorios son realmente los datos aleatorios generados de esta manera.

mgwilliams
fuente
Consulte otras publicaciones utilizando el nombre del afiche. Decir "arriba" o "abajo" no tiene sentido porque no todos vemos las publicaciones en la misma secuencia.
John Gardeniers
44
Esto puede funcionar, pero / dev / sda contiene muchos datos no aleatorios (toneladas de ceros al menos), lo que hace que la idea no sea muy buena desde el punto de vista de la seguridad. Además de los ceros, comienza con MBR, que en realidad es muy predecible, puedo adivinar al menos 3 bytes ... o no arranca;)
Doncho Gunchev