[devel] rngd vs haveged vs crng (khwrngd)
Alexey V. Vissarionov
gremlin на altlinux.org
Вт Сен 3 13:12:17 MSK 2019
On 2019-09-03 10:37:07 +0300, Leonid Krivoshein wrote:
>>> Единственное, что делается ДО -- инициализация devtmpfs.
>> Вроде бы достаточно очевидно, что devtmpfs_mount() выполняется
>> до run_init_process(), но после mount_block_root()
> Инициализация экземпляра файловой системы внутри ядра
> и монтирование её в userspace -- две разные вещи.
А можно ссылочки в виде имен файлов и названий функций? Мало ли,
вдруг в ядре что-то кардинально поменялось, а я это пропустил...
> Монтирование /dev в userspace инициируется процессом с PID 1
Да ну?
/*
* If configured, or requested by the commandline, devtmpfs will be
* auto-mounted after the kernel mounted the root filesystem.
*/
int devtmpfs_mount(const char *mntdir)
{
int err;
if (!mount_dev)
return 0;
if (!thread)
return 0;
err = ksys_mount("devtmpfs", mntdir, "devtmpfs", MS_SILENT, NULL);
if (err)
printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
else
printk(KERN_INFO "devtmpfs: mounted\n");
return err;
}
Это drivers/base/devtmpfs.c
> уже после того, как ядро проинициализировало initramfs, devtpmfs,
> нашло и запустило /sbin/init.
Не... корень смонтирован, devtmpfs смонтирован - а /sbin/init еще не
запущен.
Удивительно, правда? :-)
> Никаких устройств на этом этапе ещё нет, ramfs/tpmfs в ядро
> вкомпилируются.
> Даже если не указывать путь к собственному initramfs, оно тоже в
> ядре имеется всегда. Пустое, без /sbin/init,
Да - init/noinitramfs.c
> чтобы отработал твой любимый fallback с /dev/md0.
Тут либо слово fallback не к месту, либо мысль куда-то ускользнула.
>>> К моменту запуска /sbin/init может быть даже не загружено ещё
>>> никаких модулей.
>> И это очень плохо. Потому что очень многие из них используют
>> как минимум один способ (из четырех возможных) помочь ядерному
>> ГСЧ набрать энтропию перед run_init_process()
> К счастью, в initramfs у нас не systemd, иначе с проблемой мы
> сталкивались бы раньше и на большем охвате железа. systemd только
> так генерирует UUID'ы для сервисов, множество временных файлов,
> использует внутренние хэш-таблицы и случайные числа для
> всевозможных "сетевых" нужд. Так что плохо, да, но может быть ещё
> хуже. Полагаю, тем, у кого нет systemd, эта проблема неведома.
Да какая разница? Запустили init - появились процессы в userspace,
которым нужен ГСЧ.
> На SysV-init вероятность запуска сервиса, требующего CRNG, примерно
> равна нулю.
В этом тысячелетии я компутеров без SSH уже не видел.
>>> Процесс асинхронной инициализации хорошо виден в dmesg и
>>> journalctl. У нас, правда, тут не systemd сейчас стартует, а
>>> другой /sbin/init. Но надо понимать, что прохождение stage1
>>> зависит от железа и конфигурации системы.
>> Что ты в данном случае называешь stage1?
> initrafms (initrd) -- первая стадия загрузки.
Пофигу - это уже userspace.
>>> Блокировку на этапе загрузки можно рассматривать не только
>>> как баг юзабилити. В ряде задач это тоже CVE, вплоть до DoS
>>> для всего HA-кластера. В конце концов, подкопив энтропии,
>>> можно обновить состояние инициализации CRNG.
>> Да: низкоэнтропийная криптография - это уязвимость. Исправлять
>> ее будем, или как обычно?
Это отнюдь не риторический вопрос.
>>> А терпеть тормоза при загрузке можно далеко не во всех
>>> сценариях.
>> При вводе системы в промышленную эксплуатацию сервер должен
>> быть запущен позавчера.
Здесь, насколько я понимаю, возражений нет?
--
Alexey V. Vissarionov
gremlin ПРИ altlinux ТЧК org; +vii-cmiii-ccxxix-lxxix-xlii
GPG: 0D92F19E1C0DC36E27F61A29CD17E2B43D879005 @ hkp://keys.gnupg.net
Подробная информация о списке рассылки Devel