ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: "Alexey V. Vissarionov" <gremlin@altlinux.org>
To: ALT Linux Team development discussions <devel@lists.altlinux.org>
Subject: Re: [devel] rngd vs haveged vs crng (khwrngd)
Date: Tue, 3 Sep 2019 02:59:13 +0300
Message-ID: <20190902235913.GO12903@altlinux.org> (raw)
In-Reply-To: <7e2bba2a-867f-b8a0-6e27-1a07521e13fb@gmail.com>

On 2019-09-03 00:31:05 +0300, Leonid Krivoshein wrote:

 >>>>> systemd, равно как и ядро, не решают проблему наполнения
 >>>>> пула качественной энтропией на ранней стадии загрузки
 >>>> Что любопытно, ядро эту задачу прекрасно решает. Особенно
 >>>> если его об этом грамотно попросить.
 >>> Если имеется ввиду |rng_core.default_quality=1000| , это тоже
 >>> не совсем доверенный источник,
 >> Нет - я про дисковые и сетевые контроллеры.
 >> Для первых существует специальная функция add_disk_randomness(),
 >> а вторые вызывают срабатывание add_interrupt_randomness() через
 >> handle_irq_event_percpu()

(1)

 >>> да и про |CONFIG_RANDOM_TRUST_CPU=y| некоторые скажут, что
 >>> эту хрень не надо никогда использовать.
 >> Использовать ее можно, но при соблюдении двух простых условий:
 >> 1. должны быть и другие источники энтропии;
 > Вот их нет. Совсем!

См. (1) - они есть всегда, просто особо одуренные явно отказываются
их использовать.

 >> 2. к моменту начала использования недоверенного RNG пул должен
 >> быть заполнен данными из других источников.
 > Вот он ещё не заполнен. Почти... а уже надо!

Если почти, то можно и недоверенный источник подмешивать.

 >> И хорошо бы, чтобы продолжал хотя бы чучуть пополняться из них.
 >> После этого можно хоть cat /dev/zero > /dev/random запускать -
 >> на качество энтропии это уже не повлияет :-)
 > Энтропия -- это не продукт алгоритмов криптостойкого
 > хэширования с начальным состоянием, это "совершенно случайные
 > нули и единицы".

Вообще-то энтропия - это просто мера неопределенности. Численно
определяется как двоичный логарифм от количества состояний системы
(в дебри определений от Шеннона, Рени и Хайзенберга не полезу).

 > Но вывод /dev/random и getrandom(), как я сейчас понимаю,
 > это не чистая энтропия, а всё же переработанная,

Перемешивание и отбеливание. Еще недавно использовали SHA2, щас
зачем-то поменяли хеш на Poly1305.

 > хотяи с заданными пороговыми значениями, чтобы число бит на
 > выходе не было меньше реальной энтропии на входе.

Дядя, ты как сам-то? Если не меньше - значит, строго равно (ибо
больше оно не может быть по определению), но после отбеливания
оно может быть только строго меньше.

А вот обеспечить некоторое заданное наперед качество ("не хуже")
уже реально. И пороговые значения определяют именно это качество
случайных данных на выходе генератора.

 > Если же такое качество не требуется, достаточно брать случайные
 > числа из /dev/urandom,

Я бы сказал, что /dev/urandom следует использовать почти для всего.
Единственное разумное исключение, где нужен /dev/random - генерация
ключевых пар для алгоритмов с открытым ключом.

 > только вот с недавних пор лишь после инициализации начального
 > состояния.

Оно всегда так было. Только время загрузки ядра было таким, что
одних только IRQ14 и IRQ15 (а то и IRQ6) хватало на полноценный
/dev/random (а ведь еще были IRQ1 и всякие IRQ10 с IRQ11).

Вот интересно: кто из тутошних читателей сможет назвать все
устройства, генерирующие перечисленные мной прерывания (кроме
двух последних), не пользуясь справочными материалами? :-)

 >>>>> остаётся два варианта: использовать дополнительный
 >>>>> аппаратный (доверенный) источник
 >>>> Разве что на компутерах, где живет какой-нибудь CA... для
 >>>> всего остального хватает грамотно собранного ядра (которое
 >>>> накапливает энтропию начиная уже где-то с третьей секунды
 >>>> работы и к запуску init успевает наполнить пул).
 >>> Так в том и проблема, что есть железо, где не успевает.
 >> Полностью детерминированное железо? Где? Хочу!
 >> Продам - стану миллиардером.
 > Один такой ТОНК отправлен в Обнинск.

Видел я эти ваши тонки... нихренасеньки они не детерминированные,
обычная писюшатина.

 > Вообще подверженное проблеме железо периодически всплывает.
 > Можем завести тему в ответ на данный запрос -- список с
 > наименованиями конкретных железок будет полезен многим.

Сильно подозреваю, что источник проблемы - в явном отказе от
использования доверенных и проверенных (десятилетиями!) источников
случайных данных.

 >>> Только о нём спич. И здесь речь о случайных числах для запуска
 >>> самого systemd, который может стартануть и быстрее, чем через
 >>> три секунды.
 >> Он при всем желании не может стартануть раньше, чем ядро скажет
 >> run_init_process("/sbin/init");
 > Процессы инициализации ядра и запуска /sbin/init асинхронны.

Они могут быть сколько угодно асинхронными, но run_init_process()
ядро выполнит никак не раньше, чем mount_block_root()

 > Единственное, что делается ДО -- инициализация devtmpfs.

Вроде бы достаточно очевидно, что devtmpfs_mount() выполняется до
run_init_process(), но после mount_block_root()

 > К моменту запуска /sbin/init может быть даже не загружено ещё
 > никаких модулей.

И это очень плохо. Потому что очень многие из них используют как
минимум один способ (из четырех возможных) помочь ядерному ГСЧ
набрать энтропию перед run_init_process()

 > Процесс асинхронной инициализации хорошо виден в dmesg и
 > journalctl. У нас, правда, тут не systemd сейчас стартует, а
 > другой /sbin/init. Но надо понимать, что прохождение stage1
 > зависит от железа и конфигурации системы.

Что ты в данном случае называешь stage1?

 > К моменту stage2, где в качестве /sbin/init будет уже systemd,
 > загрузка модулей продолжится, службы же начнут запускаться
 > по-новой.

Пофигу: все это - уже работа процессов в userspace.

 >> А к этому времени пул энтропии уже должен быть хотя бы не
 >> пустым. И достигается это (внезапно!) грамотной настройкой
 >> ядра.
 > Осталось лишь огласить способ "грамотной настройки".

Такой, чтобы источники энтропии запускались до run_init_process()

 >>>>> ЛИБО ослаблять энтропию программными демонами типа
 >>>>> rngd/haveged/etc.
 >>>> А вот эту срань вообще использовать нельзя. Нигде и никогда.
 >> Здесь, насколько я понимаю, возражений нет?
 > А что делать тем, кому "аппаратный" вариант недоступен?

Чаво?! Дисковый контроллер недоступен? Или сетевой адаптер?

 > Блокировку на этапе загрузки можно рассматривать не только как
 > баг юзабилити. В ряде задач это тоже CVE, вплоть до DoS для
 > всего HA-кластера. В конце концов, подкопив энтропии, можно
 > обновить состояние инициализации CRNG.

Да: низкоэнтропийная криптография - это уязвимость. Исправлять ее
будем, или как обычно?

 > А терпеть тормоза при загрузке можно далеко не во всех сценариях.

При вводе системы в промышленную эксплуатацию сервер должен быть
запущен позавчера.


-- 
Alexey V. Vissarionov
gremlin ПРИ altlinux ТЧК org; +vii-cmiii-ccxxix-lxxix-xlii
GPG: 0D92F19E1C0DC36E27F61A29CD17E2B43D879005 @ hkp://keys.gnupg.net


  parent reply	other threads:[~2019-09-02 23:59 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-25 10:29 [devel] rngd vs haveged vs crng Konstantin Lepikhov
2019-04-25 19:17 ` Andrey Savchenko
2019-04-25 19:21   ` Denis Medvedev
2019-04-25 19:26     ` Michael Shigorin
2019-04-26  0:01       ` Leonid Krivoshein
2019-04-26  0:19         ` Leonid Krivoshein
2019-04-26  4:43         ` Anton Farygin
2019-04-26  0:51         ` Leonid Krivoshein
2019-04-26 12:45       ` Mikhail Efremov
2019-04-26 22:46       ` Alexey V. Vissarionov
2019-04-27  4:17         ` Denis Medvedev
2019-04-27  5:37           ` Ivan A. Melnikov
2019-05-22 23:08 ` Alexey Shabalin
2019-05-23  4:37   ` Anton Farygin
2019-05-27 11:59   ` Michael Shigorin
2019-05-27 14:18     ` Anton Farygin
2019-05-28  0:08       ` Leonid Krivoshein
2019-05-27 23:53     ` Leonid Krivoshein
2019-05-28  5:08       ` Anton Farygin
2019-05-28  8:57       ` Alexey V. Vissarionov
2019-05-28 10:51         ` Anton Farygin
2019-05-29  8:44           ` Anton Gorlov
2019-05-29  8:46           ` Anton Gorlov
2019-05-29 10:52             ` Anton Farygin
2019-05-30  1:11               ` [devel] rngd vs haveged vs crng (khwrngd) Vitaly Chikunov
2019-05-30  4:39                 ` Anton Farygin
2019-05-30  5:16                   ` Anton Farygin
2019-05-30 16:40                     ` Alexey V. Vissarionov
2019-05-30 16:51                       ` Anton Farygin
2019-05-30 17:20                         ` Alexey V. Vissarionov
2019-05-31 10:51                         ` Andrey Savchenko
2019-05-31  6:50                       ` Anton Farygin
2019-05-31 10:56                         ` Alexey V. Vissarionov
2019-05-31 16:58                           ` Anton Farygin
2019-08-30 23:06                             ` Alexey Shabalin
2019-08-31  6:36                               ` Leonid Krivoshein
2019-08-31 12:35                                 ` Alexey V. Vissarionov
2019-08-31 14:47                                   ` Leonid Krivoshein
2019-08-31 15:42                                     ` Alexey V. Vissarionov
2019-09-02 21:31                                       ` Leonid Krivoshein
2019-09-02 22:25                                         ` Paul Wolneykien
2019-09-03  5:58                                           ` Alexey V. Vissarionov
2019-09-03  6:02                                             ` Anton Farygin
2019-09-03  8:49                                               ` Paul Wolneykien
2019-09-03 19:52                                                 ` Leonid Krivoshein
2019-09-03 20:01                                                   ` Andrey Savchenko
2019-09-03 20:56                                                     ` Leonid Krivoshein
2019-09-04  2:22                                                       ` Alexey V. Vissarionov
2019-09-03 23:31                                                   ` Paul Wolneykien
2019-09-03  8:49                                             ` Paul Wolneykien
2019-09-03  9:54                                               ` Alexey V. Vissarionov
2019-09-03 10:01                                                 ` Paul Wolneykien
2019-09-03 10:29                                                   ` Alexey V. Vissarionov
2019-09-03 10:35                                                     ` Paul Wolneykien
2019-09-03 10:38                                                       ` Alexey V. Vissarionov
2019-09-03 10:46                                                         ` Michael Shigorin
2019-09-03  7:02                                           ` Leonid Krivoshein
2019-09-03  8:49                                             ` Paul Wolneykien
2019-09-03 19:46                                               ` Leonid Krivoshein
2019-09-03 23:33                                                 ` Paul Wolneykien
2019-09-04  3:36                                                   ` Leonid Krivoshein
2019-09-20 10:47                                               ` Sergey Bolshakov
2019-09-20 12:23                                                 ` Alexey V. Vissarionov
2019-09-21  0:33                                                     ` Leonid Krivoshein
2019-09-03  7:28                                           ` Aleksei Nikiforov
2019-09-03  8:25                                             ` Alexey V. Vissarionov
2019-09-02 23:59                                         ` Alexey V. Vissarionov [this message]
2019-09-03  7:37                                           ` Leonid Krivoshein
2019-09-03 10:12                                             ` Alexey V. Vissarionov
2019-09-03 20:51                                               ` Leonid Krivoshein
2019-08-31  7:30                               ` Anton Farygin
2019-05-31 14:12               ` [devel] rngd vs haveged vs crng Anton Gorlov
2019-05-31 14:12               ` Anton Gorlov
2019-05-30 17:54           ` Alexey V. Vissarionov
2019-05-31  5:08             ` Anton Farygin
2019-05-31 11:01               ` Alexey V. Vissarionov
2019-05-31 17:01                 ` Anton Farygin
2019-05-28  0:53   ` Leonid Krivoshein
2019-09-17 20:08     ` Nikolai Kostrigin
2019-09-17 21:51       ` Alexey V. Vissarionov
2019-09-17 23:29         ` Leonid Krivoshein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190902235913.GO12903@altlinux.org \
    --to=gremlin@altlinux.org \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git