Ошибка LUKS во время загрузки

alg: drbg: could not allocate DRNG handle for ...

Я вижу эту ошибку только на консоли во время процесса загрузки виртуальных машин, которые мы создаем. РЕДАКТИРОВАТЬ: 2/5/16 - я вижу это на некоторых голых металлических установок, тоже. (Он полностью загружается.) Я предполагаю, что это как-то связано с виртуализированным оборудованием и отсутствием (совместимого) генератора случайных чисел. Проблема в том, что я не могу оценить серьезность. Скомпрометирована ли сила шифрования? (Должен ли я вообще заботиться об этой ошибке?) Как я могу ее исправить?

Мы используем QEMU/KVM под CentOS 6.7. Я могу сделать virsh dumpxml примера системы, если вы действительно думаете, что это поможет. Мы используем Anaconda по умолчанию размер шифра / ключа. (AES-XTS-plain64/512)

Это самая ранняя ссылка, которую я нашел в списке рассылки linux-crypto. К сожалению, это немного над моей головой.

http://www.mail-archive.com/linux-crypto%40vger.kernel.org/msg10398.html

2 ответа

Решение

Как я могу это исправить?

В базе знаний Red Hat вы должны добавить модуль ядра "ctr" в свой initrd. В их инструкциях также написано, что они должны включать 'ecb', хотя кажется, что проблема в том, что модуль 'ctr' не загружается.

dracut -f -v --add-drivers "ctr ecb"

Абоненты могут видеть полную информацию. Я не уверен, что мне разрешено переиздавать остальное здесь, поэтому я перефразировал полное решение.

https://access.redhat.com/solutions/2249181

Изменить 29.09.2016:

Вы также можете добавить эти драйверы в /etc/dracut.conf так что они добавляются в новые initramfs при обновлении ядра. В противном случае ваши симптомы загадочным образом появятся много месяцев спустя.;)

add_drivers+="ctr ecb"

Я не думаю, что это влияет на силу вашего шифрования.

Я проверил исходный код и пока я правильно интерпретирую то, что вам нужно, вам не обязательно беспокоиться об этом.

Этот код принадлежит модулю 'stdrng'. По крайней мере, в Fedora 23 это встроено в ядро, а не экспортируется как модуль ядра.

Когда stdrng инициализируется в первый раз, происходят следующие вызовы.

В crypto / drbg.c инициализация начинается здесь.

1997 module_init(drbg_init);

Это регистрирует все drbgs, известные системе.

1985         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1986                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
1987         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1988                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);

Затем он передает его вспомогательной функции, которая выполняет инициализацию:

1989         return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));

В crypto/rng.c это просто перебирает каждый рнг, чтобы зарегистрировать его..

210         for (i = 0; i < count; i++) {
211                 ret = crypto_register_rng(algs + i);
212                 if (ret)
213                         goto err;
214         }

Эта функция выполняет несколько шагов инициализации, а затем вызывает другую функцию для выделения.

196         return crypto_register_alg(base);

Что не так очевидно, так это то, что происходит во время регистрации.

Другой модуль называется tcrypt Также встроенный в ядро ​​получает уведомления о новых алгоритмах вставки. Как только он видит новый зарегистрированный алгоритм, он планирует его тестирование. Это то, что производит вывод, который вы видите на своем экране.

Когда тест завершен, алгоритм переходит в состояние TESTED. Если тест не пройден, я думаю (я не смог найти бит, который вызывает такое поведение), он не может быть выбран для поиска, если вы передадите правильные флаги.

Проходят ли тесты, определенно хранится внутри.

В дополнение к этому, вызов генератора псевдослучайных чисел приводит к тому, что список алгоритмов будет повторяться из prngs в порядке силы, как указано в этой заметке в crypto/drbg.c

107 /*
108  * The order of the DRBG definitions here matter: every DRBG is registered
109  * as stdrng. Each DRBG receives an increasing cra_priority values the later
110  * they are defined in this array (see drbg_fill_array).
111  *

Поскольку самый сильный не терпит неудачу (hmac sha256), маловероятно, что вы используете неудачные, даже если они могут быть выбраны.

Обобщить -

  • Это происходит, когда stdrng Модуль требуется для чего-то.
  • Он загружает все свои известные алгоритмы.
  • Все загруженные алгоритмы проходят проверку. Некоторые могут потерпеть неудачу (почему не рассматривается в этом ответе).
  • Тестовые ошибочные алгоритмы не должны быть доступны для выбора позже.
  • PRNGS упорядочены по силе, и сильные PRNGS, которые действительно проходят, пробуются первыми.
  • Вещи, которые полагаются на stdrng надеюсь, не следует использовать эти алгоритмы в качестве основы для своего источника PRNG.

Вы можете увидеть, какие алгоритмы прошли успешно и прошли тесты, используя следующую команду:

 grep -EC5 'selftest.*passed' /proc/crypto

Вы также можете увидеть приоритет выбора в поле "приоритет". Чем выше значение, тем сильнее PRNG, по словам автора модуля.

Итак, я рад, что ошибаюсь, поскольку я не считаю себя программистом ядра, но в заключение -

когда stdrng загружает его, как представляется, для выбора других алгоритмов из списка допустимых алгоритмов, которые считаются более сильными, чем неисправные, плюс неисправные, скорее всего, не будут выбраны.

Таким образом, я считаю, что это не дополнительный риск для вас при использовании люков.

Другие вопросы по тегам