Comment faire fonctionner / dev / random sur une machine virtuelle Ubuntu?

19

Apparemment, / dev / random est basé sur des interruptions matérielles ou des aspects similaires imprévisibles du matériel physique. Étant donné que les machines virtuelles n'ont pas de matériel physique, leur exécution cat /dev/randomdans une machine virtuelle ne produit rien. J'utilise Ubuntu Server 11.04 comme hôte et invité, avec libvirt / KVM.

J'ai besoin de configurer Kerberos dans une machine virtuelle, mais krb5_newrealmse bloque pour toujours "Chargement de données aléatoires", car le système n'en produit pas.

Est-ce que quelqu'un sait comment contourner cela? Est-il possible de passer / dev / random de l'hôte (qui est très bavard) dans le VM afin que le VM puisse utiliser ses données aléatoires?

J'ai lu qu'il existe des alternatives logicielles, mais elles ne sont pas bonnes pour la cryptologie car elles ne sont pas assez aléatoires.

EDIT: Il semble que cat / dev / random sur le vm produit une sortie, juste très, très lentement. J'ai obtenu la configuration de mon domaine en attendant environ deux heures pendant qu'il "chargeait des données aléatoires". Finalement, cela a suffi pour continuer. Je suis toujours intéressé par un moyen d'accélérer cela.

pseudo
la source

Réponses:

10

Cela devrait «simplement fonctionner». Même si le VM n'a pas de matériel physique dédié, il a toujours accès à plusieurs très bonnes sources d'aléatoire. Par exemple, il peut utiliser le TSC du CPU pour chronométrer sa lecture à partir de disques virtuels, ce qui finira par chronométrer les disques physiques au milliardième de seconde. Ces synchronisations dépendent du cisaillement du flux d'air turbulent dans le disque dur, ce qui est imprévisible.

Une logique similaire s'applique au trafic réseau. Même si l'interface est virtualisée, tant que le paquet provient d'un réseau physique (et n'est pas local à la boîte, disons originaire d'un autre vm), la synchronisation du paquet dépend du décalage de phase entre l'oscillateur à cristal sur la carte réseau et l'oscillateur à cristal qui entraîne le TSC. Cela dépend des variations de température de la zone microscopique dans les deux cristaux de quartz. Cela aussi est imprévisible.

Si pour une raison quelconque, cela ne fonctionne pas, la solution la plus simple consiste à écrire un programme pour extraire l'entropie et à l'ajouter au pool système. L'interface réseau est votre source la plus fiable. Par exemple, vous pouvez écrire du code dans:

1) Recherchez le TSC.

2) Envoyez une requête DNS à un serveur connu pour ne pas être sur la même machine physique.

3) Interrogez le TSC une fois la requête terminée.

4) Répétez cette opération plusieurs fois, en accumulant toutes les valeurs TSC.

5) Effectuez un hachage sécurisé sur les fonctions TSC accumulées.

6) Transmettez la sortie de la fonction de hachage sécurisée au pool d'entropie du système.

7) Surveillez le niveau du pool d'entropie et attendez qu'il soit bas. Quand c'est le cas, revenez à l'étape 1.

Linux a des appels IOCTL simples pour ajouter de l'entropie au pool, vérifier le niveau du pool, etc. Vous en avez probablement rngd, qui peut prendre l'entropie d'un tuyau et l'alimenter dans le pool système. Vous pouvez remplir le tuyau à partir de n'importe quelle source, que ce soit les demandes TSC ou «wget» de votre propre source d'entropie.

David Schwartz
la source
Votre deuxième suggestion semble intéressante en théorie, mais j'espérais une solution qui n'impliquerait pas de programmation. Je me demande si la copie d'un gros fichier vers ou depuis l'hôte à partir d'un lecteur USB affecterait le pool d'entropie du VM (c'est-à-dire le rendrait plus rapide)? Si c'est le cas, je pourrais essayer de créer mon domaine tout en exécutant une sauvegarde d'une image de machine sur l'hôte ...
Nick
1
Vous pouvez faire des tests pour voir ce qui remplit le pool d'entropie. Une fois que vous avez trouvé quelque chose qui fonctionne, vous pouvez simplement le faire. Le trafic réseau devrait le faire. L'activité Drive devrait le faire. Vous pouvez tester pour voir ce qui fonctionne avec cette commande: cat /proc/sys/kernel/random/entropy_availtout ce qui augmente et qui fonctionne.
David Schwartz
Gardez à l'esprit que l'exécution de cat "mange" l'entropie (randomisation de l'espace d'adressage). Vous pouvez utiliser python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. Ouais, c'est difficile à lire, mais je ne vois aucun moyen d'entrer de nouvelles lignes dans les commentaires ...
Doncho Gunchev
10

J'utilise haveged sur tous mes serveurs sans tête qui effectuent des opérations cryptographiques (par exemple, des poignées de main TLS, des kerberos, etc.). Il devrait se trouver dans la plupart des référentiels de packages d'Ubuntu: http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

haveged utilise l'algorithme HAVAGE pour extraire l'entropie de l'état interne des processeurs modernes. Voici une explication approfondie: http://www.irisa.fr/caps/projects/hipsor/

Vous pouvez vérifier le caractère aléatoire de l'entropie générée avec le package ent. Sur mes systèmes, l'entropie générée par ont passé tous les tests de hasard par ent

Frank L
la source
Vous devez également exécuter la suite de tests NIST pour en être sûr.
Michael Hampton
7

Oui, vous pouvez le semer, à partir de:

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

Vous pouvez simplement mettre cela dans / dev / urandom et cela devrait amorcer le pool d'entropie. J'ai pu le confirmer en:

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 si vous faites passer la commande ssh par un routeur pour qu'elle génère l'entropie * :)

polynôme
la source
Je suis confus au sujet de la partie médiane. Je n'ai pas de "/ dev / xvda" sur le système. Le but est-il d'utiliser ssh pour router le / dev / random de l'hôte dans le / dev / urandom du VM? Je peux envoyer tout ce que je veux dans "/ dev / urandom" et ça vient de "/ dev / random"?
Nick
Je peux obtenir des données aléatoires de l'hôte en utilisant "ssh 192.168.1.1 'cat / dev / random'", mais je ne sais pas comment les affecter aux invités "/ dev / random". "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom" ne semble rien faire.
Nick
Je viens de tester en exécutant «cat / dev / random» dans un terminal et en attendant qu'il cesse de produire des données. Ensuite, dans un autre, j'ai fait «cat somerandomfile> / dev / urandom» et lentement «cat / dev / random» a recommencé à produire des trucs. Il semble que vous ayez besoin de BEAUCOUP d'entrées aléatoires sur / dev / urandom pour faire une entrée / dev / random digne. Êtes-vous en train de dire qu'en faisant le chat ... '> / dev / urandom vous ne voyez aucune sortie sur / dev / random du tout?
polynôme
Je vois un peu de sortie finalement, mais c'est très lent. Je ne sais pas si c'est plus que ce qui est produit naturellement. J'ai découvert qu'une très petite et lente quantité de données aléatoires est générée dans les machines virtuelles, cela prend juste une éternité. J'ai créé mon domaine après l'avoir laissé s'asseoir et "recueillir des données aléatoires" pendant environ 2 heures.
Nick
+1 pour une réponse utile.
Nick
5

Cela a fonctionné pour moi

L'exécution de krb5_newrealm dans une machine virtuelle peut prendre beaucoup de temps (après l'affichage du message "Chargement de données aléatoires"). Vous pouvez utiliser le hack suivant pour accélérer un peu les choses.

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

publié sur http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md

Vivek
la source
1

La réponse X86 est de s'assurer que votre machine virtuelle ne piège pas RdRand ou RdSeed. Vous faites confiance à votre machine virtuelle pour de nombreuses choses, c'est l'une d'entre elles.

Un RNGd suffisamment récent sur un CPU post Snady Bridge, utilisera (ou peut être dit de) RdRand ou RdSeed, et un RdRand ou RdSeed non piégé obtient l'entropie dans la VM. / dev / random fonctionne alors avec une source réelle (et non virtuelle) d'entropie.

Ce n'est pas par accident. C'est juste là dans les documents d'architecture Intel.

Pour une source d'entropie matérielle basée sur un périphérique (IE utilise un pilote de noyau pour la partager), vous avez besoin de la machine virtuelle pour virtualiser correctement la source physique. Je n'ai aucune idée s'ils le font et si oui, pour quels appareils.

Si votre RNGd n'a pas l'option drng ci-dessous, mettez-la à jour. Si votre matériel n'a pas de RNG matériel rapide, vous êtes condamné et vous devriez envisager d'utiliser un matériel différent à des fins de sécurité.

# 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
la source
0

J'avais aussi des problèmes avec la suspension de krb5_newrealm. Cela a bien fonctionné pour moi, basé sur la réponse ci-dessus:

cat /dev/sda > /dev/urandom

Vous voudrez peut-être le tuer une fois que vous aurez terminé avec votre besoin de données aléatoires. / dev / sda a probablement plus de données que vous n'en avez besoin.

Remarque: je ne sais pas à quel point les données aléatoires générées de cette manière sont aléatoires.

mgwilliams
la source
Veuillez vous référer à d'autres articles en utilisant le nom de l'affiche. Dire "ci-dessus" ou "ci-dessous" n'a aucun sens car vous ne voyez pas tous les messages dans la même séquence.
John Gardeniers
4
Cela peut fonctionner, mais / dev / sda contient beaucoup de données non aléatoires (des tonnes de zéros au moins), ce qui rend l'idée pas très bonne du point de vue de la sécurité. En plus des zéros, cela commence par MBR, qui est en fait très prévisible, je peux deviner au moins 3 octets ... ou ça ne démarre pas;)
Doncho Gunchev