Недостаточно энтропии для поддержки /dev/random в контейнерах докеров, работающих в boot2docker
Исчезновение энтропии в виртуализированных системах Linux, похоже, является распространенной проблемой (например, qaru.site/info/144420/... Получение linux в буфер /dev/random). Несмотря на использование аппаратного генератора случайных чисел (HRNG), часто предлагается использовать демон сбора энтропии, такой как HAVEGED. Однако демон сбора энтропии (EGD) не может быть запущен внутри контейнера Docker, он должен быть предоставлен хостом.
Использование EGD прекрасно работает для узлов докеров, основанных на дистрибутивах Linux, таких как Ubuntu, RHEL и т.д. Получение такого демона для работы внутри boot2docker, основанного на Tiny Core Linux (TCL), кажется другой историей. Хотя TCL имеет механизм расширения, расширение для демона сбора энтропии , по-видимому, недоступно.
Таким образом, EGD кажется правильным решением для запуска докер-контейнеров в (производственной) среде хостинга, но как решить эту проблему для разработки/тестирования в boot2docker?
Поскольку запуск EGD в boot2docker показался слишком сложным, я подумал о том, чтобы просто использовать /dev/urandom вместо /dev/random. Использование /dev/urandom немного менее безопасно, но все же хорошо для большинства приложений, которые не генерируют долгосрочные криптографические ключи. По крайней мере, это должно быть хорошо для разработки/тестирования внутри boot2docker.
Ответы
Ответ 1
Я просто понял, что это просто, как установка /dev/urandom из хоста в качестве /dev/random в контейнер:
$ docker run -v /dev/urandom:/dev/random ...
Результат будет таким, как ожидалось:
$ 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
По крайней мере, я знаю, как теперь создавать свои собственные загрузочные файлы, -)
Ответ 2
Самое элегантное решение, которое я нашел, работает в отдельном контейнере:
docker pull harbur/haveged
docker run --privileged -d harbur/haveged
Проверьте наличие достаточной энтропии:
$ cat /proc/sys/kernel/random/entropy_avail
2066
Ответ 3
Поскольку я не любил модифицировать свои контейнеры Docker для разработки/тестирования, я попытался изменить образ boot2docker. К счастью, образ boot2docker собран с помощью Docker и может быть легко расширен. Итак, я настроил свою собственную сборку Docker boot2docker-urandom. Он расширяет стандартный образ boot2docker правилом udev, найденным здесь.
Создать свой собственный образ boot2docker.iso просто
$ docker run --rm mbonato/boot2docker-urandom > boot2docker.iso
Чтобы заменить стандартный boot2docker.iso, который поставляется с boot2docker, вам необходимо:
$ boot2docker stop
$ boot2docker delete
$ mv boot2docker.iso ~/.boot2docker/
$ boot2docker init
$ boot2docker up
Ограничения внутри контейнера Docker/dev/random все еще блокируют. Скорее всего, потому что контейнеры Docker не используют /dev/random хоста напрямую, а используют соответствующее устройство ядра - которое все еще блокирует.
Ответ 4
Alpine Linux может быть лучшим выбором для легкого хоста docker
. Изображения Alpine LXC
и docker
составляют всего 5 мб (против 27 мб для boot2docker
)
Я использую haveged
в Alpine для гостей LXC
и гостей Debian для docker
. Он дает достаточно энтропии для генерации ключей gpg
/ssh
и сертификатов openssl
в контейнерах. Теперь у Alpine есть официальное репо docker
.
Альтернативно создайте пакет haveged
для Tiny Core - существует система сборки пакетов.
Ответ 5
Другой вариант - установить пакет rng-tools и сопоставить его с использованием /dev/urandom
yum install rng-tools
rngd -r /dev/urandom
С этим мне не нужно было отображать любой том в контейнере докера.
Ответ 6
если у вас есть эта проблема в док-контейнере, созданном из собственного образа, который запускает приложение Java (например, созданный FROM tomcat:alpine
) и не имеет доступа к хосту (например, в управляемом кластере k8s), вы можете добавить следующая команда в ваш dockerfile для использования неблокирующего 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
два выражения регулярных выражений заменяют file: /dev/random
на file: /dev/urandom
и NativePRNGBlocking
NativePRNG
в файле $JAVA_HOME/lib/security/java.security
который заставляет tomcat $JAVA_HOME/lib/security/java.security
достаточно быстро. я не проверял, работает ли это также на не-альпийских изображениях openjdk, но если команда sed
не работает, просто проверьте расположение файла java.security
внутри контейнера и соответствующим образом java.security
путь.
примечание: в jdk11 путь был изменен на $JAVA_HOME/conf/security/java.security