Le manque d'entropie dans les systèmes Linux virtualisés semble être un problème courant (par exemple / dev/random Extremely Slow? , Obtenir Linux pour tamponner/dev/random ). Malgré l'utilisation d'un générateur de nombres aléatoires matériel (HRNG), l'utilisation d'un démon de collecte d'entropie comme A FORGÉ est souvent suggérée. Cependant, un démon de collecte d'entropie (EGD) ne peut pas être exécuté à l'intérieur d'un conteneur Docker, il doit être fourni par l'hôte.
L'utilisation d'un EGD fonctionne très bien pour les hôtes Docker basés sur des distributions Linux comme Ubuntu, RHEL, etc. Faire fonctionner un tel démon dans boot2docker - qui est basé sur Tiny Core Linux (TCL) - semble être une autre histoire. Bien que TCL ait un mécanisme d'extension, une extension pour un démon de collecte d'entropie ne semble pas être disponible .
Un EGD semble donc être une bonne solution pour exécuter des conteneurs Docker dans un environnement d'hébergement (de production), mais comment le résoudre pour le développement/test dans boot2docker?
Étant donné que l'exécution d'un EGD dans boot2docker semblait trop difficile, j'ai pensé à utiliser simplement/dev/urandom au lieu de/dev/random. L'utilisation de/dev/urandom est un peu moins sécurisée, mais reste correcte pour la plupart des applications qui ne génèrent pas de clés cryptographiques à long terme. Au moins, cela devrait convenir pour le développement/test dans boot2docker.
Je viens de réaliser qu'il est simple de monter/dev/urandom depuis l'hôte en tant que/dev/random dans le conteneur:
$ docker run -v /dev/urandom:/dev/random ...
Le résultat est comme prévu:
$ docker run --rm -it -v /dev/urandom:/dev/random ubuntu dd if=/dev/random of=/dev/null bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 0.00223239 s, 459 kB/s
Au moins, je sais comment construire mes propres images boot2docker maintenant ;-)
La solution la plus élégante que j'ai trouvée est d'exécuter Haveged dans un conteneur séparé:
docker pull harbur/haveged
docker run --privileged -d harbur/haveged
Vérifiez si suffisamment d'entropie disponible:
$ cat /proc/sys/kernel/random/entropy_avail
2066
Une autre option consiste à installer le package rng-tools et à le mapper pour utiliser le/dev/urandom
yum install rng-tools
rngd -r /dev/urandom
Avec cela, je n'avais pas besoin de mapper de volume dans le conteneur Docker.
Comme je n'aimais pas modifier mes conteneurs Docker pour le développement/test, j'ai essayé de modifier l'image boot2docker. Heureusement, l'image boot2docker est construite avec Docker et peut être facilement étendue . J'ai donc mis en place ma propre version Docker boot2docker-urandom . Il étend l'image boot2docker standard avec une règle udev trouvée ici .
Construire votre propre image boot2docker.iso est aussi simple que
$ docker run --rm mbonato/boot2docker-urandom > boot2docker.iso
Pour remplacer le boot2docker.iso standard fourni avec boot2docker, vous devez:
$ boot2docker stop
$ boot2docker delete
$ mv boot2docker.iso ~/.boot2docker/
$ boot2docker init
$ boot2docker up
Limitations , depuis l'intérieur d'un conteneur Docker/dev/random still blocks. Très probablement, car les conteneurs Docker n'utilisent pas directement/dev/random de l'hôte, mais utilisent le périphérique noyau correspondant - qui se bloque toujours.
Alpine Linux peut être un meilleur choix pour un hôte docker
léger. Alpine LXC
& docker
les images ne font que 5 Mo (contre 27 Mo pour boot2docker
)
J'utilise haveged
sur Alpine pour LXC
invités et sur Debian pour docker
invités. Il donne suffisamment d'entropie pour générer gpg
/ssh
clés et openssl
certificats dans les conteneurs. Alpine a maintenant un repo officiel docker
.
Alternativement, créez un paquet haveged
pour Tiny Core - il y a un système de construction de paquet disponible.
si vous rencontrez ce problème dans un conteneur Docker créé à partir d'une image auto-construite qui exécute une application Java (par exemple créée FROM Tomcat:Alpine
)) et qui n'a pas accès à l'hôte ( par exemple sur un cluster k8s géré), vous pouvez ajouter la commande suivante à votre dockerfile pour utiliser l'amorçage non bloquant de SecureRandom
:
RUN sed -i.bak \
-e "s/securerandom.source=file:\/dev\/random/securerandom.source=file:\/dev\/urandom/g" \
-e "s/securerandom.strongAlgorithms=NativePRNGBlocking/securerandom.strongAlgorithms=NativePRNG/g" \
$Java_HOME/lib/security/Java.security
les deux expressions rationnelles remplacent file:/dev/random
par file:/dev/urandom
et NativePRNGBlocking
par NativePRNG
dans le fichier $Java_HOME/lib/security/Java.security
, ce qui permet à Tomcat de démarrer assez rapidement sur un vm. je n'ai pas vérifié si cela fonctionne également sur les images openjdk non alpines, mais si la commande sed
échoue, vérifiez simplement l'emplacement du fichier Java.security
à l'intérieur du conteneur et adaptez le chemin en conséquence .
remarque: dans jdk11, le chemin d'accès est devenu $Java_HOME/conf/security/Java.security